发布与订阅相关命令有那些?
频道
订阅:SUBSCRIBE
退订:UNSUBSCRIBE
消息发送:PUBLISH模式
订阅:PSUBSCRIBE
退订:PUNSUBSCRIBE查看订阅消息:PUBSUB
- PUBSUB CHANNELS [pattern]:返回服务器当前被订阅的频道。
- PUBSUB NUMSUB [channel-1 channel-2 .... channel-n]:接收任意多个频道作为输入,返回这些频道的订阅者数量。
- PUBSUB NUMPAT:返回服务器当前被订阅模式的数量。
频道的底层结构?
答:字典。在服务器状态结构当中维护着一个字典,字典的键是频道,值是一条存储订阅了该频道的客户端的链表。
struct redisServer {
dict *pubsub_channels; /* 保存所有频道的订阅关系 */
}
模式的底层结构?
答:链表。在服务器状态结构当中维护着一条链表,链表当中的每一个节点都包含着一个 pubsubPattern 结构,这个结构里包含了模式信息以及订阅该模式的客户端信息。
struct redisServer {
list *pubsub_patterns; /* 保存所有模式的订阅关系 */
}
typedef struct pubsubPattern{
redisClient *client; /* 订阅模式的客户端 */
robj *pattern; /* 被订阅的模式 */
}
提示
但是在最新版(7.2.4)好像改成了字典结构,pubsubPattern 结构也没了。
SUBSCRIBE 命令的实现原理?
答:从服务器状态结构的频道字典里面通过键去找这个频道,如果存在,那么就把这个客户端放到订阅者链表的末尾。如果不存在,那么就为该频道创建一个新的键,再将客户端添加到链表。
UNSUBSCRIBE 命令的实现原理?
答:从服务器状态结构的频道字典里面通过键去找这个频道,如果存在,就将该客户端从订阅者链表当中删除,删除之后,判断订阅者链表是否为空链表,如果是,就将频道所对应的 key 从字典里删除。
PSUBSCRIBE 命令的实现原理?
答:创建一个 pubsubPattern 结构,为其属性进行赋值,再将这个结构添加到服务器状态结构的模式链表的末尾。
PUNSUBSCRIBE 命令的实现原理?
答:遍历服务器状态结构的模式链表,如果该节点的模式信息与客户端信息与当前的模式和客户端信息匹配,就将该节点从链表中删除。
PUBLISH 命令的实现原理?
答:遍历服务器状态结构的频道字典,根据键(频道)找到订阅者链表,遍历订阅者链表,依次向客户端发送消息。之后,遍历服务器状态结构的模式链表,如果频道和模式匹配,就将消息发送给订阅了该模式的客户端。
PUBSUB CHANNELS [pattern] 命令的实现原理?
答:就是将频道字典的所有键输出出来。如果指定了 pattern 参数,则会先进行匹配。
PUBSUB NUMSUB [channel-1 channel-2 .... channel-n] 命令的实现原理?
答:就是返回频道字典的订阅者链表的长度。如果传入 channel 参数,则会先进行匹配。
PUBSUB NUMPAT 命令的实现原理?
答:就是返回模式链表的长度。