《Redis源码学习笔记》发布/订阅
来源:互联网 发布:淘宝消保怎么交 编辑:程序博客网 时间:2024/06/05 14:54
Redis的SUBSCRIBE命令,可以让客户端订阅任意数量的频道,每当有新消息发送到某个频道时,Redis就会把这消息发送给所有订阅该频道的客户端;如下图:客户端Client_1,Client_2,Client_3都订阅了频道channel,当有消息PUBLISH到频道channel时,这三个客户端都将收到消息:
原理:RedisServer内部维护了一个pubsub_channels字典,其中字典的键就是被订阅的频道,而键值就是订阅该频道的客户端列表;
这样,当一个客户端执行PUBLISH channel_name命令时,Redis就可以根据channel_name在pubsub_channels中找到与其关联的客户端列表,然后把消息发送给它们,伪代码;
另外,客户端自己也维护了一个pubsub_channels属性,用来记录自己订阅了哪些频道;同watched_keys属性一样(详情请参看 事务章节),客户端维护这些也是出于效率考虑的:
a. 防止订阅相同的频道;
b. 在UNSUBSCRIBE时,可以快捷的取消该客户端订阅的所有频道,而无需遍历整个redisServer.pubsub_channels字典,伪代码:
考虑这么一个需求:有两个频道,名字都以“hello_开头”,分别叫做hello_1, hello_2;当我们要订阅这类频道时,我们可能会这么写:SUBSCRIBE hello_1 hello_2,但是如果有100个难道要这样写 SUBSCRIBE hello_1 hello_2 ... hello_100? 这时候我们可以使用“模式订阅”命令PSUBSCRIBE, 譬如这里我们就可以写成,PSUBSCRIBE hello_* ;这样,当一个客户端执行PUBLISH命令时,redis不仅会把消息发送给所有订阅该频道的客户端列表,同时也会把该频道与所有模式匹配,如果匹配成功,则把消息同样发送给订阅该模式的客户端列表:
所以完整的PUBLISH命令伪代码如下:
更多细节请看:pubsub.c/publishCommand函数
总结:
1. 熟悉发布订阅相关命令:subscribe/unsubscribe psubscribe/punsubscribe publish;
2. 了解发布订阅实现原理;
原理:RedisServer内部维护了一个pubsub_channels字典,其中字典的键就是被订阅的频道,而键值就是订阅该频道的客户端列表;
这样,当一个客户端执行PUBLISH channel_name命令时,Redis就可以根据channel_name在pubsub_channels中找到与其关联的客户端列表,然后把消息发送给它们,伪代码;
- def publishCommand(channel, msg):
- # 获取订阅channel的所有客户端列表
- client_list = redisServer.pubsub_channels.get(channel)
- if client_list is None: return
- # 向每个客户端发送消息
- for client in client_list:
- client.sendMessage(msg)
另外,客户端自己也维护了一个pubsub_channels属性,用来记录自己订阅了哪些频道;同watched_keys属性一样(详情请参看 事务章节),客户端维护这些也是出于效率考虑的:
a. 防止订阅相同的频道;
- def subscribeCommand(client, channels):
- for ch in channels:
- # 如果已经订阅了该频道,则跳过
- if ch in client.pubsub_channels: continue
- # 把client添加到该频道关联的客户端列表
- client_list = redisServer.pubsub_channels.get(ch)
- client_list.add(client)
- client.pubsub_channels.add(ch)
b. 在UNSUBSCRIBE时,可以快捷的取消该客户端订阅的所有频道,而无需遍历整个redisServer.pubsub_channels字典,伪代码:
- def unsubscribeCommand(client):
- # 获取client订阅的所有频道
- channels = client.pubsub_channels
- # 遍历频道
- for ch in channels:
- client_list = redisServer.pubsub_channels(ch)
- # 从该频道关联的客户端列表中,删除client
- client_list.del(client)
- client.pubsub_channels.del(ch)
考虑这么一个需求:有两个频道,名字都以“hello_开头”,分别叫做hello_1, hello_2;当我们要订阅这类频道时,我们可能会这么写:SUBSCRIBE hello_1 hello_2,但是如果有100个难道要这样写 SUBSCRIBE hello_1 hello_2 ... hello_100? 这时候我们可以使用“模式订阅”命令PSUBSCRIBE, 譬如这里我们就可以写成,PSUBSCRIBE hello_* ;这样,当一个客户端执行PUBLISH命令时,redis不仅会把消息发送给所有订阅该频道的客户端列表,同时也会把该频道与所有模式匹配,如果匹配成功,则把消息同样发送给订阅该模式的客户端列表:
所以完整的PUBLISH命令伪代码如下:
- def publishCommand(channel, msg):
- # 获取订阅channel的所有客户端列表
- client_list = redisServer.pubsub_channels.get(channel)
- if client_list is None: return
- # 向每个客户端发送消息
- for client in client_list:
- client.sendMessage(msg)
- # 遍历pubsub_patterns
- for pattern, client in redisServer.pubsub_patterns:
- # 若模式与channel匹配,则把消息发送给订阅该模式的客户端
- if pattern.match(channel):
- client.sendMessage(msg)
更多细节请看:pubsub.c/publishCommand函数
总结:
1. 熟悉发布订阅相关命令:subscribe/unsubscribe psubscribe/punsubscribe publish;
2. 了解发布订阅实现原理;
0 0
- 《Redis源码学习笔记》发布/订阅
- Redis学习笔记8--Redis发布/订阅
- Redis学习笔记8--Redis发布/订阅
- 六 redis学习笔记之发布订阅
- redis学习笔记六之发布订阅
- redis学习笔记六之发布订阅
- 六 redis学习笔记之发布订阅
- redis学习笔记 发布与订阅
- 【学习笔记】Redis(3)-发布与订阅
- redis学习笔记:发布和订阅
- [Redis学习笔记]-Redis 发布订阅(充当消息组件)
- 【Redis笔记】9.发布订阅
- 《Redis设计与实现》学习笔记-发布订阅与事务
- 发布与订阅消息--Redis学习笔记八
- redis学习笔记(20)---发布与订阅
- Redis系列学习笔记10 发布与订阅
- redis学习笔记七之发布订阅、编码格式
- Redis学习笔记(6)消息的订阅与发布
- android 编译image指令
- 根据用户id获取其所有微博
- 在无修改权限的情况下修改文件hosts中的内容
- 大整数取模
- 用Total Commander替换windos默认资源管理器的方法
- 《Redis源码学习笔记》发布/订阅
- weiciyuan代码阅读2
- ZigBee组网学习笔记(八)--温度传感器
- linux的hostname修改详解
- PhotoShop算法实现进阶-模糊滤镜-径向模糊(二十五)
- 有向图强连通分量的Tarjan算法
- 《Redis源码学习笔记》事务
- 《Redis源码学习笔记》键过期
- 黑马程序员——C语言基础——sizeof、strlen、printf小结