Client 05 订阅run
频道和接收到消息:
Client 06 订阅run*
频道和接收到消息:
image-20191222141458065
Client 07 向多个频道发送消息:
image-20191222141514914
通过上面的案例,我们学会了一个客户端可以订阅单个或者多个频道,分别通过subscribe
,psubscribe
命令,客户端可以通过 publish
发送相应的消息。
在命令行中我们可以用 Ctrl + C 来取消相关订阅,对应的命令时 unsubscribe channelName
。
Pub/Sub 底层存储结构
订阅 Channel
在 Redis 的底层结构中,客户端和频道的订阅关系是通过一个字典加链表的结构保存的,形式如下:
在 Redis 的底层结构中,Redis 服务器结构体中定义了一个 pubsub_channels
字典
struct redisServer { //用于保存所有频道的订阅关系 dict *pubsub_channels; }
在这个字典中,key 代表的是频道名称,value 是一个链表,这个链表里面存放的是所有订阅这个频道的客户端。
所以当有客户端执行订阅频道的动作的时候,服务器就会将客户端与被订阅的频道在 pubsub_channels 字典中进行关联。
这个时候有两种情况:
- 该渠道是首次被订阅:首次被订阅说明在字典中并不存在该渠道的信息,那么程序首先要创建一个对应的 key,并且要赋值一个空链表,然后将对应的客户端加入到链表中。此时链表只有一个元素。
- 该渠道已经被其他客户端订阅过:这个时候就直接将对应的客户端信息添加到链表的末尾就好了。