Redis中的订阅发布(一)

news2025/1/6 18:59:47

订阅发布

概述

Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过执行SUBSCRIBER命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者(subscribe):
每当有其他客户端向被订阅的频道发送消息(message)时,频道的所有订阅者都会收到这条消息.

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

例子

  • 举个例子。假设A、B、C三个客户端都执行了命令:
SUBSCRIBE "news.it"

那么这三个客户端就是"news.it"频道的订阅者,如图所示。如果这时某个客户端执行命令
在这里插入图片描述

PUBLISH "news.it" "hello"

向"news.it"频道发送消息"hello",那么"news.it"的三个订阅者都将收到这条消息,如图所示.在这里插入图片描述

  • 举个例子。假设如图所示:
    1.客户端A正在订阅频道"news.it"
    2.客户端B正在订阅频道"news.et"
    3.客户端C和客户端D正在订阅与"news.it"频道和"news.et"频道相匹配的模式"news.[ie]t".
    如果这时某个客户端执行命令
PUBLISH "news.it" "hello"

“news.it"频道发送消息"hello”,那么不仅正在订阅"news.it"频道的客户端A会受到消息,客户端C和客户端D也会收到消息,因为这两个客户端正在订阅匹配"news.it"频道的"news.[ie]t"模式,如图所示,

与此类似,如果某个客户端执行命令

PUBLISH "news.et" "world"

“news.et"频道发送消息"world”,那么不仅正在订阅"news.et"频道的客户端B会收到消息,客户端C和客户端D也同样会收到消息。因为这两个客户端正在订阅匹配"news.et"频道的"news.[ie]t"模式,如图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Redis中的发布订阅会进行持久化吗?

在Redis中,发布订阅(Pub/Sub)模式本身并不会进行消息的持久化。当消息被发布到频道时,它们会被发送给当前处于订阅状态的客户端,并在这些客户端中进行传递,但不会被持久化到磁盘上。如果需要对消息进行持久化,可以考虑以下几种方法:

  • 1.使用Redis Streams:Redis5.0引入了Streams数据结构,它提供更丰富的消息传递功能,并且支持消息的持久化。可以将消息发送到RedisStreams中,然后消费者可以按需读取消息,并且这些消息会持久化到Redis中
  • 2.将消息存储到数据库中:在订阅者接收到消息后,可以将消息存储到数据库中进行持久化。这样可以确保即使在Redis发布订阅模式中没有持久化消息的情况下,仍然可以通过数据库来获取消息历史记录
  • 3.使用Redis AOF持久化:如果仍然希望使用Redis发布订阅模式,并且希望对消息进行持久化,可以启用Redis的AOF(Append-Only File)持久化功能。AOF记录了Redis服务器接收到的所有写命令,包括发布消息到频道的命令。通过启用AOF持久化,可以确保即使Redis服务器重启,也不会丢失消息

综上所述,Redis发布订阅模式本身并不提供消息持久化功能,但可以通过其他方式来实现消息的持久化,来满足需求

频道的订阅与退订。

当一个客户端执行SUBSCRIBE命令订阅某个或某些频道的时候,这个客户端与被订阅频道之间建立起了一种订阅关系。Redis将所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里面,这个字典的键是某个被订阅的频道,而键的值则是一个链表,链表里面记录了所有订阅这个频道的客户端:

struct redisServer {
// ...

// 保存所有频道的订阅关系
dict *pubsub_channels:

// ...
};

例子

  • 举个例子。如图展示了一个pubsub_channels字典示例,这个字典记录了以下信息:
    1.client-1、client-2、client-3三个客户端正在订阅"news.it"频道
    2.客户端client-4正在订阅"news.sport"频道
    3.client-5和client-6两个客户端正在订阅"news.business"频道
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot源码解析(一):启动过程

springboot源码解析(一):启动过程 1、springboot的入口程序 SpringBootApplication public class StartupApplication {public static void main(String[] args) {SpringApplication.run(StartupApplication.class, args);} }当程序开始执行之后,会调用SpringAppli…

蓝桥杯第十五届javab组个人总结

javab组 额今天早上打完了得对自己此次比赛做总结,无论是明年还参赛还是研究生蓝桥杯,体验感有点差,第一题其实一开始想手算但怕进位导致不准确还是让代码跑了,但跑第202420242024个数(被20和24整除)一直把…

开展在即!中银富登邀您共赴雄安2024数字城市展览会(雄安建博会)

中银富登村镇银行:雄安新区金融创新的领航者 在即将举办的2024雄安数字城市建设展览会上,中银富登村镇银行将以其在金融创新和普惠金融服务领域的卓越表现,成为展会的一大亮点。作为雄安新区首家全国性银行业金融机构总部,中银富…

谈谈微前端

相关问题 为什么要用微前端微前端的优缺点 回答关键点 独立开发 独立运行 独立部署 自治 微前端是一种架构理念,它将较大的前端应用拆分为若干个可以独立交付的前端应用。这样的好处是每个应用大小及复杂度相对可控。在合理拆分应用的前提下,微前端能…

SQL--约束

文章目录 约束约束的分类:按照约束的作用效果不同唯一约束主键约束外键约束检查约束非空约束默认值约束 按照是否跟随列和字段属性来创建约束行级约束表级约束 创建约束创建唯一约束创建完表之后创建唯一约束创建表的同时创建唯一约束行级约束表级约束 约束 CONSTR…

高标准化及可扩展的产品能力,助力声通科技运营效率不断提升

高标准化及可扩展的产品能力对企业发展具有重要意义,有助于企业提高运营效率、增强市场竞争力,并推动企业实现规模化发展。上海声通信息科技股份有限公司(下文称:声通科技或公司)作为我国领先的企业级全栈交互式人工智…

GIS数据制备,空间分析与高级建模教程

原文链接:GIS数据制备,空间分析与高级建模教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601619&idx6&sn0231cde04d3657377587bd8015faf0e9&chksmfa820c34cdf58522df5a6eb2f44ee60630fd2d1132aa4517928a86591cc602da93aa…

常见的垃圾回收器(下)

文章目录 G1ShenandoahZGC 常见垃圾回收期(上) G1 参数1: -XX:UseG1GC 打开G1的开关,JDK9之后默认不需要打开 参数2:-XX:MaxGCPauseMillis毫秒值 最大暂停的时间 回收年代和算法 ● 年轻代老年代 ● 复制算法 优点…

测试用例的编写

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 软件测试用例得出软件测试用例的内容,其次,按照软件测试写作方法&#x…

nextjs渲染篇

1 服务器组件 默认情况下,Next.js 使用服务器组件。 1.1 服务器组件是如何呈现的? 在服务器上,Next.js 使用 React 的 API 来编排渲染。渲染工作被拆分为多个块:按单个路段和Suspense 每个区块分两个步骤呈现: Re…

程序中调用DB存储过程记得异常处理时尝试回滚可能存在的事务

程序中调用DB过程要注意这种情况: 有些存储过程需要执行比较久,在数据库中直接跑本身没有出错,但从程序中调用该存储过程会由于超时进入程序异常处理,这时数据库后台依然在跑着该存储过程,如果该存储过程中有启用事务…

选择生产制造项目管理系统?全面解析功能与实际应用!

生产效率和项目规划是制造企业亟需解决的难题,想要从容的应对这些挑战,离不开好用的生产制造项目管理系统。下面我们全面解析什么才能称得上是好用的生产制造项目管理系统。 一、好用的生产制造项目管理系统 什么样的项目管理系统才能算是好用呢&#x…

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标:让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…

【微信小程序】分包

整个小程序所有分包大小不超过 20M(开通虚拟支付后的小游戏不超过30M) 单个分包/主包大小不能超过 2M在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,客户端会把对应分包下载下来&#xf…

13段×5位LED数码管驱动数显驱动IC抗干扰数码屏驱动芯片VK1624 SOP24/DIP24

产品型号:VK1624 产品品牌:永嘉微电/VINKA 封装形式:SOP24/ DIP24 工程服务,技术支持! 概述 VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁存器、LED 驱动等电路。SEG脚…

Java中的容器,线程安全和线程不安全

Java中的容器主要指Java集合框架中的一系列类,它们提供了存储和操作对象的能力。在讨论容器的线程安全性时,我们可以将其分为两大类: 线程安全的容器: Vector: 这是ArrayList的线程安全版本,所有方法都被同步以确保在…

Win10本地更新无法升级win11 的0x80080005解决方法

Win10本地更新无法升级win11 Visual Studio 2022 运行项目时,本文提供了错误“指定的程序需要较新版本的 Windows”的解决方法。 更新时提示:0x80080005 解决方法 1、下载Windows11InstallationAssistant.exe 【免费】Windows11InstallationAssista…

ESP32 S3音频开发

1. 音频硬件框架 Codec:音频编解码芯片,一种低功耗单声道音频编解码器,包含单通道 ADC、单通道 DAC、低噪声前置放大器、耳机驱动器、数字音效、模拟混音和增益功能。它通过 I2S 和 I2C 总线与 ESP32-S3-WROOM-1 模组连接,以提供独…

FFmpeg: 自实现ijkplayer播放器--01项目简介

文章目录 项目介绍流程图播放器实现过程界面展示项目代码 项目介绍 此项目基于FFmeg中 ffplay.c进行二次开发,实现基本的功能,开发软件为Qt 项目优势: 参考ijkplayer播放器,实现UI界面和播放器核心进行解耦,容易添加…

【已解决】CondaError: Downloaded bytes did not match Content-Length

😎 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun,视频号:AI-行者Sun 🎈 本文专栏:本文收录于《AI实战中的各种bug…