参考:
- https://pdai.tech/md/db/nosql-redis/db-redis-x-pub-sub.html
发布订阅模式的 基本组成
答:Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
-
发布者 可以向指定 频道(channel)发送消息;
-
订阅者 可以订阅一个或多个频道(channel);
-
频道(channel)所有订阅此频道的 订阅者 都会收到该频道的消息。
基于模式的 发布订阅
这里的模式,其实可以理解为通配前缀。比如的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 字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。