发布与订阅
其底层是一个保存在redisserver中的一个属性pubsub_channels指向一个字典,该字典的键是频道信息,而值是一个链表,链表的每个节点都是订阅该频道的客户端。
订阅频道
当客户端对一个频道进行订阅的时候,服务器会将客户端与被订阅的频道在pubsub_channels关联起来,如果该频道已经有其他的订阅者,则只需要将该客户端添加到链表的最后。如果频道还没有任何订阅者,则它不会存在pubsub_channels的字典中,则首先需要创建一个键,并将该键的值设置为空链表,然后在家客户端添加到链表成为链表的第一个元素。
频道的退订
使用unsubscribe 命令可以退订客户端订阅的频道,原理是根据频道在pubsub_channels字典里找到对应的链表,删除该客户端在链表中,如果删除该客户端后,链表为空链表,则删除该键。
模式的订阅和退订
原理是:在redisserver有一个属性pubsub_patters指向一个链表,链表中每个节点都是pubsubpattern结构,该结构中有两个属性分别是client和pattern,分别为订阅模式和订阅该模式的客户端。当添加一个订阅模式的时候,就会创建一个该结构并且添加到链表尾。
退订使用punsubscribe命令,在链表中删除相应的匹配模式和客户端信息。
将消息发送给频道的订阅者
因为redisserver中的pubsub_channels字典中保存了频道和订阅的信息,通过遍历该频道对应的客户端链表,将消息发送给每一个订阅该频道的客户端。
将消息发送给模式订阅者
因为redisserver中的pubsub_pattern链表中保存了客户端和订阅模式的信息,通过遍历该链表将与频道匹配的,将消息发送给每一个匹配的客户端。
查看订阅信息
pubsub channels<pattern>命令,不带pattern参数,则返回当前服务器所有订阅的频道,携带参数pattern,返回符合该订阅模式的频道信息。其原理是通过遍历pubsub_channels这个字典找到符合要求的频道并进行返回。
pubsub numsub channel命令,channel参数代表被订阅的频道,返回某个频道的订阅客户端的数量,其原理是通过redisserver中的属性pubsub_channels,找到对应的键,返回对应链表的长度。
Pubsub numpat命令返回当前服务器被订阅模式的数量,原理是通过返回redisserver中的属性pubsub_patterns属性的链表长度。