pub/sub
发布者将消息发布到channels
,而不用关心订阅者是谁。
订阅者可以订阅一个或多个channels
,并且值接收订阅channels
的消息,而不关心是谁发布的。
消息的发布者和订阅者之间是解耦的。
- 客户端执行订阅以后,除了可以继续订阅(
SUBSCRIBE
或者PSUBSCRIBE
),取消订阅(UNSUBSCRIBE
或者PUNSUBSCRIBE
),PING
命令和结束连接(QUIT)
外, 不能执行其他操作,客户端将阻塞直到订阅通道上发布消息的到来. - 发布的消息在
Redis
系统中不存储.因此,必须先执行订阅,再等待消息发布. 但是,相反的顺序则不支持. - 订阅的通道名称支持
glob
模式匹配.如果客户端同时订阅了glob
模式的通道和非glob
模式的通道,并且名称存在交集,则对于一个发布的消息,该执行订阅的客户端接收到两个消息.
频道订阅
例如,使用SUBSCRIBE
订阅 foo 和bar 频道(channel
)
SUBSCRIBE foo bar
当其他client
将消息发送到channel
后,Redis
会将这些消息推送给该channel
的所有订阅者。
需要注意的是
,在订阅模式下,redis-cli
将不接受任何命令,并且只能使用Ctrl-C
退出该模式。
消息的格式
message
是一个3个元素构成的数组。消息种类有3种类:subscribe
, unsubscribe
, message
。
-
subscribe
消息。表示订阅成功的反馈信息。数组中第一个值就是"subscribe"
,第二个值是订阅成功的频道名,第三个值是当前客户端订阅的频道数。如下图
-
unsubscribe
消息。表示成功取消订阅某个频道。数组中第一个值就是"unsubscribe"
,第二个值是取消订阅成功的频道名,第三个值是当前客户端订阅的频道数。当订阅频道数为0时,客户端会退出订阅状态,之后就可以执行其他非"发布/订阅"模式的命令了。 -
message
消息。表示接收到的消息。数组中第一个值就是"message"
,第二个值是产生消息的频道名,第三个值是消息的内容。
模式匹配订阅
PSUBSCRIBE
PUNSUBSCRIBE
例如:
# 订阅所有new.的频道
psubscribe new.*
# 取消订阅所有new.的频道
punsubscribe new.*
PSUBSCRIBE
, PUNSUBSCRIBE
消息的格式和subscribe
,unsubscribe
消息的格式是类似的,只是第一个值变为psubscribe
和punsubscribe
。
pmessage
消息的格式,第一个值是"pmessage"
,第二个值是匹配的原始模式,第三个值是频道名,第四个值是消息内容。
同时符合模式和频道订阅的消息
如果client 通过模式订阅和频道订阅 订阅了同一个频道,那么同一条消息会收到多次。如下,两个方式都订阅了foo频道,则foo频道的同一个消息该client会收到两次。
SUBSCRIBE foo
PSUBSCRIBE f*
模式匹配的订阅计数的意义
实际上,该数字是客户端仍订阅的频道和模式的总数。 因此,仅当由于取消订阅所有频道和模式而导致计数降至零时,客户端才会退出发布/订阅状态。
参考文献
[1] Redis 官方文档
[2] 深入理解Redis的发布/订阅机制(pub/sub)
[3] redis实现消息队列&发布/订阅模式使用