Redis 的发布/订阅(pub/sub)模式

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

  1. subscribe消息。表示订阅成功的反馈信息。数组中第一个值就是"subscribe",第二个值是订阅成功的频道名,第三个值是当前客户端订阅的频道数。如下图
    消息种类  订阅的频道数

  2. unsubscribe消息。表示成功取消订阅某个频道。数组中第一个值就是"unsubscribe",第二个值是取消订阅成功的频道名,第三个值是当前客户端订阅的频道数。当订阅频道数为0时,客户端会退出订阅状态,之后就可以执行其他非"发布/订阅"模式的命令了。

  3. message消息。表示接收到的消息。数组中第一个值就是"message",第二个值是产生消息的频道名,第三个值是消息的内容。

模式匹配订阅

PSUBSCRIBE
PUNSUBSCRIBE

例如:

# 订阅所有new.的频道
psubscribe new.*
# 取消订阅所有new.的频道
punsubscribe new.*

PSUBSCRIBEPUNSUBSCRIBE消息的格式和subscribeunsubscribe消息的格式是类似的,只是第一个值变为psubscribepunsubscribe

pmessage消息的格式,第一个值是"pmessage",第二个值是匹配的原始模式,第三个值是频道名,第四个值是消息内容。

同时符合模式和频道订阅的消息

如果client 通过模式订阅和频道订阅 订阅了同一个频道,那么同一条消息会收到多次。如下,两个方式都订阅了foo频道,则foo频道的同一个消息该client会收到两次。

SUBSCRIBE foo
PSUBSCRIBE f*

模式匹配的订阅计数的意义

实际上,该数字是客户端仍订阅的频道和模式的总数。 因此,仅当由于取消订阅所有频道和模式而导致计数降至零时,客户端才会退出发布/订阅状态。

参考文献

[1] Redis 官方文档
[2] 深入理解Redis的发布/订阅机制(pub/sub)
[3] redis实现消息队列&发布/订阅模式使用

猜你喜欢

转载自blog.csdn.net/besmarterbestronger/article/details/106976057