Redis发布与订阅
Redis的发布与订阅功能通过PUBLISH、SUBSCRIBE/UNSUBSCRIBE、PSUBSCRIBE/PUNSUBSCRIBE
等命令组成。
- 通过
SUBSCRIBE
,客户端可以订阅一个或多个频道,成为这些频道的订阅者,并可以通过UBSUBSCRIBE
退订。 - 通过
PSUBSCRIBE
,客户端可以订阅一个或多个模式,成为这些频道的订阅者,并可以通过PUBSUBSCRIBE
退订。 - 每当有其他客户端通过
PUBLISH
向这些频道发送消息时,频道的所有订阅者都将收到这条消息。
注:模式就是使用了通配符的频道名,比如news.*。
通配符:
- ?:一个占位符
- *:0至多个占位符
- ?*:一个及以上个占位符
1、订阅与退订的原理
I. 频道的订阅与退订
-
Redis服务器维护了一个名为
pubsub_channels
的字典,字典的键是被订阅的频道,值是订阅了这些频道的客户端链表。 -
当一个客户端订阅(
SUBSCRIBE
)频道时,服务器首先到字典中查找是否有这个频道。-
如果有,则将该客户端放至链表的末尾。
-
如果没有,则先创建该频道的键,然后将客户端插入链表。
-
-
当一个客户端退订(
UNSUBSCRIBE
)频道时,服务器到字典中找到频道的键并删除该客户端的信息。如果删除后链表为空,则将键一并删除。
II. 模式的订阅与退订
- Redis服务器维护了一个名为
pubsub_pattern
的链表,每个链表节点存储了客户端及其订阅的模式。 - 当客户端订阅(
PSUBSCRIBE
)模式时,服务器创建一个存储客户端及其订阅模式的链表节点,并将其添加至链表的末尾。 - 当客户端退订(
PUNSUBSCRIBE
)模式时,服务器在链表中寻找对应的节点并将其删除。
2、发布的原理
I. 发布给频道订阅者
Redis服务器根据频道名到字典中查找对应的订阅客户端链表,然后将信息发送给所有的订阅者。
II. 发布给模式订阅者
Redis服务器遍历pubsub_pattern
链表,并将消息发送给订阅了对应模式的客户端。
3、其它命令
- PUBSUB CHANNELS [pattern]:查看当前服务器中被订阅的频道,如果提供了pattern字段,则查看当前服务器中符合pattern模式的频道。
- PUBSUB NUMSUB channel [channel1 …]:返回当前服务器中对应频道的订阅者数量。
- PUBSUB NUMPAT:返回当前服务器中订阅了模式的订阅者数量。