MS-Redis-高级特性(主从+事务+发布订阅)

2019-01-10  本文已影响3人  Captain_tu
  1. 主从复制

    • 主从复制方法
      只需要在redis.conf中,添加 slaveof 127.0.0.1 6379即可成为127.0.0.1:6379的从库

    • 主从复制的过程

      1. 当配置好slave后,slave与master建立连接,然后发送sync命令。
      2. 无论是第一次连接还是重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
      3. 后台进程完成写文件后,master就发送文件给slave,slave把文件保存到硬盘上,再加载到内存中。
      4. 接着master把缓存的写命令转发给slave,后续再把收到的写命令发送给slave。
      5. 如果同时有多个slave发来同步连接命令,master只会启动一个进程来写数据库镜像,并发送给所有的slave。
    • 主从复制的特点

      1. master可以有多个slave
      2. 多个slave可以连接到同一个master外,还可以连接到其他的slave。
      3. 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求。
      4. 提高系统的伸缩性。
  2. 事务

    • 事务特性

      1. 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
      2. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
    • 用法
      MULTI 命令用于开启一个事务,它总是返回 OK
      MULTI 执行之后, 客户端可以继续向服务器发送任意多条命令, 这些命令不会立即被执行, 而是被放到一个队列中。
      EXEC命令被调用时, 所有队列中的命令才会被执行。
      当执行 DISCARD 命令时, 事务会被放弃, 事务队列会被清空, 并且客户端会从事务状态中退出

    • 事务中的错误
      执行之前:从 Redis 2.6.5 开始,服务器会对命令入队失败(比如语法错误,内存不足等)的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务。
      执行之后:至于那些在 EXEC 命令执行之后所产生的错误, 并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。

    • 乐观锁Wach
      WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为(乐观锁)。

      # 客户端1
      multi
      set name aaa
      # 客户端2
      set name bbb
      get name # bbb
      # 客户端1
      exec  # ok, 说明事务执行成功
      get name # bbb,事务成功了,但是获取到的name却不是想要的结果
      

      使用Watch防止这种情况发生

      # 客户端1
      watch name
      multi
      set name aaa
      # 客户端2
      set name bbb
      get name # bbb
      # 客户端1
      exec # nil 由于watch的name被别的客户端修改,因此事务执行失败
      

      WATCH 使得 EXEC 命令需要有条件地执行: 事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行。

  3. 发布订阅(PUB/SUB)(消息队列)
    发布订阅是一种消息通信模式,类似于设计模式中的观察者模式。主要可以解决发布者和订阅者之间的耦合关系(二者之间没有代码级别,物理级别的依赖关系)。

    可以通过publish发布消息,通过subscribe或者psubscribe方式订阅消息

     # 客户端1
     subscribe tv1
     # 客户端2
     subscribe tv1 tv2
     #客户端3
     publish tv1 tv1-message1
     publish tv2 tv2-meesage1
    
     # 此时客户端1收到 tv1-message1
     # 此时客户端2收到 tv1-message1 tv2-message1
    
     # 客户端4
     psubscribe tv*  #订阅所有tv开头的频道        
上一篇下一篇

猜你喜欢

热点阅读