Redis 消息队列

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 属性是一个字典, 这个字典就用于保存订阅频道的信息,其中,字典的键为正在被订阅的频道, 而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端。

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

缺点

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