Redis 4.x系列(十):Redis Pub/Sub(发布/订阅)

  Publish/Subscribe(Pub/Sub-发布/订阅)是两种异步消息通信模式中的一种(另一种是 queue 点对点模式)。在发布-订阅模式中,发布者把消息发送到一个频道(channel),订阅此频道的消息接收者就可收到消息。

  发布-订阅是一对多的通信模式,发布的消息可以被多个订阅者接收,消息发布者不需要知道有那些订阅者,订阅者也不需要知道发布者,订阅者只接收(订阅)自己感兴趣的频道, 类似于调频广播。

  应用场景:群发消息、通知多系统更新缓存(数据)、推送关注频道(主题)消息等。未在生产中使用过,可靠性、稳定性未知。

  个人认为 Redis 中的这个功能是个鸡肋,还没看到在生产中使用,消息中间件发布-订阅功能更强大可靠。

发布-订阅

Redis 的发布订阅模式由SUBSCRIBE(订阅)、UNSUBSCRIBE(取消订阅)、PUBLISH(发布)三个命令来实现,也实现了发布-订阅消息范式。

  • 发布:消息生产者发送消息到代理,相当于一个事件。
  • 订阅:订阅(接收)关注的渠道(主题),是一个持续监听渠道的过程。

发布-订阅消息格式:

  1. PUBLISH命令发布消息,命令后面跟的是渠道名(channel)和消息内容(message)。返回的整数是指订阅该渠道的客户端数。

    publish channel message

  2. SUBSCRIBE命令订阅消息,命令后面跟的是渠道名(channel)。

    subscribe fruit [channel ...]

  3. UNSUBSCRIBE命令取消订阅

    unsubscribe [channel [channel ...]]

发布-订阅KEY所在的空间没有关系,也就是发布在 db10 的渠道消息,db0 的订阅同样可以接收。如果需要区分某些渠道,可以在渠道名称前加上所在环境变量的名称(如:dev,test,pro)

Redis 的 Pub-Sub(主题订阅模式)可实现 1:N的消息队列,但有个缺点是当消费者下线的情况下,生产的消息会丢失,得使用专业的消息中间件,如 RabbitMq 等。

redis-cli 客户端在订阅模式下无法接收任何其它命令直到使用Ctrl-C退出该模式。

使用示例

常规发布/订阅

  1. 客户端A → 订阅 fruit 和 food 两个渠道
    1
    2
    3
    4
    5
    6
    7
    8
    127.0.0.1:6379> subscribe fruit food
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "fruit"
    3) (integer) 1
    1) "subscribe"
    2) "food"
    3) (integer) 2
  2. 客户端B → 发布水果到 fruit 渠道
    1
    2
    127.0.0.1:6379> publish fruit apple
    (integer) 1
  3. 客户端A收到消息:
    1
    2
    3
    1) "message"
    2) "fruit"
    3) "apple"

模式匹配订阅

Redis Pub/Sub 支持模式匹配。 客户端可以订阅与渠道名称与模式匹配的全局消息,模式匹配支持多个通配符。

  1. 匹配订阅:psubscribe pattern [pattern ...]
    1
    2
    3
    4
    5
    127.0.0.1:6379> psubscribe news.*
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "news.*"
    3) (integer) 1
  2. 发布消息:publish channel message
    1
    2
    3
    4
    127.0.0.1:6379> publish news.sport '2018-2019 NBA Start'
    (integer) 1
    127.0.0.1:6379> publish news.art 'Shenzhen 40th Light Show'
    (integer) 1
  3. 客户端收到的消息
    1
    2
    3
    4
    5
    6
    7
    8
    1) "pmessage"
    2) "news.*"
    3) "news.sport"
    4) "2018-2019 NBA Start"
    1) "pmessage"
    2) "news.*"
    3) "news.art"
    4) "Shenzhen 40th Light Show'

Web 聊天应用案例

一个多用户高性能的 Web 聊天案例,官方指示的案例在 GitHub 的链接尽然无效了。

Redis 4.x系列(十):Redis Pub/Sub(发布/订阅)

http://blog.gxitsky.com/2018/10/18/Redis-10-publish-subscribe/

作者

光星

发布于

2018-10-18

更新于

2022-08-14

许可协议

评论