18 发布与订阅
- 主要命令PUBLISH、SUBSCRIBE、PSUBSCRIBE等
- 订阅频道:
- 执行SUBSCRIBE,客户端可以订阅一个或多个频道,从而成为频道的订阅者
- 有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到这条消息
- 订阅模式
- 执行PSUBSCRIBE,客户端可以订阅一个或者多个模式(类似于正则表达式),从而成为模式的订阅者
- 有其他客户端向某个频道发消息时,消息不仅回传给频道的订阅者,还会发送给与频道匹配的模式的订阅者
- 举例说明
- A订阅了频道news.it
- B订阅了频道news.et
- C、D订阅了与频道news.it、news.et相匹配的模式new.[ie]t
- E客户端PUBLISH “news.it” “nice”, ACD会收到
- E客户端PUBLISH “news.et” “nice”, BCD会收到
18.1 频道的订阅与退订
- 频道和客户端的关系保存在pubsub_channels变量中,key是频道的名字,value是客户端的list
//code0: server.h
typedef struct pubsubPattern {
client *client;
robj *pattern;
} pubsubPattern;
struct redisServer {
//...
dict *pubsub_channels; /* channels a client is interested in (SUBSCRIBE) */
list *pubsub_patterns; /* patterns a client is interested in (SUBSCRIBE) */
//...
}
18.2 模式的订阅与退订
- 客户端执行PSUBSCRIBE命令订阅某个或某些模式的时候,会针对每一个订阅模式执行:
- 新建pubsubPattern结构, pattern设置为被订阅的模式,client设置为订阅模式的客户端
- 将pubsubPattern加到链表末尾
18.3 消息发送原理
- 将消息发给频道订阅者:在pubsub_channels中找到订阅者,然后send
- 将消息发给模式订阅者:遍历pubsub_patterns整个链表,找到与频道相匹配的模式,然后发送
18.4 PUBSUB命令的三个子命令
- PUBSUB:可以用该命令查看频道或者模式的相关信息
- PUBSUB CHANNELS [pattern]:返回符合pattern的所有频道
- PUBSUB NUMSUM [channel-1 channel-2 … channel-n]: 返回频道订阅者的数量
- PUBSUB NUMPAT:返回服务器当前被订阅模式的数量