Redis深入浅出【八】发布与订阅

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

Redis的发布与订阅,有点类似于消息队列,发送者往频道发送消息,频道的订阅者接收消息。

1. 发布与订阅示例

首先,在本机开启第1个Redis客户端,执行如下命令订阅blog.redis频道:

SUBSCRIBE "blog.redis"

然后,在本机开启第2个Redis客户端,执行相同的命令订阅blog.redis频道:

然后,开启第3个Redis客户端,执行如下命令往blog.redis频道发送消息:

PUBLISH blog.redis "redis-in-action-01"

查看客户端1和客户端2,分别看到如下信息:

3个客户端与频道的关系如下图所示:

可以通过INFO clients命令查看连接的客户端数:

2. 订阅/退订频道

2.1 订阅频道

Redis的SUBSCRIBE命令用来订阅频道,使用方式如下所示:

SUBSCRIBE "blog.redis"

如果是订阅多个频道,可以使用如下所示命令:

SUBSCRIBE "blog.redis" "blog.rocketmq"

Redis将所有频道的订阅关系保存在服务器状态的pubsub_channels字典里,字典的键是某个被订阅的频道,键对应的值是1个链表,链表里记录了所有订阅这个频道的客户端。

以上图为例,说明客户端1、客户端2正在订阅频道"blog.redis",客户端3、客户端4正在订阅频道“blog.rocketmq”。

如果此时有1个客户端5,执行了如下命令:

SUBSCRIBE "blog.rocketmq" "blog.java"

那么服务器状态保存的频道订阅关系将变为如下图所示:

2.2 退订频道

Redis的UNSUBSCRIBE命令用来退订频道,使用方式如下所示:

UNSUBSCRIBE "blog.redis"

如果是退订多个频道,可以使用如下所示命令:

UNSUBSCRIBE "blog.redis" "blog.rocketmq"

假设现在服务器状态保存的频道订阅关系如下图所示:

如果此时客户端5,执行了如下命令:

UNSUBSCRIBE "blog.rocketmq" "blog.java"

那么服务器状态保存的频道订阅关系将变为如下图所示:

3. 订阅/退订模式

3.1 示例

首先,启动1个Redis客户端,执行如下命令订阅模式“blog.r*”:

PSUBSCRIBE "blog.r*"

然后,启动另1个Redis客户端,执行PUBLISH命令往频道发送消息:

PUBLISH "blog.redis" "redis-in-action-01"

PUBLISH "blog.rocketmq" "rocketmq-in-action-01"

PUBLISH "blog.java" "java-in-action-01"

可以看到,第1次启动的客户端可以接收到前2条消息,因为频道"blog.redis"、"blog.rocketmq"匹配模式“blog.r*”:

但频道"blog.java"不匹配该模式,所以最后1次发送的消息,该客户端未接收到。

3.2 订阅模式

Redis的PSUBSCRIBE命令用来订阅模式,使用方式如下所示:

PSUBSCRIBE "blog.r*"

如果是订阅多个模式,可以使用如下所示命令:

PSUBSCRIBE "blog.r*" "blog.j?va" "blog.j[ae]va"

Redis将所有模式的订阅关系保存在服务器状态的pubsub_patterns属性里。

pubsub_patterns属性是1个链表,链表中的每个节点是1个pubsub_Pattern结构,这个结构的pattern属性记录被订阅的模式,client属性记录订阅模式的客户端。

以上图为例,说明客户端1正在订阅模式"blog.r*,客户端2正在订阅模式“blog.j?va”。

如果此时有1个客户端3,执行了如下命令:

PSUBSCRIBE "blog.j[ae]va"

那么服务器状态保存的模式订阅关系将变为如下图所示:

3.3 退订模式

Redis的PUNSUBSCRIBE命令用来退订模式,使用方式如下所示:

PUNSUBSCRIBE "blog.r*"

如果是退订多个模式,可以使用如下所示命令:

PUNSUBSCRIBE "blog.j?va" "blog.j[ae]va"

假设现在服务器状态保存的模式订阅关系如下图所示:

如果此时客户端3,执行了如下命令:

PUNSUBSCRIBE "blog.j[ae]va"

那么服务器状态保存的模式订阅关系将变为如下图所示:

4. 发送消息

如果,服务器状态保存的频道订阅关系如下图所示:

服务器状态保存的模式订阅关系如下图所示:

此时,如果1个Redis客户端执行了以下PUBLISH命令:

PUBLISH blog.redis "redis-in-action-01"

那么,服务器会执行以下2个动作:

  1. 将消息"redis-in-action-01"发送给频道“blog.redis”的所有订阅者
  2. 将消息"redis-in-action-01"发送给与频道“blog.redis”相匹配模式的订阅者

也就是说,消息"redis-in-action-01"不仅会发送给频道“blog.redis”的订阅者客户端1、客户端2,也会发送给与频道“blog.redis”相匹配的模式“blog.r*”的订阅者客户端5。

5. 查看订阅信息

可以使用Redis的PUBSUB命令来查看频道或者模式的相关信息。

5.1 查看被订阅的频道

如果想要查看被订阅的频道信息,可以使用命令PUBSUB CHANNELS [pattern],其中pattern参数是可选的:

  1. 如果不指定pattern参数,返回服务器当前被订阅的所有频道
  2. 如果指定pattern参数,返回服务器被订阅的频道中与pattern模式相匹配的频道

这个命令的实现原理是通过遍历服务器状态保存的pubsub_channels字典来实现的。

举个具体的例子,如果服务器状态保存的pubsub_channels字典如下所示:

那么执行命令PUBSUB CHANNELS的返回结果如下所示:

执行命令PUBSUB CHANNELS r*的返回结果如下所示:

5.2 查看频道的订阅者数量

如果想要查看频道的订阅者数量,可以使用命令PUBSUB NUMSUB [channel1 channel2 ... channeln]。

这个命令的实现原理是通过遍历服务器状态保存的pubsub_channels字典来实现的,频道对应的订阅者链表的长度就是该频道的订阅者数量。

举个具体的例子,如果服务器状态保存的pubsub_channels字典如下所示:

那么执行命令PUBSUB NUMSUB blog.redis blog.rocketmq blog.java的返回结果如下所示:

5.3 查看被订阅模式的数量

如果想要查看被订阅模式的数量,可以使用命令PUBSUB NUMPAT。

这个命令的实现原理是返回服务器状态保存的pubsub_patterns链表的长度。

举个具体的例子,如果服务器状态保存的pubsub_patterns链表如下所示:

那么执行命令PUBSUB NUMPAT的返回结果如下所示:

6. 总结

Redis的发布与订阅有点类似于消息队列的发布与订阅,主要包含以下7个命令:

  1. SUBSCRIBE
  2. UNSUBSCRIBE
  3. PSUBSCRIBE
  4. PUNSUBSCRIBE
  5. PUBSUB CHANNELS
  6. PUBSUB NUMSUB
  7. PUBSUB NUMPAT

这7个命令的核心都是基于存储在服务器状态的pubsub_channels字典和pubsub_patterns链表实现的。

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

相关推荐

2025-03-21(DS复习): Databricks 的技术架构

Databricks 的技术架构以 ​为核心,构建了一套高度集成、可扩展且支持多云环境的统一分析平台。其架构设计注重存储与计算的深度融合,并通过丰富的服务层功能简化了数据工程、机器学习和数据科学的工作流。

baidu_24377669的博客 1429

redis的事务机制详解

一、Redis的事务定义 Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 二、multi、exec、discard命令 在Redis中从输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入exec后,Redis会将之前的命令队列中的命令依次执行。 在组队的过程中可以通过discard来放弃组队,这样先前输入的命令也都将

weixin_48016395的博客 2626

【k8s实战】 在离线项目混部 通过kubeflow(tf-operator)部署TensorFlow机器学习任务+prometheus/grafana监控资源使用全过程(最新 图文)

目录在离线混合部署概念最新版kubeflow部署TensorFlow部署二级目录三级目录 在离线混合部署概念 先举一个例子,众所周知的天猫双十一当天的流量非常之大,那么就需要成百上千台服务器构成一个超大集群来提供计算能力,但是双十一过去之后,集群资源就面临着浪费的局面。假设业务分为在线和离线两种模式:在线任务需要资源相对较少,但要求响应时间短;离线任务则不需要对任务进行迅速响应,但是计算量相对较大、占用资源多。那么我们应该怎么在K8S集群上完成这两种业务的部署、并且使得CPU利用率始终维持在一个比较高的水平

Eros1on的博客 1548

redis的事务

redis通过 multi, exec等命令来实现事务功能,是一种在一个事务内,将事务内的多个请求打包,然后一次性、按顺序地执行多个命令,在事务执行期间,服务器而改去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。

Zj_boring的博客 1777

IC618新手避坑指南:从零在Linux上配置Cadence Virtuoso环境(含cds.lib文件详解)

本文详细介绍了在Linux系统上配置Cadence Virtuoso IC618环境的完整指南,特别针对新手常见问题提供解决方案。重点解析了cds.lib文件的关键配置,包括库路径定义和工艺库管理,并分享了高效工作流设置和典型问题排查技巧,帮助工程师快速搭建稳定的EDA设计环境。

weixin_26805597的博客 557

什么是Claude 的 Agent Skills?

摘要: Claude的Agent Skills功能支持通过结构化技能包(含指令、脚本、工具)实现任务自动化,如数据分析、文档生成等。核心能力包括:1)技能包管理(如Python脚本+模板);2)工具调用(API/数据库交互);3)子代理协作(拆分复杂任务)。快速上手步骤:创建技能包(如Excel报表生成)、配置工具权限、触发执行;支持多代理并行处理(如SQL查询+可视化)。关键技巧:工具需明确定义参数、利用子代理共享上下文、注重权限管控。官方文档与社区资源提供进阶指导,使Claude成为可编程的数字助手。

jobleap.cn求职助手首页 1730

Redis 事务的实现详解

在数据库中,事务是一个逻辑操作单元,包含一组要么全部成功执行、要么全部失败的操作。事务通常满足ACID原子性:事务中的所有操作要么全部成功,要么全部失败回滚。一致性:事务执行前后,数据必须处于一致的状态。隔离性:多个事务之间相互独立,不会相互干扰。持久性:事务一旦提交,数据就会被永久保存。

lssffy的博客 1599

STM32 移植LwIP 实现网线插拔自动恢复

STM32 移植LwIP 之后,能正常联网通讯,但是发现2个问题, 1、上电初始化前,未插入网线,之后就无法获取到IP地址(DHCP) 2、正常通讯过程中,拔掉网线,然后插回去,不知道如何复位 先看一下LWIP初始化代码 /** * LwIP initialization function */ int MX_LWIP_Init() { /* Initilialize the LwIP stack with RTOS */ tcpip_init( NULL, NULL );

tiantangmoke的博客 8074

Redis中的事务机制

事务表示一组动作,要么全部执行,要么全部不执行。例子如下。Redis提供了简单的事务功能,讲一组需要一起执行的命令放到multi和exec两个命令之间。multi命令代表事务开始,exec命令代表事务结束,如果要停止事务的执行,可以使用discard命令代替exec命令即可。它们之间的命令是原子执行的。

Cover_sky的博客 1378

多智能体强化学习算法【三】【QMIX、MADDPG、MAPPO】

相关文章: 1.QMIX算法简述 QMIX是一个多智能体强化学习算法,具有如下特点: 1. 学习得到分布式策略。 2. 本质是一个值函数逼近算法。 3. 由于对一个联合动作-状态只有一个总奖励值,而不是每个智能体得到一个自己的奖励值,因此只能用于合作环境,而不能用于竞争对抗环境。 4. QMIX算法采用集中式学习,分布式执行应用的框架。通过集中式的信息学习,得到每个智能体的分布式策略。 5. 训练时借用全局状态信息来提高算法效果。是后文提到的VDN方法的改进。 6. 接上一条,QMIX设计一个神经网络来

丨汀、的博客 5472

MVSNet (pytorch版) 搭建环境 运行dtu数据集重建 实操教程(图文并茂、超详细)

MVSNet (pytorch版) 代码注释版 下载 (注释非常详细,代码结构有所调整,使用起来更方便) 深度学习三维重建 MVSNet-ECCV-2018 (源码、pytorch版、原文+注释、译文+批注)Meshlab查看三维点云时 ,使用技巧总结。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2938

redis-事务

指令: multi:表示事务的开始 exec:表示执行事务 discard:表示事务的丢弃 watch:监视某个变量的状态 当一个客户端处于事务状态时,这个客户端发送的命令,服务器是否会立即执行,分为以下2种情况: 如果客户端发送的命令为MULTI、EXEC、WATCH、DISCARD四个命令中的其中1个,服务器会立即执行这个命令。 如果客户端发送的命令为以上4个命令外的其它命令,服务器不会立即执行这个命令,而是将其放到事务队列里,然后向客户端返回QUEUED回复。服务器一旦收到exec指令,才开始执行整个

nice_good_boy的博客 138

这才是 Python 的正确玩法!用强化学习 (RL) 训练 AI 玩《王者荣耀》,胜率 90%!

大家打排位时,一定遇到过那种“意识神级、操作零失误”的对手,或者“走位呆滞、送人头”的队友。以前的“人机”是程序员写死的脚本(If 血量<20% Then 回城)。而现在的顶级 AI(如腾讯绝悟、OpenAI Five),是靠强化学习 (Reinforcement Learning)自己“左右互搏”练出来的。今天,我们不谈枯燥的数学公式,我将手把手教你用,搭建一个能玩 MOBA 游戏的 AI Agent。即使不能去 KPL 打职业,虐一下钻石局还是绰绰有余的!

BUG猿的博客 1182

深入浅出Redis【七】发布与订阅

SUBSCRIBEPSUBSCRIBE这7个命令的核心都是基于存储在服务器状态的字典和链表实现的。

mifffy_java的博客 1104

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入浅出Redis消息订阅与发布

通过本文的介绍,我们了解了 Redis 发布/订阅模式的工作原理和适用场景,学习了如何在 Spring Boot中使用 Redis 实现消息通讯,并通过一个实际的聊天室应用演示了发布/订阅模式的具体实现。希望本文能够帮助您更好地理解和使用 Redis 的发布/订阅功能。

675

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

实用 | Redis 实现发布订阅原理与实践

我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。写在前面Redis 是完全开源的,高性能的 key-value 数据库,...

架构精进之路 697

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深入浅出Redis(九):Redis的发布订阅模式

本文围绕Redis的发布订阅模型,深入浅出描述了发布订阅模型的使用、发布订阅模型实现的数据结构以及使用发布订阅模型的场景发布订阅是一种通信模式,哨兵通过发布订阅来与节点进行交流,发布订阅能够实现关注、订阅系统的实现发布订阅的两种方式订阅频道、模式是通过维护频道字典和模式链表实现的,其中发送消息会先遍历字典和链表找出匹配频道的订阅客户端进行发送,其他pubsub相关查看订阅信息命令都是从频道字典和模式链表中获取信息本篇文章笔记以及案例被收入感兴趣的同学可以stat下持续关注喔~

关注菜菜的后端私房菜,获取更多技术干货~ 514

大数据-42 Redis 发布/订阅详解:机制、弱事务性与实际风险分析

Redis 发布/订阅(Pub/Sub)是一种轻量级消息通信机制,支持客户端订阅频道,并由发布端向频道推送消息,订阅端实时接收。它适合实时通知、日志分发等场景,但存在“弱事务性”:不持久、不确认、无重试。消息只会被当前在线的订阅者接收,无法确保送达与处理成功,易丢失且不可恢复。相比之下,Redis 的事务机制(multi/exec)虽支持一组命令的原子执行,但也不支持回滚,属于“弱事务模型”。因此,在对一致性和可靠性要求较高的业务场景中,推荐使用 Redis Streams 或 Kafka

谢谢你的喜欢 我们一起无限进步 2425

深入浅出Redis之发布与订阅

除了订阅频道之外,客户端还可以通过执行PSUBSCRIBE命令订阅一个或多个模式,从而成为这些模式的订阅者:每当有其他客户端向某个频道发送消息时,消息不仅会被发送给这个频道的所有订阅者,它还会被发送给所有与这个频道相匹配的模式的订阅者。通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者( subscriber ):每当有其他客户端向被订阅的频道发送消息( message)时,频道的所有订阅者都会收到这条消息。将消息发送给频道订阅者。将消息发送个模式订阅者。

muweiyun的博客 249

Redis深入浅出笔记总结

1.redis五种数据类型和消息订阅 1、 Redis String数据结构 简介:String是最常用的一种数据类型,普通的key/value存储都可以归为此类 1、set/get 1)设置key对应的值为String类型的value 2)获取key对应的值 2、mget ...

one 2369

Redis发布订阅

1、什么是Redis发布订阅   进程间的一种消息通信模式:发送者(Pub)发布信息,订阅者(Sub)接受信息。 2、案例   案例1:一次订阅多个SUBSCRIBE c1 c2 c3 消息发布c2 hello-c2 127.0.0.1:6379> SUBSCRIBE c1 c2 c3 Reading messages... (press Ctrl-C to...

weixin_30696427的博客 114

Spring Boot整合Redis:实现高效发布/订阅功能

Spring Boot整合Redis:实现高效发布/订阅功能 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代应用开发中,实时消息传递和事件驱动架构变得越来越重要。为了帮助开发者更好地掌握这一技术,我们推出了一个专门针对Spring Boot整合Redis实现发布/订阅功能的教程配套源码。这个项目不仅提供了详细的代码示例,还通过博客文章的形式,深入浅出地讲解了如何...

gitblog_09774的博客 488

Redis 深入浅出

使用redis有哪些好处? 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 支持丰富数据类型,支持string,list,set,sorted set,hash 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 redis相比m...

qq_37305160的博客 510

视频教程-Redis深入浅出-NoSQL

Redis深入浅出 江湖花名"King"全栈工程师,开发工程师。曾就职于达内...

weixin_30054317的博客 201

redis深入浅出

Redis是一个开源的内存数据结构存储系统,支持多种数据类型,如string、list、set、hash等。它是一个高性能的key-value数据库,可以用于缓存、消息队列、排名等场景。本文将深入浅出地介绍Redis的基础知识,高级特性,优化与应用、以及常见问题解决。我们还将探讨Redis的安全和备份问题,提供了一些设置和备份操作建议,以保证数据的安全和可靠性。接下来我为大家系统的介绍一下redis,后续对于每个章节都会做详细的说明。

gao571920436的博客 220

Redis深入浅出

常识 一个value最大是512m 一个hash可以存储2的三十二次方-1个键值 一个list可以存储2的三十二次方-1个元素 一个set可以存储2的三十二次方-1个元素 如果存储为字符串,可以用tableName????field设计key 如果设计为hash,并映射关系型数据库的表,可以用tableName:id设计整个hash表key,然后表的字段用hash的子key表示 一条评论信息,因为需要...

Code changes the world! 463
上一篇: 深入浅出Redis【七】发布与订阅
下一篇: Redis深入浅出【九】Redis的事务机制
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值