redis代码 发布订阅

struct redisServer {
    ...
    
    /* Pubsub */
    dict *pubsub_channels;  /* Map channels to list of subscribed clients */存放<channel, list> list中是订阅该pattern的client列表
    list *pubsub_patterns;  /* A list of pubsub_patterns */存放所有已订阅的pubsubPattern结构体
...
};

typedef struct redisClient {
    ...    
    dict *pubsub_channels;  /* channels a client is interested in (SUBSCRIBE) */存放该client定语的<channel, list> list是空。
    list *pubsub_patterns;  /* patterns a client is interested in (SUBSCRIBE) */存放该client订阅的pattern;robj类型。
    ...
} redisClient;


typedef struct pubsubPattern {
    redisClient *client;
    robj *pattern;
} pubsubPattern;

pubsubSubscribeChannel(redisClient *c, robj *channel):该client订阅该channel。
如果此前没订阅过, 则在redisClient::pubsub_channels中增加该channel、 同时在server::pubsub_channels的中增加该channel与client的相关信息
pubsubUnsubscribeChannel, pubsubSubscribeChannel的逆过程。

pubsubSubscribePattern与channel类似,只不过是用list维护的<client, pattern>
pubsubUnsubscribePattern, pubsubSubscribePattern的逆过程。

pubsubPublishMessage(robj *channel, robj *message) 发布消息: 从server::pubsub_channels中找到该channel下的所有client,发消息。 
并从server::pubsub_patterns下逐个检查pattern是否匹配该channel, 匹配则给该client发消息。

pattern使用list, channel使用dict, 是由于pattern可能是正则式,list顺序遍历简单、dict无必要。

取消过程中, 如果无订阅了则删除相关的pattern或者channel。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值