[toc]
发布/订阅, 就是指客户端用subscribe订阅某个频道或者模式(模式就是带通配符的频道集合), 当服务端redis发布消息的时候, 发消息给订阅了的客户端。
-
执行subscribe命令客户端会进入订阅状态,处于此状态下客户端不能使用除subscribe、unsubscribe、psubscribe和punsubscribe这四个属于"发布/订阅"之外的命令,否则会报错。
-
模式订阅是psubscribe 命令,可以同时psubscribe 多个模式
模式订阅的示意图:
Q: 发布的消息会持久化嘛?
A: 不会,因此可靠性不佳。 而且客户端订阅时,不会收到之前发布过的消息
Q: 频道订阅的原理是怎么样的?底层结构是什么?#
A:
底层结构是字典+链表
客户端订阅后, redis会把客户端的连接信息放到这个频道的链表上。
redis发布时,根据字典找到链表,然后逐个发送。
Q: 模式订阅呢?又是怎么做的#
A:客户端做模式订阅时,会放到另一个链表上pubsubPattern,就不是字典了
链表里每个节点是 “1个客户端+1个模式”
当发布一个消息时, 除了频道字典里的发布, 还会去这个pubsubPattern里遍历,找到所有匹配的模式的客户端,然后发送。
注意模式是不存在字典的,所以如果真的订阅了很多相同的毛模式,是会重复发送的。