美文网首页
MS-Redis-高级特性(主从+事务+发布订阅)

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

作者: Captain_tu | 来源:发表于2019-01-10 18:52 被阅读3次
    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开头的频道        

    相关文章

      网友评论

          本文标题:MS-Redis-高级特性(主从+事务+发布订阅)

          本文链接:https://www.haomeiwen.com/subject/snjarqtx.html