Redis 发布与订阅
参考:黄健宏 著. Redis设计与实现 (数据库技术丛书) . 机械工业出版社. Kindle 版本.
Redis的发布与订阅功能由 PUBLISH、 SUBSCRIBE、 PSUBSCRIBE 等命令组成。 通过执行 SUBSCRIBE 命令, 客户端可以订阅一个或多个频道, 从而成为这些频道的订阅者( subscriber)
除了订阅频道之外, 客户端还可以通过执行 PSUBSCRIBE 命令订阅一个或多个模式, 从而成为这些模式的订阅者.
一、频道的订阅与退订
Redis 将所有频道的订阅关系都保存在服务器状态的 pubsub_ channels 字典里面, 这个字典的键是某个被订阅的频道, 而键的值则是一个链表, 链表里面记录了所有订阅这个频道的客户端:
订阅频道: SUBSCRIBE "example.sport"
退订频道: UNSUBSCRIBE "example.sport"
二、模式的订阅与退订
与频道的订阅类似, 服务器将所有模式的订阅关系都保存在服务器状态的 pubsub_ patterns 属性里面:
模式订阅: PSUBSCRIBE “example.*”
模式退订: PUNSUBSCRIBE "example.*"
三、发送消息
当一个 Redis 客户端执行 PUBLISH< channel>< message> 命令将消息 message 发送给频道 channel 的时候, 服务器需要执行以下两个动作:
1) 将消息 message 发送给 channel 频道的所有订阅者。
2) 如果有一个或多个模式 pattern 与频道 channel 相匹配, 那么将消息 message 发送给 pattern 模式的订阅者。
PUBLISH 命令通过访问 pubsub_ channels 字典来向频道的所有订阅者发送消息, 通过访问 pubsub_ patterns 链表来向所有匹配频道的模式的订阅者发送消息。
四、查看订阅信息
PUBSUB 命令是 Redis 2. 8 新增加的命令之一, 客户端可以通过这个命令来查看频道或者模式的相关信息, 比如某个频道目前有多少订阅者, 又或者某个模式目前有多少订阅者, 诸如此类。
PUBSUB subcommand [argument [argument ...]]
1. PUBSUB CHANNELS [pattern]
当没有 pattern 参数时,返回当前服务器被订阅的所有频道。
如果给定 pattern 参数,返回服务器当前被订阅的频道中那些与 pattern 模式相匹配的频道。ex: PUBSUB CHANNELS "news.*" | PUBSUB CHANNELS "news.[ie]t"
2. PUBSUB NUMSUB[ channel- 1 channel- 2... channel- n]
该子命令接受任意多个频道作为输入参数, 并返回这些频道的订阅者数量。
3. PUBSUB NUMPAT
该子命令用于返回服务器当前被订阅模式的数量。
PUBSUB 命令的三个子命令都是通过读取 pubsub_ channels 字典和 pubsub_ patterns 链表中的信息来实现的。