0%

redis发布和订阅

[toc]


发布/订阅, 就是指客户端用subscribe订阅某个频道或者模式(模式就是带通配符的频道集合), 当服务端redis发布消息的时候, 发消息给订阅了的客户端。

  • 执行subscribe命令客户端会进入订阅状态,处于此状态下客户端不能使用除subscribe、unsubscribe、psubscribe和punsubscribe这四个属于"发布/订阅"之外的命令,否则会报错。

  • 模式订阅是psubscribe 命令,可以同时psubscribe 多个模式
    7c4ba17345ace77b60d7a177936b7545e4854f9a

模式订阅的示意图:
00e18168099bcb14a3411be7b039b67e713d0489

Q: 发布的消息会持久化嘛?
A: 不会,因此可靠性不佳。 而且客户端订阅时,不会收到之前发布过的消息


Q: 频道订阅的原理是怎么样的?底层结构是什么?#

A:
底层结构是字典+链表
ebd8d1addb675d6acffcb6925667757c36de7323

客户端订阅后, redis会把客户端的连接信息放到这个频道的链表上。
redis发布时,根据字典找到链表,然后逐个发送。


Q: 模式订阅呢?又是怎么做的#

A:客户端做模式订阅时,会放到另一个链表上pubsubPattern,就不是字典了
681657383aed243f3bc7d6238bd8c772dbeca81a

链表里每个节点是 “1个客户端+1个模式”
当发布一个消息时, 除了频道字典里的发布, 还会去这个pubsubPattern里遍历,找到所有匹配的模式的客户端,然后发送。

注意模式是不存在字典的,所以如果真的订阅了很多相同的毛模式,是会重复发送的。