• redis发布订阅模式详解


    写在前面

    Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

    Redis 客户端可以订阅任意数量的频道。

    下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
    在这里插入图片描述
    当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
    在这里插入图片描述

    发布订阅的使用

    SUBSCRIBE命令

    监听发布到给定通道的消息。

    基本语法:

    SUBSCRIBE channel [channel ...]
    
    • 1

    可以同时监听多个channel通道。

    基本用法:

    # 开启监听channeltest
    127.0.0.1:6379> subscribe channeltest
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "channeltest"
    3) (integer) 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    PUBLISH命令

    将消息发布到一个通道。

    基本语法:

    PUBLISH channel message
    
    • 1

    基本用法:

    # 新起一个客户端,往channeltest发送指定的消息
    127.0.0.1:6379> publish channeltest 'i am message'
    (integer) 1
    
    • 1
    • 2
    • 3

    此时,我们在刚开始的客户端,会受到发送过来的订阅消息:

    127.0.0.1:6379> subscribe channeltest
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "channeltest"
    3) (integer) 1
    1) "message"
    2) "channeltest"
    3) "i am message"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意发布、订阅客户端启动顺序!

    当先启动订阅客户端,再启动发布客户端,然后发布客户端发布的消息,订阅客户端会正常受到。
    但是!当先启动发布客户端,然后发布客户端发布的消息,再启动订阅客户端,订阅客户端是不会受到消息的!此时消息会丢失。

    # 订阅客户端还未订阅时,直接发送消息,此时返回值是0,消息并没有被消费也不会被保存!
    127.0.0.1:6379> publish channeltest 'i am message'
    (integer) 0
    
    • 1
    • 2
    • 3

    PUBSUB命令

    检查发布/订阅子系统的状态。

    基本语法:

    PUBSUB subcommand [argument [argument ...]]
    
    • 1

    基本用法:

    # 显示所有的订阅通道
    127.0.0.1:6379> pubsub channels
    1) "channeltest"
    # 显示所有cc开头的订阅通道
    127.0.0.1:6379> pubsub channels cc*
    (empty list or set)
    # 显示所有ch开头的订阅通道
    127.0.0.1:6379> pubsub channels ch*
    1) "channeltest"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    PUNSUBSCRIBE命令

    停止监听发布到匹配给定模式的通道的消息。

    基本语法:

    PUNSUBSCRIBE [pattern [pattern ...]]
    
    • 1

    基本用法:

    # 停止订阅channeltest通道
    127.0.0.1:6379> punsubscribe channeltest
    
    • 1
    • 2

    注意:客户端订阅时,是无法进行操作的,此命令在命令行中是不能用的

    UNSUBSCRIBE命令

    退订给定的频道。

    基本语法:

    UNSUBSCRIBE [channel [channel ...]]
    
    • 1

    基本用法:

    # 退订
    127.0.0.1:6379> unsubscribe channeltest
    
    • 1
    • 2

    注意:客户端订阅时,是无法进行操作的,此命令在命令行中是不能用的

    PSUBSCRIBE命令

    监听发布到匹配给定模式的通道的消息。

    基本语法:

    PSUBSCRIBE pattern [pattern ...]
    
    • 1

    基本用法:

    # 监听chann开头的所有通道
    127.0.0.1:6379> psubscribe chann*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "chann*"
    3) (integer) 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    总结

    redis的发布订阅功能,很多小伙伴都会用来做消息队列使用。
    但是该功能风险太大,很容易造成消息丢失,所以并不建议做消息队列使用。

    怎么说呢,redis的发布订阅功能,因为其消息丢失风险,所以大大减少了其使用场景,所以具体场景具体使用吧。

  • 相关阅读:
    利用python工具提取多个word中的图片和表格
    免费SSL证书申请及部署实践
    Linux网络编程9——UDP 和 本地/网络套接字
    正向代理和反向代理快速理解
    Vue框架-02-数据和事件
    通往优秀软件架构师之路:掌握技术核心,修炼基础原理【文中送书,十本任选】
    无哨兵位单向非循环链表
    【分布式系统】面向结构化数据的分布式存储
    [附源码]java毕业设计基于ssm的电子网上商城
    络达开发----如何开启AGC功能
  • 原文地址:https://blog.csdn.net/A_art_xiang/article/details/126786205