Redis发布订阅模式实现原理

【Redis】第2篇 Redis如何实现发布订阅功能? 订阅一个或多个符合给定模式的频道;每个模式以 * 为匹配符。如e*,可以订阅通道为edgex,edge,edgefountry;# 订阅 module.* 频道3) (integer) 1 # 阻塞# 重新打开一个终端,发布# 阻塞频道有数据4) "html"# 阻塞频道有数据4) "vue"4) "html"4) "vue" 阅读详情

前言

        发布订阅系统在我们日常的工作中经常会使用到,这种场景大部分情况我们都是使用消息队列,常用的消息队列有 Kafka,RocketMQ,RabbitMQ,每一种消息队列都有其特性,很多时候我们可能不需要独立部署相应的消息队列,只是简单的使用,而且数据量也不会太大,这种情况下,我们就可以使用 Redis 的 Pub/Sub 模型。


一、Redis发布订阅

        Redis 的发布订阅功能主要由 PUBLISH,SUBSCRIBE,PSUBSCRIBE 命令组成,一个或者多个客户端订阅某个或者多个频道,当其他客户端向该频道发送消息的时候,订阅了该频道的客户端都会收到对应的消息。 

二、发布订阅模式的基本命令

Psubscribe 命令订阅一个或多个符合给定模式的频道。每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets )

        Psubscribe 命令基本语法如下:

PSUBSCRIBE pattern [pattern ...]

Redis Pubsub 命令用于查看订阅与发布系统状态,它由数个不同格式的子命令组成。

 PUBSUB <subcommand> [argument [argument ...]]

 Publish 命令用于将信息发送到指定的频道。

 Publish 命令基本语法如下:

PUBLISH channel message

Punsubscribe 命令用于退订所有给定模式的频道。

Punsubscribe 命令基本语法如下:

PUNSUBSCRIBE [pattern [pattern ...]]

Subscribe 命令用于订阅给定的一个或多个频道的信息。

Subscribe 命令基本语法如下:

SUBSCRIBE channel [channel ...]

Unsubscribe 命令用于退订给定的一个或多个频道的信息。

Unsubscribe 命令基本语法如下:

 UNSUBSCRIBE channel [channel ...]

三、发布订阅模式的实现原理

Redis通过PUBLISH、SUBSCRIBE和PSUBSCRIBE等命令实现了发布和订阅功能。

  • 通过SUBSCRIBE命令订阅某个频道后,redis-server里面维护了一个字典,字典的键就是一个个channel,而字典的值则是一个链表,链表中保存了所有订阅这个channel的客户端。SUBSCRIBE命令的关键,就是将客户端添加到指定channel的订阅链表中。
  • 通过PUBLISH命令向订阅者发送信息,redis-server会使用给定的频道作为键,在他所维护的channel字典中查找记录订阅该频道的所有客户端的链表,通过遍历这个链表,来将信息发布给所有的订阅者

Pub/Sub 底层存储结构

  订阅 Channel

在 Redis 的底层结构中,客户端和频道的订阅关系是通过一个字典加链表的结构保存的,形式如下:

在 Redis 的底层结构中,Redis 服务器结构体中定义了一个 pubsub_channels 字典

struct redisServer {

//用于保存所有频道的订阅关系

dict *pubsub_channels

}

在这个字典中,key 代表的是频道名称,value 是一个链表,这个链表里面存放的是所有订阅这个频道的客户端。

所以当有客户端执行订阅频道的动作的时候,服务器就会将客户端与被订阅的频道在 pubsub_channels 字典中进行关联。

这个时候有两种情况:

  • 该渠道是首次被订阅:首次被订阅说明在字典中并不存在该渠道的信息,那么程序首先要创建一个对应的 key,并且要赋值一个空链表,然后将对应的客户端加入到链表中。此时链表只有一个元素。

  • 该渠道已经被其他客户端订阅过:这个时候就直接将对应的客户端信息添加到链表的末尾就好了。

比如,如果有一个新的客户端 Client 08 要订阅 run 渠道,那么上图就会变成

如果 Client 08 要订阅一个新的渠道 new_sport ,那么就会变成

取消订阅

上面介绍的是单个 Channel 的订阅,相反的如果一个客户端要取消订阅相关 Channel,则无非是找到对应的 Channel 的链表,从中删除对应的客户端,如果该客户端已经是最后一个了,则将对应 Channel 也删除。

模式订阅结构

模式渠道的订阅与单个渠道的订阅类似,不过服务器是将所有模式的订阅关系都保存在服务器状态的pubsub_patterns 属性里面。

struct redisServer{

//保存所有模式订阅关系

list *pubsub_patterns;

}

与订阅单个 Channel 不同的是,pubsub_patterns 属性是一个链表,不是字典。节点的结构如下:

struct pubsubPattern{

//订阅模式的客户端

redisClient *client;

//被订阅的模式

robj *pattern;

} pubsubPattern;

其实 client 属性是用来存放对应客户端信息,pattern 是用来存放客户端对应的匹配模式。

所以对应上面的 Client-06 模式匹配的结构存储如下

在pubsub_patterns链表中有一个节点,对应的客户端是 Client-06,对应的匹配模式是run*。

订阅模式

当某个客户端通过命令psubscribe 订阅对应模式的 Channel 时候,服务器会创建一个节点,并将 Client 属性设置为对应的客户端,pattern 属性设置成对应的模式规则,然后添加到链表尾部。

  1. 创建新节点;

  2. 给节点的属性赋值;

  3. 将节点添加到链表的尾部;

退订模式

退订模式的命令是punsubscribe,客户端使用这个命令来退订一个或者多个模式 Channel。服务器接收到该命令后,会遍历pubsub_patterns链表,将匹配到的 client 和 pattern 属性的节点给删掉。这里需要判断 client 属性和 pattern 属性都合法的时候再进行删除。

遍历所有的节点,当匹配到相同 client 属性和 pattern 属性的时候就进行节点删除。

发布消息

当一个客户端执行了publish channelName message 命令的时候,服务器会从pubsub_channels和pubsub_patterns 两个结构中找到符合channelName 的所有 Channel,进行消息的发送。在 pubsub_channels 中只要找到对应的 Channel 的 key 然后向对应的 value 链表中的客户端发送消息。

干货 | Redis 实现发布订阅原理与实践 Redis 是完全开源的,高性能的 key-value 数据库,受到越来越多的业务场景应用。对于"发布/订阅"的消息模式,大家也许都比较了解,但是其实现原理及应用是否还存在模糊呢?今天计划同大家一起,深入浅出讲透 Redis 发布订阅,尽量通俗易懂,让大家轻松上手。在软件架构中,发布/订阅是一种消息模式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者),而是通过消息通道广播出去,让订阅该消息主题的订阅者消费到。Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制 阅读详情

相关推荐

Redis 发布订阅模式深度解析:原理、应用与实践

在现代分布式系统架构中,实时消息传递机制扮演着至关重要的角色。Redis 作为一款高性能的内存数据库,其内置的发布订阅(Pub/Sub)功能提供了一种轻量级、高效的消息通信方案。本文将全面剖析 Redis 发布订阅模式,从其基本概念、工作原理到实际应用场景,再到性能优化和替代方案比较,帮助开发者深入理解并正确运用这一强大的消息通信机制。

vvilkin的学习备忘 1355

Redis进阶——发布订阅详解

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 的subscribe命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。☛ 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:☛ 当有新消息通过publish。

qgnczmnmn的博客 3444

Redis 进阶篇:发布订阅模式原理与运用

Redis 发布订阅(Pus/Sub)是一种消息通信模式:发送者通过PUBLISH发布消息,订阅者通过SUBSCRIBE订阅接收消息或通过取消订阅。主要包含三个部分组成:「发布者」、「订阅者」、「Channel」。发布者和订阅者属于客户端,Channel 是 Redis 服务端,发布者将消息发布到频道,订阅这个频道的订阅者则收到消息。如下图所示,三个「订阅者」订阅「ChannelA」频道::订阅一个或者多个频道;退订指定频道;向指定频道发送消息;订阅指定模式;退订指定模式。

m0_67322837的博客 1294

发布订阅模式实现 java_Redis发布订阅原理以及java实现

一、Redis发布订阅原理 Redis的架构包括两个部分:Redis Client和Redis Server,即客户端和服务端。客户端负责向服务器端发送请求并接受来自服务器端的响应。服务器端负责处理客户端请求,例如:数据存储,获取数据,修改数据等。 Redis通常用作数据库,缓存以及消息系统。发布订阅的框架其中Publisher和Subscriber为Redis Client,chann...

weixin_35747051的博客 568

本地AI语音生成与配音工作台Pandrator:从TTS到RVC的完整实践指南

语音合成(TTS)技术通过深度学习模型将文本转换为自然语音,其核心原理涉及声学建模与波形生成。这项技术不仅提升了人机交互体验,更在内容创作领域展现出巨大价值,广泛应用于有声书制作、视频配音、虚拟助手等场景。本文聚焦于一个集成了XTTS-v2、RVC等先进模型的本地化AI语音工作台——Pandrator,它通过模块化架构将语音合成、声音克隆、音频转录与翻译等流程无缝整合,为用户提供了一个图形化、可定制的完整解决方案。文章深入解析了其基于TTS与RVC(Retrieval-based Voice Convers

weixin_42676876的博客 339

遗传算法优化光学超表面:智能设计突破纳米结构瓶颈

光学超表面设计本质上是一个高维、非线性、离散每个结构单元(如纳米砖柱、孔洞、十字架)有多个参数(长、宽、高、旋转角、材料),整个阵列的参数组合数量随单元数指数级增长。性能指标(如聚焦效率、工作带宽、偏振转换率、特定角度响应)往往无法用简单解析式表达,需依赖计算密集型电磁仿真(如FDTD, FDFD, RCWA)来评估。结构参数微小变化可能引起光学响应的剧烈跃变,目标函数存在多个局部最优解。实际制造通常要求结构参数取自有限的离散值(如特定刻蚀深度、材料库)。

weixin_51101456的博客 1139

Go语言实现Redis发布订阅模式的核心原理与实践

发布订阅模式是分布式系统中实现组件解耦的基础通信机制,通过消息的发布与订阅实现松耦合的交互方式。其核心原理基于频道(Channel)的消息路由,发布者将消息发送到特定频道,订阅者接收感兴趣频道的消息。这种模式在实时通知、事件驱动架构等场景具有重要技术价值,能够有效降低系统复杂度。Redis作为高性能内存数据库,其内置的PubSub功能通过轻量级设计实现了低延迟的消息传递。本文以Go语言为例,详细解析如何实现Redis的SUBSCRIBE、PUBLISH等核心命令,包括数据结构设计、协议实现和并发控制等关键技

weixin_30855761的博客 423

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载)

本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。

weixin_29223603的博客 387

Redis的发布订阅模式

我们知道,Redis经常被用来作为缓存服务器,其实除了缓存,redis也有发布订阅的功能,今天我们简单了解一下redis的发布订阅模式的功能和使用方法。

u012559967的专栏 739

基于STM32的无人机智能避障与路径规划系统设计

本文详细介绍了基于STM32的无人机智能避障与路径规划系统设计,涵盖硬件选型、传感器组合、软件架构及算法实现。通过多传感器数据融合和改进的VFH+算法,系统在复杂环境中实现92%以上的避障成功率。STM32微控制器的实时性和低功耗特性为无人机自主导航提供了可靠保障,适用于工业巡检、仓储物流等场景。

blockchain9miner的博客 875

17、Nimble 包开发与并行编程指南

本文介绍了Nimble包的开发与版本管理流程,涵盖语义化版本控制规范及发布步骤;深入探讨了Nim中的并行编程基础,包括并发与并行的区别、threads模块与threadpool模块的使用方法及其差异;分析了线程执行的不确定性、线程池的优势,并提供了线程同步和资源管理的实践示例,帮助开发者高效构建稳定、高性能的Nim应用程序。

wine的专栏 54

Redis发布订阅与原理

...,服务器到字典中找到频道的键并删除该客户端的信息。如果删除后链表为空,则将键一并删除。Redis服务器根据频道名到字典中查找对应的订阅客户端链表,然后将信息发送给所有的订阅者。......

geek! 732

某联达OA任意用户登录漏洞复现

由于`/WebService/Lk6SyncService/DirectToOthers/GetSSOStamp.asm`j接口未作限制,导致可以通过该接口调用`admin`的`cookie`值,通过对`LoginCredence`和`LoginTimestamp`的参数修改,进而实现任意登录进去系统.

千寻的博客 1587

【进阶篇】2.16 Redis 消息传递发布订阅模式详解

发布订阅模式(Publish-Subscribe Pattern)是一种消息传递模式,其基本原理是消息的发送者(发布者)不会直接发送消息给特定的接收者(订阅者),而是将消息分成不同的类别(频道),然后将消息发送给订阅了这些类别的所有接收者。发布订阅模式在分布式系统中广泛应用,例如实时消息推送、日志收集等。在 Redis 中,发布订阅模式有两个主要的角色:发布者和订阅者。

日拱一卒无有尽,功不唐捐终入海 3752

工业级实战:C#上位机集成YOLO实现多目标跟踪(含数据库存储+报表导出)

推理核心:ONNX Runtime实现C#直接推理YOLO模型,GPU优先+CPU降级适配工业机;跟踪核心:SORT算法轻量级实现多目标跟踪,保证工业场景实时性与稳定性;数据核心:MySQL存储+本地缓存,Excel报表标准化导出,满足工业数据追溯与质检需求;部署核心:模型优化、GPU加速、开机自启,保证工业级7x24小时运行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 473

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 606

Redis的发布订阅模式详解

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。

埃泽漫笔 1305

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Springboot+Redis- 实现发布订阅

1.发布订阅原理分析 1.1发布订阅模式 在软件架构中,发布/订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者),而是通过消息通道广播出去,让订阅改消息主题的订阅者消费到。发布/订阅者模式最大的特点就是实现了松耦合,也就是说你可以让发布者发布消息、订阅者接受消息,而不是寻找一种方式把两个分离的系统连接在一起。当然这种松耦合也是发布/订阅...

liulianglin的专栏 1276

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

redis发布/订阅模式

其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果博主发表了文章,那么100个人就会同时收到通知邮件,除了这个 场景还能找到其他场景么,当然有啦,你想想,如果你要在内存里面做一个读写分离的程序,为了维持数据的完整性,你是不是需要保证在写入 的时候,也要分发到各个读内存的程序中呢?所以说场景还是很多的,在于你...

weixin_33795093的博客 2565

Redis发布订阅

一 、redis发布订阅模式队列:基于 list 结构的消息队列,是一种 Publisher 与 Consumer 点对点的强关联关系通道channel:可实现消费者订阅多个通道模式Pattern:与通道的区别是 1、模式无需完整的通道名称订阅,用模糊订阅(通过?,*来代替)二、通道与模式两者订阅模式原理实现通道:内部实现是通过(PubSub_Channel)键对值,key(数组元素)为channel,value就是某个clientPattern。

m0_55736088的博客 3766

Redis--发布订阅--原理/使用场景

本文介绍Redis的发布订阅功能。 实际项目中一般会用MQ(如:RabbitMQ、RocketMQ、Kafka)作为发布订阅的中间件。Redis的发布订阅很少用到。

IT利刃出鞘的博客 7673

nodejs redis 发布订阅_Redis发布订阅机制,面试必知必会

1.Redis发布订阅架构Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。2.Redis发布订阅功能...

weixin_39853590的博客 124

Redis进阶篇:发布订阅模式原理与运用

Redis 发布订阅(Pus/Sub)是一种消息通信模式:发送者通过PUBLISH发布消息,订阅者通过SUBSCRIBE订阅接收消息或通过取消订阅。主要包含三个部分组成:「发布者」、「订阅者」、「Channel」。发布者和订阅者属于客户端,Channel 是 Redis 服务端,发布者将消息发布到频道,订阅这个频道的订阅者则收到消息。...

m0_73088370的博客 439

可能你没听过redis发布订阅模式

一 前言 虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!! 二发布订阅模式 PUBLISH 命令向通道发送信息,此客户端称为publisher 发布者; SUBSCRIBE 向命令通道订阅信息,此客户端称为subscriber 订阅者; redis 中 发布订阅模块的名字叫着 PubSub,也就是 PublisherSubscriber; 一个发布者向一个通道发送消息,订阅者可以向多个通道订阅消息;当发布者向通道发布消息后,如果有订阅者订阅该通道,订阅者就会收到消息;这有点像电台,

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 397
上一篇: MySql自定义排序 order by field()
下一篇: SpringBoot整合WebSocket(session共享实现)
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值