首页 > 代码库 > Redis 发布与订阅

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 链表中的信息来实现的。 

 


 

Redis 发布与订阅