redis 作为发布、订阅服务时的原理?

参考:

  1. https://pdai.tech/md/db/nosql-redis/db-redis-x-pub-sub.html

发布订阅模式的 基本组成

答:Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

  • 发布者 可以向指定 频道(channel)发送消息;

    as

  • 订阅者 可以订阅一个或多个频道(channel);
    在这里插入图片描述

  • 频道(channel)所有订阅此频道的 订阅者 都会收到该频道的消息。img

基于模式的 发布订阅

这里的模式,其实可以理解为通配前缀。比如的tweet.shop.*模式会匹配以tweet.shop开头的所有频道。下面图中 tweet.shop.* 模式匹配了 tweet.shop.kindle 频道和 tweet.shop.ipad 频道, 并且有不同的客户端分别订阅它们三个:
在这里插入图片描述

说明:
在这里插入图片描述

实现原理

频道(channel):底层是通过字典(图中的pubsub_channels)实现的,这个字典就用于保存订阅频道的信息。

字典的**键(key)为正在被订阅的频道, 而字典的值(value)**则是一个链表, 链表中保存了所有订阅这个频道的客户端。

字典就是一个哈希表(这里使用的是hashtable,它是线程安全的)

  • 比如说,在下图展示的这个 pubsub_channels 示例中, client2 、 client5 和 client1 就订阅了 channel1 , 而其他频道也分别被别的客户端所订阅:

    在这里插入图片描述

订阅:当客户端调用 SUBSCRIBE 命令时, 程序就将客户端和要订阅的频道在 pubsub_channels 字典中关联起来。

  • 比如,如果客户端 client10086 执行命令 SUBSCRIBE channel1 channel2 channel3 ,那么前面展示的 pubsub_channels 将变成下面这个样子:

    在这里插入图片描述

发布:当调用 PUBLISH channel message 命令, 程序首先根据 channel 定位到字典的键, 然后将信息发送给字典值链表中的所有客户端。

退订:使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作: 它从 pubsub_channels 字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值