redis发布和订阅解析
目录
一 订阅频道和发布信息
功能说明 : redis的subscribe命令可以让客户端订阅任意数量的频道,每当有新信息发送到被订阅的频道时 ,信息就会被发送给所有订阅指定频道的客户端
订阅例子示意图 : 下图展示了channel1 , 以及订阅了这个频道的三个客户端--- client1 , client2 , client5
发布例子示意图 : 当有新消息通过 publish命令发送给频道channel1时, 这个消息就会被发送给订阅它的三个客户端
二 订阅频道结构原理解析
说明 : 每个redis服务器进程都维持着一个表示服务器状态的redis.h/redisServer结构的pubsub_channels属性的一个字典,这个字典用来保存订阅频道的信息, 其中,字典的键为正在被订阅的频道,而字典的值则是一个链表, 链表中保存了所有订阅这个频道的客户端
例子示意图 : 在下表展示的这个pubsub_channels示例中, client2,client5,client1就订阅了channel1,而其他频道页分别被别的客户端订阅
操作 : 当客户端调用subscribe命令时 , 程序就将客户端和要订阅的频道在pubsub_channels字典中关联起来
示意图 : 如果客户端client10086 执行命令 subscribe channel1 channel2 channel3 , 那么前面展示的pubsub_channels将变成下面的样子
三 发布信息到频道结构解析
原理说明 : 当调用publish channel message命令, 程序首先根据 channel定位到字典的键 , 然后将信息发送给字典值链表所有的客户端
例子示意图 : 对于以下这个pubsub_channels实例 , 如果某个客户端执行命令publish channel1 "hello hctrl" , 那么client2 client5 和client1这三个客户端都将接收到 "hello moto"信息 ,通过遍历订阅频道的所有客户端