17.发布订阅
2019-07-19 本文已影响0人
蜗牛ICU
1. 简介:
redis 的发布订阅功能由 PUBLISH,SUBSCRIBE,PSUBSCRIBE 等命令组成。
通过 SUBSCRIBE 命令,客户端可以订阅一个或多个频道,成为这些频道的订阅者,当其他客户端向被订阅者发送消息时,频道的所有订阅者都会收到信息。
三个客户 a,b,c 端执行了下面的命令:
SUBSCRIBE "news.it"
另一个客户端发布了一个消息:
PUBLISH "news.it" "hello"
a,b,c 都会受到消息
2. 频道的订阅和退订:
当一个客户端执行 SUBSCRIBE 命令订阅某个或者某些频道时候,这个客户端和被订阅的频道之间就建立了一种订阅关系。
redis 将所有的频道订阅关系保存在服务器状态的 pubsub_channels 字典里面,这个字典的键是某个被订阅的频道,而这个键的值是一个链表,链表里面记录里所有的订阅这个频道的客户端:
struct redisServer{
// ...
dict *pubsub_channels ; // 保存所有频道的订阅关系
// ...
}
3. 订阅频道:
每当客户端 SUBSCRIBE 命令订阅某个或者某些频道时,服务器都会将客户端与被订阅的频道在 pubsub_channels 字典中进行关联。
根据频道是否已经有其他订阅者,关联的操作分为两种情况:
1. 已经有其他的订阅者, 直接在对应的键的值的位置追加一条客户端的信息。
2. 没有其他的订阅者,先创建一个频道,然后将客户端追加在值的位置。
4. 退订频道:
UNSUBSCRIBE 命令的行为时当一个客户端退订某个或者某些频道的时候,服务器将从 pusub_channels 中解除客户端与被退订频道之间的关系。
频道的退订分为下面的情况:
程序会根据被退订的频道名称在 pubsub_channels 字典中找到对应的频道,然后从订阅者链中删除客户端信息,如果删除客户端信息之后,没有了其他的订阅者,程序会将 pubsub_channels 字典中对应的键删除。
5. 查看订阅信息:
PUSSUB 命令是 redis 2.8 新增加的命令,查看订阅了那些频道和被那些客户订阅了。
PUBSUB CHANNELS [pattern] // 查看有那些频道
PUBSUB UNMSUB [多个频道名称用空格分隔] // 查看一个频道有多少个订阅者
PUBSUB NUMPAT // 查看订阅了几个频道