这里写目录标题
Redis发布与订阅
基本命令
PSUBSCRIBE pattern [pattern ...] #订阅一个或多个符合给定模式的频道。
PUBSUB subcommand [argument [argument ...]] #查看订阅与发布系统状态。
PUBLISH channel message #将信息发送到指定的频道。
PUNSUBSCRIBE [pattern [pattern ...]] #退订所有给定模式的频道。
SUBSCRIBE channel [channel ...] #订阅给定的一个或多个频道的信息。
UNSUBSCRIBE [channel [channel ...]] #指退订给定的频道。
原理
服务器中维护着一个pubsub_channels字典,所有的频道和订阅关系都存储在这里,字典的键为频道的名称,而值为订阅频道的客户端链表。
当有新的客户端订阅某个频道时,会发生两种情况中的一种:
- 如果频道已经存在,则新的客户端会添加到pubsub_channels对应频道的链表末尾。
- 如果频道原本不存在,则会为频道创建一个键,该客户端成为链表的第一个元素。
当一个客户端退订一个频道的时候,pubsub_channels对应键的链表会删除该客户端。
当频道给客户端发送信息的时候,服务器会遍历pubsub_channels中对应键的链表,向每一个客户端发送信息。
服务器还维护着一个pubsub_patterns链表,链表的pattern属性记录了被订阅的模式,而client属性记录了订阅模式的客户端。
当有新的客户端订阅某个模式的时,会进行如下步骤:
- 创建一个链表节点,pattern属性记录订阅的模式,client记录订阅模式的客户端。
- 将这个链表节点添加到pubsub_patterns链表中。
当一个客户端退订某一个模式的时候,服务器遍历pubsob_patterns找到对应的pattern同时也是对应该client客户端的节点,将该节点删除。
当模式给客户端发送信息的时候,服务器遍历pubsub_channels,查找与channels频道相匹配的模式并将消息发送给订阅了这些模式的客户端。
Redis订阅系统的优势
- 当一个客户端向频道发送一个信息,订阅了同一个频道/模式的多个客户端可以同时接收到信息,类似广播的机制。
- 便于Sentinel哨兵与服务器间的通信并进行监控。