Redis发布与订阅功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012050154/article/details/78668131

       发布/订阅”功能包含两种角色:发布者和订阅者。Redis的发布与订阅功能由publish、subscribe、psubscribe等命令组成。通过执行publish命令可以发布消息;通过执行subscribe命令,客户端可以订阅一个或多个频道;通过执行psubscribe命令,客户端可以订阅一个或多个模式。

一、发布与订阅频道

        如图所示,频道的发布与订阅功能。客户端A、B、C都订阅了news.it频道,此时如果向news.it频道发送消息,客户端A、B、C都会收到这条消息。


        在redis.h/redisServer结构中可以看到所有频道的订阅关系都保存在服务器状态的订阅频道字典里,这个字典的键是被订阅的频道,值则是订阅该频道的客户端列表。

struct redisServer{
    //...
    // 字典,键为频道,值为链表
    // 链表中保存了所有订阅某个频道的客户端
    // 新客户端总是被添加到链表的表尾
    dict *pubsub_channels;  /* Map channels to list of subscribed clients */
    //...
}


        当Redis客户端执行publish <channel> <message>命令将消息发送给频道时,publish命令在pubsub_channels字典里找到频道channel的订阅者名单,然后将消息发送给名单上的所有客户端。


二、发布与订阅模式

         如图所示,频道的发布与订阅功能。客户端A订阅了频道news.it,客户端B订阅了new.et,客户端C、C订阅了news.[ie]t模式,此时如果向news.it频道发送消息,客户端A、C、D都会收到这条消息。


        Redis将所有模式的订阅关系都保存在服务器状态的订阅模式链表里,链表的每个节点都包含着客户端及客户端订阅的模式。

struct redisServer{
    //...
    // 这个链表记录了客户端订阅的所有模式的名字
    list *pubsub_patterns;  /* A list of pubsub_patterns */
    //...
}


        当Redis客户端执行publish <channel> <message>命令将消息发送给频道时,Redis首先将消息message发送给频道channel的订阅者,然后遍历事个pubsub_patterns链表,查找与channel频道匹配的模式,并将消息发送给订阅了这些模式的客户端。


参考资料

1、http://www.redis.net.cn/tutorial/3506.html
2、《Redis设计与实现》第二版---黄健宏
3、https://github.com/xingzhexiaozhu/redis-3.0-annotated
4、http://www.yiibai.com/redis/redis_strings.html


猜你喜欢

转载自blog.csdn.net/u012050154/article/details/78668131