如无特殊说明,本站Redis系列文章均基于Redis 5.0.8,CentOS 7.9,远程连接工具RDM。
Redis提供了发布(publish)订阅(subscribe)功能。
从pub/sub的机制来看,更像是一个广播系统。多个sub可以订阅多个channel,多个pub可以往多个channel中发布消息,可以理解成:
Subscribe:收音机,可以收到多个频道,并以队列的方式显示
Publish: 电台,可以往不同的频道中发消息
Channel:不同频率的频道。
发布订阅的命令
主要有发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅等命令。
PUBLISH channel msg
: 将信息 message 发送到指定的频道 channelSUBSCRIBE channel [channel ...]
: 订阅频道,可以同时订阅多个频道UNSUBSCRIBE [channel ...]
: 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道PSUBSCRIBE pattern [pattern ...]
: 订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所 有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有 以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类PUNSUBSCRIBE [pattern [pattern ...]]
: 退订指定的规则, 如果没有参数则会退订所有规则PUBSUB subcommand [argument [argument ...]]
: `查看订阅与发布系统状态
注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。因为Redis不会对发布的消息进行持久化。
同时,客户端在执行订阅命令之后进入订阅状态,只能接受:subscribe、psubscribe、unsubscribe、punsubscribe
与专业的消息队列相比(比如kafka,rocketmq),redis的发布订阅很粗糙,例如无法实现消息堆积和回溯,但胜在足够简单。
启动两个redis-cli窗口,均订阅JUST 频道(channel)
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
启动发布者向频道JUST发送消息
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
订阅一个或者多个符合模式的频道
启动两个redis-cli窗口,分别订阅 J* 和 JU*频道
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
发布消息
1 | 127.0.0.1:6379> PUBLISH JUST "Testing~" |
取消订阅
客户端可以通过画unsubscribe命令取消对指定频道的订阅,取消成功后,不会再收到该频道发布的消息
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
按照模式订阅和取消订阅
除了subscribe和unsubscribe命令,redis还支持glob风格的订阅命令psubscribe和取消订阅命令punsubscribe,例如下面会订阅it开头的所有频道:
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
查询订阅
可以查询:
- 活跃的频道
- 频道订阅数
- 查看模式订阅数
查看活跃的频道
所谓活跃的频道是指当前频道至少有一个订阅者:
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
查看频道订阅数
1 | 127.0.0.1:6379> pubsub numsub just |
查看模式订阅数
1 | [root@iZ8vbavndeiwj2ctanxb49Z ~]# redis-cli |
1 | 127.0.0.1:6379> pubsub numpat |
应用
聊天室、公告牌、服务之间利用消息解耦都可以使用发布订阅模式。比如发布变化到指定频道,下游服务订阅这个变化并进行相应的操作,通过这种方式可以有效解决不同业务间的耦合性。