当一个客户端执行SUBSCRIBE命令订阅某个或某些频道的时候,这个客户端与被订阅频道之间就建立起了一种订阅关系,redis将所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值则是一个链表,链表里面记录了所有订阅这个频道的客户端:
-
struct redisServer{
-
//...
-
dict *pubsub_channels;
-
//...
-
};
每当有客户端订阅频道时,就会向这个字典里面添加对应的项;而退订频道就是删除对应的项。
而模式的订阅则是保存在一个pubsub_patterns的链表里面
,链表中的每个节点都包含着一个pubsubPattern结构,
-
struct redisServer{
-
//...
-
list *pubsub_patterns;
-
//...
-
};
-
typedef struct pubsubPattern{
-
redisClient *client;
-
robj *pattern;
-
};
发送消息
当一个redis客户端执行PUBLISH 命令将消息message发送给频道channel的时候,服务器将会执行以下两个动作:
1. 将消息message发送给channel频道的所有订阅者
2. 搜索模式链表,发送message给所有匹配pattern的客户端
阅读(4061) | 评论(2) | 转发(0) |