Redis的发布与订阅

频道的订阅与退订

当一个客户端执行SUBSCRIBE命令订阅某个或某些频道的时候,这个客户端与被订阅频道之间就建立起了一种订阅关系。
Redis将所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值则是一个链表,链表里面记录了所有订阅这个频道的客户端。

struct redisServer{
    //保存所有频道的订阅关系
    dict *pubsub_channels;
    //...
}
  • client-1、client-2、client-3三个客户端正在订阅”news.it”频道
  • 客户端client-4正在订阅“news.sport频道”
  • client-5和client-6两个客户端正在订阅的”news.business”频道。

这里写图片描述

模式的订阅与退订

服务器将所有模式的订阅关系保存在服务器状态的pubsub_patterns属性里面

struct redisServer{

    //保存所有模式订阅关系
    list *pubsub_patterns;
    //...
}

pubsub_patterns属性是一个链表,链表中每一个节点都包含着一个pubsub_pattern结构,这个结构的pattern属性记录了被订阅的模式,而client属性则记录了订阅模式的客户端:

typedef struct pubsubPattern{

    //订阅模式的客户端
    redisClient *client;
    //被订阅的模式
    robj *pattern;
}piubsubPattern;

这里写图片描述

发送消息

当一个客户端执行Publish <channel> <message>命令将消息发送到频道channel时候,执行如下:
* 将消息message发送给channel频道的所有订阅者;
* 如果有一个或多个模式pattern与频道channel相匹配,那么消息message发送给pattern模式的订阅者。

将消息发送给频道订阅者

PUBLISH命令要做的就是在pubsub_channels字典找到频道channel的订阅者名单(一个链表),然后将消息发送到名单上的所有客户端。
这里写图片描述

如果客户端执行PUBLISH “news.it” “hello”
那么PUBLISH命令将在pubsub_channels字典中查找键为”news.it”对应的链表值,并且通过遍历链表将信息”hello”发送给订阅者。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值