Redis 发布订阅模式详解:实现高效的消息通信
目录
引言
1. 什么是 Redis 发布订阅模式?
1.1 定义
1.2 核心概念
2. Redis 发布订阅的工作原理
2.1 基本流程
2.2 示例
2.3 频道与模式订阅
3. Redis 发布订阅的使用场景
3.1 实时消息通知
3.2 事件驱动架构
3.3 日志收集与分发
3.4 分布式锁与协调
4. Redis 发布订阅的优缺点
4.1 优点
4.2 缺点
5. Redis 发布订阅的实际应用示例
5.1 实时聊天应用
发布者(消息发送方)
订阅者(消息接收方)
5.2 事件驱动架构
订单服务(发布者)
库存服务(订阅者)
6. Redis 发布订阅的替代方案
7. 总结
引言
在现代分布式系统中,消息通信是一个至关重要的组成部分。无论是微服务架构、实时数据处理,还是事件驱动系统,都需要一种高效、可靠的消息传递机制。Redis 作为一个高性能的内存数据库,不仅支持键值存储,还提供了强大的 发布订阅(Pub/Sub) 功能,能够满足实时消息通信的需求。
本文将深入探讨 Redis 的发布订阅模式,包括其工作原理、使用场景、优缺点以及实际应用示例,帮助读者全面理解并掌握这一功能。
1. 什么是 Redis 发布订阅模式?
1.1 定义
Redis 的发布订阅模式是一种消息通信机制,允许客户端通过 频道(Channel) 发送和接收消息。发布者(Publisher)将消息发送到指定的频道,而订阅者(Subscriber)可以订阅一个或多个频道,接收发布者发送的消息。
1.2 核心概念
-
发布者(Publisher):负责向频道发送消息的客户端。
-
订阅者(Subscriber):订阅一个或多个频道,接收消息的客户端。
-
频道(Channel):消息传递的媒介,发布者和订阅者通过频道进行通信。
-
消息(Message):发布者发送的内容,可以是字符串、JSON 或其他格式的数据。
2. Redis 发布订阅的工作原理
2.1 基本流程
-
订阅频道:订阅者通过
SUBSCRIBE
命令订阅一个或多个频道。 -
发布消息:发布者通过
PUBLISH
命令向指定频道发送消息。 -
接收消息:所有订阅了该频道的订阅者都会接收到消息。
2.2 示例
以下是一个简单的 Redis 发布订阅示例:
# 订阅者 A
SUBSCRIBE news# 订阅者 B
SUBSCRIBE news# 发布者
PUBLISH news "Hello, World!"
-
订阅者 A 和 B 都会收到消息
"Hello, World!"
。
2.3 频道与模式订阅
Redis 还支持 模式订阅(Pattern Subscription),允许订阅者通过通配符订阅多个频道。例如:
# 订阅者
PSUBSCRIBE news.*# 发布者
PUBLISH news.sports "Match started!"
PUBLISH news.weather "Sunny day!"
-
订阅者会收到
news.sports
和news.weather
两个频道的消息。
3. Redis 发布订阅的使用场景
3.1 实时消息通知
Redis 发布订阅模式非常适合用于实时消息通知场景,例如:
-
聊天应用:用户发送的消息可以实时推送给其他用户。
-
实时数据更新:股票价格、天气信息等实时数据的推送。
3.2 事件驱动架构
在微服务架构中,Redis 发布订阅可以用于实现事件驱动通信。例如:
-
订单创建事件:订单服务发布订单创建消息,库存服务订阅并处理库存更新。
-
用户注册事件:用户服务发布用户注册消息,通知其他服务进行相关处理。
3.3 日志收集与分发
Redis 发布订阅可以用于日志的收集和分发。例如:
-
多个应用实例将日志发布到 Redis 频道,日志处理服务订阅并集中处理日志。
3.4 分布式锁与协调
在分布式系统中,Redis 发布订阅可以用于实现分布式锁和协调机制。例如:
-
多个节点订阅锁频道,通过消息通信实现锁的获取和释放。
4. Redis 发布订阅的优缺点
4.1 优点
-
高性能:Redis 基于内存操作,消息传递速度极快。
-
简单易用:发布订阅的 API 非常简单,易于集成到应用中。
-
实时性:消息能够实时推送给订阅者,适合实时通信场景。
-
灵活性:支持频道和模式订阅,能够满足多种需求。
4.2 缺点
-
消息丢失:Redis 发布订阅是 非持久化 的,如果订阅者断开连接,期间的消息会丢失。
-
无消息确认:发布者无法知道消息是否被订阅者成功接收。
-
不适合大规模消息堆积:如果消息生产速度远大于消费速度,可能导致内存占用过高。
5. Redis 发布订阅的实际应用示例
5.1 实时聊天应用
以下是一个简单的实时聊天应用示例,使用 Redis 发布订阅实现消息传递。
发布者(消息发送方)
import redis.clients.jedis.Jedis;public class Publisher {public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("localhost", 6379);// 发送消息到聊天频道jedis.publish("chat", "Hello, everyone!");}
}
订阅者(消息接收方)
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;public class Subscriber {public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("localhost", 6379);// 创建订阅者JedisPubSub jedisPubSub = new JedisPubSub() {@Overridepublic void onMessage(String channel, String message) {System.out.println("Received: " + message);}};// 订阅聊天频道jedis.subscribe(jedisPubSub, "chat");}
}
5.2 事件驱动架构
以下是一个简单的事件驱动架构示例,使用 Redis 发布订阅实现订单创建事件的处理。
订单服务(发布者)
import redis.clients.jedis.Jedis;public class OrderService {public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("localhost", 6379);// 发布订单创建事件String orderEvent = "{\"order_id\": 123, \"product\": \"Laptop\"}";jedis.publish("order_created", orderEvent);}
}
库存服务(订阅者)
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;public class InventoryService {public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("localhost", 6379);// 创建订阅者JedisPubSub jedisPubSub = new JedisPubSub() {@Overridepublic void onMessage(String channel, String message) {System.out.println("Updating inventory for order: " + message);}};// 订阅订单创建事件jedis.subscribe(jedisPubSub, "order_created");}
}
6. Redis 发布订阅的替代方案
虽然 Redis 发布订阅功能强大,但在某些场景下可能需要更高级的消息队列功能(如消息持久化、消息确认等)。以下是一些常见的替代方案:
-
RabbitMQ:支持消息持久化、消息确认和复杂的路由规则。
-
Apache Kafka:适合高吞吐量、持久化的消息处理场景。
-
NSQ:轻量级的分布式消息队列,适合实时消息处理。
7. 总结
Redis 发布订阅模式是一种高效、简单的消息通信机制,适用于实时消息通知、事件驱动架构、日志收集等场景。尽管它存在消息丢失和无确认机制的缺点,但在许多实时性要求高的场景中仍然表现出色。
如果你需要更高级的消息队列功能,可以考虑使用 RabbitMQ 或 Kafka 等替代方案。
相关文章:
Redis 发布订阅模式详解:实现高效的消息通信
目录 引言 1. 什么是 Redis 发布订阅模式? 1.1 定义 1.2 核心概念 2. Redis 发布订阅的工作原理 2.1 基本流程 2.2 示例 2.3 频道与模式订阅 3. Redis 发布订阅的使用场景 3.1 实时消息通知 3.2 事件驱动架构 3.3 日志收集与分发 3.4 分布式锁与协调 4…...
React Native 0.76 升级后 APK 体积增大的原因及优化方案
在将 React Native 从 0.71 升级到 0.76 后,打包体积从 40 多 MB 增加到了 80 MB。经过一系列排查和优化,最终找到了解决方案,并将优化过程整理如下。 1. React Native 0.76 体积增大的可能原因 (1) 新架构默认启用 React Native 0.76 默认…...
Java直通车系列14【Spring MVC】(深入学习 Controller 编写)
目录 基本概念 编写 Controller 的步骤和要点 1. 定义 Controller 类 2. 映射请求 3. 处理请求参数 4. 调用业务逻辑 5. 返回响应 场景示例 1. 简单的 Hello World 示例 2. 处理路径变量和请求参数 3. 处理表单提交 4. 处理 JSON 数据 5. 异常处理 基本概念 Cont…...
文章被检测出是AI写的怎么办?
随着人工智能技术的飞速发展,AI辅助写作工具逐渐普及,为学生、科研人员以及创作者带来了诸多便利。然而,随之而来的是对学术诚信和内容原创性的担忧。当文章被检测出是AI写作时,应该如何应对?本文将探讨这一问题&#…...
Linux教学总目录
Linux教学总目录: 1、Linux常见指令 2、Linux权限理解 3、Linux环境基础开发工具使用...
SpringBoot(1)——创建SpringBoot项目的方式
目录 1、idea直接从spring.io官网下载即可 编辑2、 自己从spring官网下载再用idea打开 3、Idea从阿里云的官网(https://start.aliyun.com)下载打开 4、Maven项目改造成springboot项目 我的平台是idea2021 Spring Boot 由 Pivotal 团队开发ÿ…...
Oracle数据恢复:闪回查询
Oracle数据恢复:闪回查询 SQL语法闪回查询:AS OF闪回版本查询:VERSIONS BETWEEN数据恢复示例闪回查询最佳实践应用场景使用限制注意事项最佳实践在误删除业务数据时,Oracle数据库通常支持以下几种数据恢复途径。 闪回查询(Flashback Query):闪回查询通过查询系统的UNDO数…...
LiveCommunicationKit OC 实现
一、实现效果: LiveCommunicationKit是苹果公司在iOS 17.4、watchOS 10.4和visionOS 1.1中引入的一个新框架,旨在优化VoIP通话的交互体验。该框架提供了与...
django中路由配置规则的详细说明
在 Django 中,路由配置是将 URL 映射到视图函数或类视图的关键步骤,它决定了用户请求的 URL 会触发哪个视图进行处理。以下将详细介绍 Django 中路由配置的规则、高级使用方法以及多个应用配置的规则。 基本路由配置规则 1. 项目级路由配置 在 Django 项目中,根路由配置文…...
机器学习基础(4)
超越基于常识的基准 除了不同的评估方法,还应该利用基于常识的基准。训练深度学习模型就好比在平行世界里按下发射火箭的按钮,你听不到也看不到。你无法观察流形学习过程,它发生在数千维空间中,即使投影到三维空间中,…...
技术的魅力与价值
区块链技术正改变公益事业。它能极大提高公益透明度和公信力。通过区块链,每一笔捐款的流向都清晰可查,无法篡改,让捐赠者放心。比如某公益平台利用区块链记录捐赠信息,大家随时能看到善款使用情况。还有些项目用区块链追踪物资发…...
【报错】微信小程序预览报错”60001“
1.问题描述 我在微信开发者工具写小程序时,使用http://localhost:8080是可以请求成功的,数据全都可以无报错,但是点击【预览】,用手机扫描二维码浏览时,发现前端图片无返回且报错60001(打开开发者模式查看日…...
[数据结构]并查集--C++版本的实现代码
目录 并查集的基本框架 查找一个元素在哪一个集合 判断两个元素是否在同一个集合 将两个集合进行合并 查询有多少组 测试 大学班级的同学会来自于五湖四海,每个人的家乡可能都不相同,那么如何将相同省份的同学连接到一块,也就是按省份进…...
随机森林:强大的集成学习算法
引言 在机器学习领域,随机森林(Random Forest)是一种非常流行的集成学习算法。它通过构建多个决策树并将它们的结果进行集成,能够有效提高模型的准确性和鲁棒性。随机森林广泛应用于分类、回归、特征选择等任务,因其简…...
C# 实现 AI SSE (Server-Sent Events)接口方式输出(对接AI模型API)
以下是一个使用 C# 实现接收 SSE(Server-Sent Events)接口数据、进行数据修改解析,然后再以 SSE 方式输出给前端的示例代码。 using System; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; using M…...
企业招聘能力提升之道:突破困境,精准纳才
企业招聘能力提升之道:突破困境,精准纳才 在企业运营的广袤版图中,招聘工作无疑是一块至关重要的拼图。然而,不少企业在这片领域中举步维艰,尽管投入了海量的时间与精力,收获的成果却不尽人意。面试环节仿…...
[数据结构]堆详解
目录 一、堆的概念及结构 二、堆的实现 1.堆的定义 2堆的初始化 3堆的插入 编辑 4.堆的删除 5堆的其他操作 6代码合集 三、堆的应用 (一)堆排序(重点) (二)TOP-K问题 一、堆的概念及结构 堆的…...
KafkaRocketMQ
Kafka 消息生产与消费流程 1. 消息生产 生产者创建消息: 指定目标 Topic、Key(可选)、Value。可附加 Header 信息(如时间戳、自定义元数据)。 选择分区(Partition): 若指定 Key&am…...
DeepSeek Kimi详细生成PPT的步骤
以下是使用 DeepSeek 和 Kimi 协作生成 PPT 的详细步骤,结合了两者的优势实现高效创作: 第一步:使用 DeepSeek 生成 PPT 大纲或内容 明确需求并输入提示词 在 DeepSeek 的对话界面中,输入具体指令,要求生成 PPT 大纲或…...
HTTP和HTTPS
一.介绍HTTP HTTP全称为超文本传输协议,是一种应用非常广泛的应用层协议。目前,主流使用的HTTP版本是HTTP1.1和HTTP2.0,在这边文章中,讨论的是HTTP1.1。 使用浏览器,打开手机上的APP或者是后端程序,都是分布…...
应急响应--流量分析
(一)Cobalt Strike流量特征分析 1.HTTP特征 源码特征: 在流量中,通过http协议的url路径,在checksum8解密算法计算后,32位的后门得到的结果是92,64位的后门得到的结果是93,该特征符…...
docker 学习
在docker中通常需要使用ADD等命令复制附件,同时也需要使用其他命令操作原始镜像中的内容,会导致原文文件被覆盖后缺少执行权限,比如: sqlmapapi: ERROR (file is not executable) 或者XXX: ERROR (file is not execu…...
C++时间复杂度详解
一、时间复杂度核心概念 1.1 为什么要研究时间复杂度 当处理大规模数据时(如计算斐波那契数列第57项),不同算法效率差异巨大: 递推解法:0.23秒完成 递归解法:需要2369秒(约40分钟)…...
【WPF】Slider滑动方法(INotifyPropertyChanged、ValueChanged )响应速度对比分析
一、Slider基础用法 在 XAML 中添加一个 Slider 控件,并设置其基本属性: <Slider Minimum"0" <!-- 最小值 -->Maximum"100" <!-- 最大值 -->Value"50" <!-- 初始值 -->Width&quo…...
PgSql 操作技巧
1、查询数据导出csv数据 \COPY (SELECT w.* from t_sys_warn w ) TO /home/cuadmin/warn_output.csv WITH CSV HEADER;2、导出sql Insert语句 pg_dump -U 用户名 -h 主机名 -p 端口号 -d 数据库名 --inserts -t 表名 > 导出文件.sqlpg_dump -U username -d dbname -t tabl…...
高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架
一、背景 在快节奏的开发周期中,如何确保接口质量?自动化测试是关键。通过构建标准化、可复用的测试框架,能显著提升测试效率与准确性,为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标: ● 实现快速、高效的接口测试…...
设计模式文章汇总-Golang语言实现
Golang学习笔记_27——单例模式 Golang学习笔记_28——工厂方法模式 Golang学习笔记_29——抽象工厂模式 Golang学习笔记_30——建造者模式 Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 Golang学习笔记_33——桥接模式 Golang学习笔记_34——组合模式 Gola…...
深度学习PyTorch之13种模型精度评估公式及调用方法
深度学习pytorch之22种损失函数数学公式和代码定义 深度学习pytorch之19种优化算法(optimizer)解析 深度学习pytorch之4种归一化方法(Normalization)原理公式解析和参数使用 深度学习pytorch之简单方法自定义9类卷积即插即用 实时…...
c#面试题整理4
1.stirng str"",string strnull,俩者有何区别 空字符串占有存储控件,null不占用 2.class与struct的异同 异同class 可继承 引用类型 1.都可以定义方法字段 2.都可实例化,与类的使用几乎一样 struct 不可继承 值类型 只能声明带…...
游戏辅助技术培训班教程【A001-初级班】
课程概述: 本教程为游戏辅助技术培训班的初级班课程,本章为第二阶段,旨在帮助学员系统掌握游戏辅助技术的核心技能。课程内容从C/C编程基础到高级内存操作、代码注入、DLL注入及MFC编程,全面覆盖游戏辅助开发的关键知识点。 课程…...
[NewStarCTF 2023 公开赛道]ez_sql1 【sqlmap使用/大小写绕过】
题目: 发现id处可以sql注入: 虽然输入id1;show databases;#没什么回显,但是知道这里是字符型注入了 这次利用sqlmap注入 --dbs:列出所有数据库名字 python .\sqlmap.py -u http://a40b2f0a-823f-4c99-b43c-08b94ed0abb2.node5.…...
SSTI注入笔记
文章目录 基础知识SSTI利用条件验证SSTI是否存在验证console码SSTI类引用机制过滤的绕过.被过滤下划线被过滤中括号被过滤过滤了{{过滤了单引号或者双引号过滤了数字关键字被过滤 基础知识 python的模块引用,优先引用当前目录下的模块,比如from pwn imp…...
大模型中的剪枝、蒸馏是什么意思?
环境: 剪枝 蒸馏 问题描述: 大模型中的剪枝、蒸馏是什么意思? 解决方案: 大模型的剪枝(Pruning)和蒸馏(Distillation)是两种常见的模型优化技术,用于减少模型的大小…...
AI学习记录 - PPO算法草稿
returns 下面是两种方式生成returns的值,第一种好一点 delta计算方式不一样 通过一些计算方式,将未来的一些计算值,赋予到前面去,从而影响将前面的token和后面的token绑定到一起,从而实现每当生成一个tokend…...
蓝桥杯FPGA-ds1302驱动
1. 驱动的作用 调用SPI底层驱动,实现DS1302的驱动 2. 关键程序代码说明 1. 独热编码设置状态机的状态 使用独热编码会使系统更加高效稳定 localparam IDLE 8b0000_0001; localparam CE_HIGH 8b0000_0010; localparam CE_LOW 8b0000_0100; localparam…...
探索C/C++的奥秘之list
list和我们之前讲的东西都一样,list第二个参数是一个空间配置器,是一个内存池, 底层是一个带头双向循环列表。list可以重载[],但是效率太低了。 list的遍历不能使用下标[],因为它的空间不是连续的,可以使用…...
Linux第六讲:进程控制
Linux第六讲:进程控制 1.进程创建1.1回顾fork1.2写时拷贝 2.进程终止2.1exit与_exit 3.进程等待3.1进程等待的方法(wait和waitpid) 4.进程程序替换4.1自定义shell的编写4.1.1输出命令行提示符4.1.2获取用户输入的命令4.1.3命令行分析4.1.4指令…...
LabVIEW基于双通道FFT共轭相乘的噪声抑制
对于双通道采集的含噪信号,通过FFT获取复数频谱后,对第二通道频谱取共轭并与第一通道频谱相乘,理论上可增强相关信号成分并抑制非相关噪声。此方法适用于通道间信号高度相关、噪声独立的场景(如共模干扰抑制)。以下为L…...
疯狂安卓入门,crayandroid
系列文章目录 文章目录 系列文章目录第一组 ViewGroup 为基类帧布局约束布局 第二组 TextView 及其子类button时钟 AnalogClock 和 TextClock计时器 第三组 ImageView 及其子类第四组 AdapterView 及其子类AutoCompleteTextView 的功能和用法ExapndaleListViewAdapterViewFlipp…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(10)
7.3. 查询计划相关操作符 88)Sequence Project:该操作符通过对一个排序集合增加字段来进行计算。其基于一个或多个字段的值将其输入的数据行分成多个段,这样,该操作符每次输出一个段,这些字段显示为该操作符的参数。该…...
【Matlab仿真】如何解决三相交流信号源输出波形失真问题?
问题描述 如标题所示,在搭建simulink模型过程中,明明模型搭建的没有问题,但是输出的波形却不是理想的正弦波,影响问题分析。 问题分析 以三相交流信号源输出波形为例,输出信号理应为三相正弦量,但是仿真…...
[含文档+PPT+源码等]精品基于Python实现的校园小助手小程序的设计与实现
基于Python实现的校园小助手小程序的设计与实现背景,可以从以下几个方面进行阐述: 一、技术背景 1. Python与Django框架的优势 Python作为一种高级编程语言,以其简洁的语法、丰富的库和强大的社区支持,在Web开发领域得到了广泛…...
Nginx(基础安装+配置文件)
目录 一.Nginx基础 1.基础知识点 2.异步非阻塞机制 二.Nginx安装 2.1安装nginx3种方式 1.包管理工具安装(yum/apt) 2.本地包安装(rpm/dpkg) 3.源码编译安装 3.1 源码编译安装nginx流程(ubuntu) 1.…...
el-table中slot=“header“和#header的区别
在<el-table>中,自定义表头单元格内容,可以用<templat slot"header">或者<templat #header>插入自定义表头内容,但如果表头中含有变量,比如<template slot"header">{{name}}</tem…...
S19文件格式详解:汽车ECU软件升级中的核心镜像格式
文章目录 引言一、S19文件格式的起源与概述二、S19文件的核心结构三、S19在汽车ECU升级中的应用场景四、S19与其他格式的对比五、S19文件实例解析六、工具链支持与安全考量七、未来趋势与挑战结语引言 在汽车电子控制单元(ECU)的软件升级过程中,S19文件(也称为Motorola S-…...
鸿蒙跨平台框架ArkUI-X
01 引言 目前,移动端主流跨平台方案有Flutter、React Native、uni-app等等,还有刚推出不久的Compose-Multiplatform,真所谓是百花齐放。这些框架各有特点,技术实现各有差异,比如Flutter通过Dart编写的UI描述对接Flutte…...
群晖DS223 Docker搭建为知笔记
群晖DS223 Docker搭建为知笔记,打造你的专属知识宝库 一、引言 在数字化信息爆炸的时代,笔记软件成为了我们管理知识、记录灵感的得力助手。为知笔记,作为一款专注于工作笔记和团队协作的云笔记产品,以其丰富的功能和便捷的使用体…...
FPGA入门教程
引言 FPGA(Field-Programmable Gate Array,现场可编程门阵列)是一种灵活且强大的硬件设备,广泛应用于数字电路设计、信号处理、嵌入式系统等领域。与传统的ASIC(专用集成电路)不同,FPGA允许用户…...
DR和BDR的选举规则
在 OSPF(开放最短路径优先)协议中,DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 的选举是为了在广播型网络(如以太网…...
无需环境,直接用 Docker 来启动你的 Python 项目
大家好 我是洪峰 想象这样一种场景,你写好了代码,准备部署在新的服务器上,这台服务器只有 Python2 和 Python3.6,没有你代码适配好的 Python3.12,那怎么办? 1、编译安装 Python,我不推荐这种方…...