Rediis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub),订阅者(sub)接收消息
redis 客户端可以订阅任意数量的频道
订阅/发布消息图
命令 | 描述 |
PSUBSCRIBE pattern [pattern..] | 订阅一个或多个符合给定模式的频道 |
PUBSUB subcommand [argument[argument..]] | 查看订阅和发布系统状态 |
PUBLISH channel message | 将信息发生到指定的频道 |
PUNSUBSCRIBE [pattern] [pattern..] | 退订所有给定模式的频道 |
SUBSCRIBE channel [channel...] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel..]] | 推顶给定的频道 |
#订阅一个频道 127.0.0.1:6379> SUBSCRIBE test Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "test" 3) (integer) 1 #发送端 127.0.0.1:6379> PUBLISH test hello (integer) 1 127.0.0.1:6379> PUBLISH test "this is test" (integer) 1 #查看结果 127.0.0.1:6379> SUBSCRIBE test Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "test" 3) (integer) 1 1) "message" 2) "test" 3) "hello" 1) "message" 2) "test" 3) "this is test"
Redis 通过 PUBLISH 、SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能。
每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构, 结构的 pubsub_channels 属性是一个字典, 这个字典就用于保存订阅频道的信息,其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。
客户端订阅,就被链接到对应频道的链表的尾部,退订则就是将客户端节点从链表中移除。
缺点
- 如果一个客户端订阅了频道,但自己读取消息的速度却不够快的话,那么不断积压的消息会使redis输出缓冲区的体积变得越来越大,这可能使得redis本身的速度变慢,甚至直接崩溃。
- 这和数据传输可靠性有关,如果在订阅方断线,那么他将会丢失所有在短线期间发布者发布的消息。