一、Redis的事务

  1.是什么

    可以一次执行多个命令,本质是一组命令的集合。一个事务中的
    所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

    (更多请参见官网事务介绍)

  2.能干什么

    一个队列中,一次性、顺序性、排他性的执行一系列命令

  3.怎么干

    摘取官网:

  常用如下:

    开启一个事务:(MULTI)

    添加若干命令加入队列,执行事务(EXEC)

    添加操作后不想执行,放弃事务(DISCARD)

    一个出错,全体受罚,连坐(一个出错,其它事务内操作均不成功)

    谁的命令加入队列时正常执行时报错,则冤头债主,只找它(这里k1的v1不是Integer不能增加)

  //和上一个的区别就是这个是加入队列时成功,执行时出错,而上一个加入队列时就出错了

  所以说,Redis对事务的支持,是部分支持

  watch监控

    悲观锁/乐观锁/CAS(Check And Set)

      悲观锁(会有点像行锁和表锁)

 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

      乐观锁(一般用乐观锁,还是乐观点好)

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号(在记录后加一个版本号,通过版本号来判断是否进行了修改)等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,

      CAS

  redis中使用 check-and-set 操作实现乐观锁

    模拟场景:模拟信用卡消费,可用额度:balance,当前欠款:debt

 

    无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内(如果监控的变量在其它事务地方发生了变化,将会报错)

    有加塞篡改,监控了key,如果key被修改了,后面一个事务的执行失效(以前一个事务执行结果为准)

    UNWATCH(WATCH之后的设值是模拟其它终端进行了修改,实际操作中可用通过boolean等变量来控制,当有人修改时,放弃监控,再获取最新的进行监控修改,直到没有人修改,再开始监控,开启事务)——此命令是取消监控所有key

    一旦执行了exec之前加的监控锁都会被取消掉了,不管成功失败,本次操作就清了(操作结束)

  小结:

   Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。

   通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败

    4.事务三阶段

      开启:以MULTI开始一个事务

      入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

      执行:由EXEC命令触发事务

    5.事务三特性

      单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

      没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。

      不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

 二、Redis的发布和订阅

  1.是什么

    (兼职做一下发布,实际还是做分布式缓存的)

  进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

  2.实例:

    先订阅后发布后才能收到消息,
      1 可以一次性订阅多个,SUBSCRIBE c1 c2 c3

      2 消息发布,PUBLISH c2 hello-redis
      ===========================================================================================================
      3 订阅多个,通配符*, PSUBSCRIBE new*
      4 收取消息, PUBLISH new1 redis2015

  左边发布,右边获取:

 三、主从复制

  1.是什么   

    行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

  2.能干什么

    读写分离  容灾恢复

  3.怎么干

    配从(库)不配主(库)

    从库配置:slaveof 主库IP 主库端口

      每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件

      info replication

    开始实验

      拷贝多个redis.conf文件(用于模拟多台机器)

      开启daemonize yes

      pid文件名字

      指定端口

      log文件名字

      dump.rdb名字

    

    常用3招:其实已经是过时,后面将会由哨兵模式更先进的模式取代

      一主二仆

    开启3台机器模拟如下:

    启动情况如下:

    使用  INFO replication: 查看主/从复制信息(此时还是三台主机身份)

  使用  slaveof 192.168.1.1 6379进行主从复制:(后两台使用命令后变为从机)

 注意,此时从机是可以取得k1 k2 k3的(即使从机是从k4才开始开启备份),也就是说,从机一旦接管,便从头录到尾

  此时查看主机79信息:身份是主机,后跟着两个小弟(从机),再在从机中查看主从复制信息可以看到是slave(从机状态)

    假设三台机器都执行相同的命令,思考结果:

  //结果:只有主机可以正确执行,从机将会出错。也就是从机无法覆盖主机。

    假设主机挂了,思考此时从机是代替主机上位,还是原地待命(假设由你设计,哪种方案)

  //主机关机后,从机之前备份的数据是存在的(不然,备份意义何在呢)

  可以发现还是从机身份,不过连接状态为down

   此时再把主机开启,并且进行操作

   //可以发现是可以获取到最新的值的。(主机一旦正常,一切照旧)

    假设其中一台从机挂了,另外的从机是正常运作的,而主机当然不受影响:

    再把从机启动,发现身份信息翻身为主机了

    但是其它机器在80SHUTDOWN期间的操作,80的无从获取的;原因是前面说过的,只要从机断开连接(自己挂了),就要重新和主机连接

  不然就认为是一台独立的机器而不是从机(除非写进它的配置文件)

    当然了,只要它重新和主机连接,重新作为从机,是可以正常运作的(再增量备份一份,最新的k8也有了):

      薪火相传

        1.上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,

        那么该slave作为了链条中下一个的master,可以有效减轻master的写压力。

        2.中途变更转向:会清除之前的数据,重新建立拷贝最新的

        3.slaveof 新主库IP 新主库端口

      原先是80 81挂在79上,变更为81挂80,80依旧挂79

     此时查看79主从复制信息:其下只有一个直接从机

    在第一台主机上设值,可以看到直接和间接从机都能成功获取(薪火相传是OK的)

      查看80的主从复制信息:总体而言是一个slave,但它同时连接了一个slave(包工头还是打工的,但手下还管了人)

      反客为主

    SLAVEOF no one

    使当前数据库停止与其他数据库的同步,转成主数据库

  先将上一个实验中间接从机81改回来,使环境正常:

    假设主机挂了,我们不再像第一个实验一样,傻傻的等待主机苏醒,而是从从机中选出新主机上位:SLAVEOF no one(不再为奴)

    现在主机变更为80,现在81就不傻傻的等了,跟着新主机81混了。格局变更

    现在老主机再回来,不过目前80 81已经组成新的格局,老主机再次苏醒,可惜无法入局了:

    4.复制原理

  仔细区分思考、,是增量还是全量

  1.slave启动成功连接到master后会发送一个sync命令

  2.Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步

  3.全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

  4.增量复制:Master继续将收集到的修改指令,依次发送给slave,完成同步

  5.但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

   5.哨兵模式(sentinel)

  是什么

    反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

  怎么干

    调整结构,6379带着80、81

  开始实验之前,依旧恢复原始环境(80 81都跟着79走,可以在79查看是否环境正常)

    自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错

  

      配置哨兵,填写内容

       vim sentinel进行配置

         sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1

       上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机

    

      启动哨兵

      redis-sentinel /myredis/sentinel.conf

      上述目录依照各自的实际情况配置,可能目录不同

    

    

    此时主机出现故障,哨兵开始工作:

      选出主机,更换格局:

    倘若此时老的主机回来,哨兵模式下会有何变化:

    开始启动是master,经哨兵监控调剂,成为从机!

    上述实验为监控一个master,实际:一组sentinel能同时监控多个Master

    6.复制的缺点

    复制延时

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

NoSQL入门第四天——事务与主从复制的更多相关文章

  1. TYUT程序设计入门第四讲练习题题解--数论入门

    程序设计入门第四讲练习题题解--数论入门 对于新知识点的学习,需要不断地刷题训练,才能有所收获,才能更好地消化知识点. 题组链接: 程序设计入门第四讲练习题--数论 by vjudge 题解: A. ...

  2. JavaMail入门第四篇 接收邮件

    上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操 ...

  3. Kotlin入门第四课:简单工厂模式

    Kotlin基础知识的学习,请参考之前的文章: Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次尝试用Kotlin实现Android ...

  4. NoSQL入门第五天——Java连接与整合操作

    一.测试联通 1.新建个web工程 2.导入jar:当然实际使用的时候肯定是通过maven来构建(如果有机会,可以尝试学习gradle进行构建) 3.建个测试类:好久没开eclipse了,希望后面可以 ...

  5. CTF---Web入门第四题 Forms

    Forms分值:10 来源: Ph0enix 难度:易 参与人数:4945人 Get Flag:2776人 答题人数:2824人 解题通过率:98% 似乎有人觉得PIN码是不可破解的,让我们证明他是错 ...

  6. CTF---密码学入门第四题 困在栅栏里的凯撒

    困在栅栏里的凯撒分值:10 来源: 北邮天枢战队 难度:易 参与人数:4531人 Get Flag:2124人 答题人数:2285人 解题通过率:93% 小白发现了一段很6的字符:NlEyQd{sef ...

  7. Linux零基础入门第四课

    根据直播讲义整理的内容,从第四课开始.前三课的内容若后面有精力会一并整理进来. 文件的基本操作(上) 创建.删除.复制.移动和重命名 touch命令创建文件 语法 >$ touch file0 ...

  8. 大数据入门第四天——基础部分之轻量级RPC框架的开发

    一.概述 .掌握RPC原理 .掌握nio操作 .掌握netty简单的api .掌握自定义RPC框架 主要内容 1.RPC是什么 RPC(Remote Procedure Call)—远程过程调用,它是 ...

  9. Oracle入门第四天(下)——约束

    一.概述 1.分类 表级约束主要分为以下几种: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK 2.注意事项 如果不指定约束名 ,Oracle server ...

随机推荐

  1. python UI自动化实战记录八:添加配置

    添加配置文件写入测试地址等,当环境切换时只需修改配置文件即可. 1 在项目目录下添加文件 config.ini 写入: [Domain] domain = http://test.domain.cn ...

  2. bzoj5152 [Wc2018]通道

    题目链接 正解:不会做. 写一个爬山算法就过官方数据了(逃 具体来说就是每次随机一个根,然后迭代找最长路的那个点. 多随机几次取$max$就行了.正解以后再补.. #include <bits/ ...

  3. Yii中的relations方法

    以Blog示例: 重点看注释 User类中的relations方法如下 <span style="font-size:18px;background-color: rgb(255, 2 ...

  4. 【[USACO12DEC]第一!First!】

    一个串不能成为第一的情况有两种 另外一个单词是它的前缀 在分配字母表大小关系的时候出现了矛盾的情况 第一种很好判断,一旦我们在一个单词没有匹配完之前遇到一个结束标志,那么就说明另外一个单词是它的前缀 ...

  5. C# .NET开发图形图像程序时提示"GDI+ 中发生一般性错误"

    今天突然收到一封信,说我那个极度复杂的Marshal的问题被解决了(http://www.cnblogs.com/hotcan/archive/2005/01/12/91007.html).顿时感觉好 ...

  6. 使用jmeter进行简单的压测

    安装下载 前往官网下载,[地址] 环境 需要java环境,此处略 最好对jmeter配置下环境变量,方便打开,此处略 运行 启动jmeter 进入到bin目录,输入   ./jmeter    启动 ...

  7. HDU 1249 三角形(三角形分割平面)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1249 三角形 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  8. 身份认证系统(三)什么是OAuth2

    本文准备用最简单的语言告诉大家什么是OAuth2 ,OAuth2是干什么的. 我们有一个资源服务器,资源服务器中有一系列的用户数据. 现在有一个应用想想要获取我们的用户数据. 那么最简单的方法就是我们 ...

  9. iOS 自定义任意形状加载进度条(水波纹进度条)

    1. 项目中要做类似下面的加载动画: 先给出安卓的实现方式 2.iOS的实现方式参考了下面两位的,感谢. 以任意底部图片为背景的加载动画 和 水波纹动画 最后附上自己的demo

  10. iOS 清理Xcode项目中没有使用到的图片资源和类文件

    接手到一个旧的项目,但是发现里面有太多的无用资源,包括升级app后,一些无用的图片资源并没有被删掉,导致app在打包成ipa包以后,文件变大.手边这个项目IM要更换成环信的IM,之前的一些旧的SDK, ...