《Redis源码学习笔记》文章列表
Redis的SUBSCRIBE命令,可以让客户端订阅任意数量的频道,每当有新消息发送到某个频道时,Redis就会把这消息发送给所有订阅该频道的客户端;如下图:客户端Client_1,Client_2,Client_3都订阅了频道channel,当有消息PUBLISH到频道channel时,这三个客户端都将收到消息:
原理: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. 了解发布订阅实现原理;
- 大小: 3.8 KB
- 大小: 4.3 KB
- 大小: 7.8 KB
分享到:
相关推荐
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 附件里面包括redis源码,phpredis源码,redis指令及文档
本文是一篇关于Redis全套学习笔记的文章,主要介绍了Redis的基础知识、数据结构、持久化、集群、高可用、性能优化等方面的内容。通过本文的学习,读者可以全面掌握Redis的使用和应用,提高自己的技术水平和实践能力...
redis实操代码 发布/订阅、Lua、PipeLine等
Redis全套学习笔记 完整版pdf.rar set:添加键值对 get:获取值 apend:追价值 strlen:获取值的长度 setnx:key不存在时,设置key的值 incr:原子递增1 decr:原子递减1 incrby/decrby:递增或者递减指定的数字 ...
Redis全套学习笔记-带章节目录
redis的学习笔记
Redis学习笔记.pdf 含目录 #资源达人分享计划#
一、 redis 环境搭建 2 二、 redis学习笔记之数据类型 3 三、 redis学习笔记之...六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
该文档介绍docker部署redis/mongod/rabbitmq/nacos/mysql等服务详细步骤
Redis支持跨进程发布订阅机制。代码实现了key过期的notification.
redis源码学习,分享给大家,希望对大家有用
java学习-Redis的安装/连接/Redis中的五种数据累心的基本操作/Redis的持久化方案-Rdb+AOF
Redis发布与订阅系统源码,统一配置更新数据库,亲测可用,简单易懂。切记运行程序前要开启Redis服务.
redis学习笔记
redis相关学习笔记
mv redis-3.0.7.tar.gz /usr/local/redis/ cd /usr/local/redis tar -xvf redis-3.0.7.tar.gz 5.安装c语言环境 yum install gcc-c++ 6.编译redis cd /usr/local/redis/redis-3.0.7 make 7.安装redis make ...
redis学习笔记redis 是一个开源的 key-value 数据库。它又经常被认为是一个数据结构服务器。 因为它的 value 不仅包括基本的 string 类型还有 list,set ,sorted set 和 hash 类型。当 然这些类型的元素也都是 string...
redis集群配置文件redis-6379.conf/redis-6380.conf
Redis全套学习笔记,分享的是整理的《Redis 全套学习笔记.pdf》,图文并茂,特别详细,基本上涵盖了 Redis 所有知识点。redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,...