Redis 发布与订阅
大约 1 分钟RedisRedisRedis 设计与实现
Redis 发布与订阅
SUBSCRIBE "name"
可以订阅一个或多个频道,成为频道的订阅者PUBLISH “name” "hello"
向频道发送消息PSUBSCRIBE
订阅一个或多个模式(正则匹配)
1 订阅
1.1 订阅频道
Redis将所有订阅关系存放在 dict(pubsub_channels)
里面,字典的键是被订阅的频道,值是一个链表对应订阅这个频道的客户端链表。

当有新的客户端订阅时,会将 client` 对应的节点加在链表的末尾。
当客户端通过 UNSUBSCRIBE
命令退订时,会将链表中的客户端删除,如果没有其他订阅者,则会删除字典中的键。
1.2 订阅模式
Redis 将订阅模式都存放在一个 list(pubsub_patterns)
里面,链表的每一项是一个 pubsubPattern
对象,记录了被订阅的模式和订阅模式的客户端。

当有新的客户端订阅模式时,新增一个 pubsubPattern
结构,并加在链表的末尾。
模式的退订是删除链表中对应的 pubsubPattern
结构。
2 发送消息
2.1 发送频道订阅者
从 pubsub_channels
字典中找到频道的订阅者链表,然后将消息发送给每个订阅者。
2.2 发送模式订阅者
遍历整个 pubsub_patterns
链表,查找与 channel
频道匹配的模式,并将这些消息发送给订阅了这些模式的客户端。
3 订阅信息
3.1 PUBSUB CHANNELS
用于返回服务器当前被订阅的频道 PUBSUB CHANNELS [pattern]
。
3.2 PUBSUB NUMSUB
查看频道的订阅者数量 PUBSUB NUMSUB [channel-1 channel-2 ... channel-n]
。
3.2 PUBSUB NUMPAT
查看被订阅模式的数量 PUBSUB NUMPAT
。