发布订阅
核心知识点:
1.Redis提供简单的发布订阅功能,缺陷在于不能回溯、不能堆积消息。
2.命令
a.publish:发布消息
b.subscribe:订阅频道
c.unsubscribe:取消订阅
d.psubscribe/punsubscribe:模式订阅或取消订阅
e.pubsub:查看活跃频道、查看频道订阅数、查看模式订阅数
Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信,
发布者客户端向指定的频道(channel)发布消息,订阅该频道的每个客户端都可以收到该消息。
下面会介绍一些相关命令:
1.发布消息
publish channel message
返回的结果为订阅者的个数,如果此时没有订阅,返回0:
127.0.0.1:6379> publish channel:sports "Kobe retired today" (integer) 0
2.订阅消息
subscribe channel [channel ...]
订阅者可以订阅一个或者多个频道:
127.0.0.1:6379> subscribe channel:sports Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "channel:sports" 3) (integer) 1 ...此处是等待中
在另一个客户端发布一条消息:
127.0.0.1:6379> publish channel:sports "The Timberwolves win the Lakers" #森林狼大胜湖人 (integer) 1
当前订阅者会收到消息:
127.0.0.1:6379> subscribe channel:sports Reading messages... (press Ctrl-C to quit) ... 1) "message" #消息 2) "channel:sports" #频道 3) "The Timberwolves win the Lakers" #内容
有关订阅命令有两点需要注意:
(1)客户端在执行订阅命令之后进入订阅状态,只能接收subscribe、pubscribe、unsubscribe、pinsubscribe四个命令;
(2)新开启的订阅客户端,无法接收到该频道之前的消息,因为Redis不会对发布的消息持久化。
3.取消订阅
unsubscribe [channel [channel ...]]
客户端可以通过unsubscribe命令取消对指定频道的订阅,取消成功后,不会再收到该频道发布的消息:
127.0.0.1:6379> unsubscribe channel:sports 1) "unsubscribe" 2) "channel:sports" 3) (integer) 0
4.按照模式订阅和取消订阅
psubscribe pattern [pattern ... ]
punsubscribe [pattern [pattern ... ]]
除了subscribe和unsubscribe命令,Redis还支持glob风格的订阅命令psubscribe和取消订阅命令punsubscribe:
127.0.0.1:6379> psubscribe w* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "w*" 3) (integer) 1
5.查询订阅
(1)查看活跃的频道
pubsub channels [pattern]
所谓活跃的频道是指当前频道至少有一个订阅者,其中[pattern]是可以指定具体的模式:
127.0.0.1:6379> pubsub channels 1) "write" 2) "water"
(2)查看频道的订阅数
pubsub numsub [channel ... ]
返回某一个频道的订阅数:
127.0.0.1:6379> pubsub numsub write 1) "write" 2) (integer) 1 #订阅数为1
(3)查看模式订阅数
pubsub numpat
所有的模式订阅也可以视作模糊订阅,就是使用subscribe来订阅频道的用户。
127.0.0.1:6379> pubsub numpat #当前没有模式订阅的用户 (integer) 0
虽然和很多专业的消息队列系统(Kafka、RocketMQ)相比,Redis的发布订阅略显粗糙,功能也有些简单,例如不支持消息堆积和回溯
但是胜在足够简单,如果当前场景可以容忍这些缺点,也是一个不错的选择。