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