Redis发布/订阅模式

Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送信息,订阅者(sub)接收信息。

Redis客户端可以订阅任意数量的频道。

命令

命令 描述
PSUBSCRIBE pattern [pattern..] 订阅一个或多个符合给定模式的频道。
PUNSUBSCRIBE pattern [pattern..] 退订一个或多个符合给定模式的频道。
PUBSUB subcommand [argument[argument]] 查看订阅与发布系统状态。
PUBLISH channel message 向指定频道发布消息
SUBSCRIBE channel [channel..] 订阅给定的一个或多个频道。
SUBSCRIBE channel [channel..] 退订一个或多个频道

测试

订阅端

[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> SUBSCRIBE cheng #订阅一个频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cheng"
3) (integer) 1
1) "message" #消息
2) "cheng" #接收频道
3) "111" #接收消息

发送端

127.0.0.1:6379> PUBLISH cheng 111 #向指定频道部分消息
(integer) 1

原理

Redis是使用C实现的,通过分析 Redis 源码里的 pubsub.c 文件,了解发布和订阅机制的底层实现,籍此加深对 Redis 的理解。

Redis 通过 PUBLISH 、SUBSCRIBE 和 PSUBSCRIBE 等命令实现发布和订阅功能。

每个 Redis 服务器进程都维持着一个表示服务器状态的 redis.h/redisServer 结构, 结构的 pubsub_channels 属性是一个字典, 这个字典就用于保存订阅频道的信息,其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。

Redis发布/订阅模式

客户端订阅,就被链接到对应频道的链表的尾部,退订则就是将客户端节点从链表中移除。

缺点
如果一个客户端订阅了频道,但自己读取消息的速度却不够快的话,那么不断积压的消息会使redis输出缓冲区的体积变得越来越大,这可能使得redis本身的速度变慢,甚至直接崩溃。
这和数据传输可靠性有关,如果在订阅方断线,那么他将会丢失所有在短线期间发布者发布的消息。

应用
消息订阅:公众号订阅,微博关注等等(起始更多是使用消息队列来进行实现)
多人在线聊天室。

稍微复杂的场景,我们就会使用消息中间件MQ处理。

 

上一篇:Python之路【第二十九篇】:django ORM模型层


下一篇:如何将VTK整合到Qt中(2)? --使用具体VTK控件分析