Redis 4.x系列(十):Redis Pub/Sub(发布/订阅)
Publish/Subscribe(Pub/Sub-发布/订阅)是两种异步消息通信模式中的一种(另一种是 queue 点对点模式)。在发布-订阅模式中,发布者把消息发送到一个频道(channel),订阅此频道的消息接收者就可收到消息。
发布-订阅是一对多的通信模式,发布的消息可以被多个订阅者接收,消息发布者不需要知道有那些订阅者,订阅者也不需要知道发布者,订阅者只接收(订阅)自己感兴趣的频道, 类似于调频广播。
应用场景:群发消息、通知多系统更新缓存(数据)、推送关注频道(主题)消息等。未在生产中使用过,可靠性、稳定性未知。
个人认为 Redis 中的这个功能是个鸡肋,还没看到在生产中使用,消息中间件的发布-订阅功能更强大可靠。
发布-订阅
Redis 的发布订阅模式由SUBSCRIBE(订阅)、UNSUBSCRIBE(取消订阅)、PUBLISH(发布)三个命令来实现,也实现了发布-订阅消息范式。
- 发布:消息生产者发送消息到代理,相当于一个事件。
- 订阅:订阅(接收)关注的渠道(主题),是一个持续监听渠道的过程。
发布-订阅消息格式:
PUBLISH命令发布消息,命令后面跟的是渠道名(channel)和消息内容(message)。返回的整数是指订阅该渠道的客户端数。
publish channel message
SUBSCRIBE命令订阅消息,命令后面跟的是渠道名(channel)。
subscribe fruit [channel ...]
UNSUBSCRIBE命令取消订阅
unsubscribe [channel [channel ...]]
发布-订阅与KEY
所在的空间没有关系,也就是发布在 db10 的渠道消息,db0 的订阅同样可以接收。如果需要区分某些渠道,可以在渠道名称前加上所在环境变量的名称(如:dev,test,pro)
Redis 的 Pub-Sub(主题订阅模式)可实现 1:N的消息队列,但有个缺点是当消费者下线的情况下,生产的消息会丢失,得使用专业的消息中间件,如 RabbitMq 等。
redis-cli 客户端在订阅模式下无法接收任何其它命令直到使用Ctrl-C
退出该模式。
使用示例
常规发布/订阅
- 客户端A → 订阅 fruit 和 food 两个渠道
1
2
3
4
5
6
7
8127.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 - 客户端B → 发布水果到 fruit 渠道
1
2127.0.0.1:6379> publish fruit apple
(integer) 1 - 客户端A收到消息:
1
2
31) "message"
2) "fruit"
3) "apple"
模式匹配订阅
Redis Pub/Sub 支持模式匹配。 客户端可以订阅与渠道名称与模式匹配的全局消息,模式匹配支持多个通配符。
- 匹配订阅:
psubscribe pattern [pattern ...]
1
2
3
4
5127.0.0.1:6379> psubscribe news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1 - 发布消息:
publish channel message
1
2
3
4127.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 - 客户端收到的消息
1
2
3
4
5
6
7
81) "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/