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…...
ES的预置分词器
Elasticsearch(简称 ES)提供了多种预置的分词器(Analyzer),用于对文本进行分词处理。分词器通常由字符过滤器(Character Filters)、分词器(Tokenizer)和词元过滤器&#…...
MPPT与PWM充电原理及区别详解
MPPT(最大功率点跟踪)和PWM(脉宽调制)是太阳能充电控制器中常用的两种技术,它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比: 1. 工作原理 PWM(脉宽调制) 核心机制…...
【AGI】通往AGI的复兴号:模型工具演进与技术路径优化
通往AGI的复兴号:模型工具演进与技术路径优化 一、核心模型与工具技术指标及场景分析1. 边缘计算标杆:GLM-PC(2024年11月)2. 长文本处理王者:DeepSeek R1(2025年1月)3. 轻量化开源代表ÿ…...
java2025年常见设计模式面试题
1. 请解释建造者模式(Builder Pattern)及其应用场景。 答案: 建造者模式用于创建一个复杂的对象,同时允许用户只通过指定复杂对象的类型和内容就能构建它们,隐藏了复杂的构建逻辑。 示例: public class C…...
探索CAMEL:揭开多智能体系统的神秘面纱
在人工智能领域,多智能体系统(Multi-Agent Systems, MAS)一直是一个充满活力和潜力的研究方向。随着大语言模型(LLM)的快速发展,智能体之间的协作与交互变得更加复杂和智能。今天,我们要介绍的是一个名为CAMEL(Communicative Agents for “Mind” Exploration of Large…...
el-pagination的使用说明
<el-paginationv-model:current-page"pageNo" //当前第几页v-model:page-size"pageSize" //每页显示多少条数据:page-sizes"[10, 20, 30]" //控制每页显示的条数:small"true" //控制分页器大小:disabled&quo…...
UniApp 运行的微信小程序如何进行深度优化
UniApp 运行的微信小程序如何进行深度优化 目录 引言性能优化 1. 减少包体积2. 优化页面加载速度3. 减少 setData 调用4. 使用分包加载 代码优化 1. 减少不必要的代码2. 使用条件编译3. 优化图片资源 用户体验优化 1. 优化交互体验2. 预加载数据3. 使用骨架屏 调试与监控 1. …...
Web Worker如何在本地使用
首先了解一下什么是Web Worker Web Worker 是一种在后台线程中运行 JavaScript 的机制,允许你在不阻塞主线程的情况下执行耗时的任务。这对于保持网页的响应性和流畅性非常重要,特别是在需要进行复杂计算或大量数据处理时。 主要特点 多线程࿱…...
[原创](Modern C++)现代C++的关键性概念: 改掉new习惯, 尽情地使用智能分配内存
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、C …...
C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用
文章目录 1. CopyFile原理函数原型返回值用法示例适用场景 2. CopyFileEx原理函数原型返回值用法示例适用场景 3. 核心区别4. 选择建议5. 常见问题6.区别 在Windows系统编程中,CopyFile和CopyFileEx是用于文件复制的两个API函数。它们的核心区别在于功能扩展性和控制…...
android studio开发文档
android基本样式 1.文本 2.设置文本大小 3.字体颜色 背景 资源文件 xml’引用资源文件 4.视图宽高 5.间距 6.对齐方式 常用布局 1.linearLayout线性布局 2.相对布局 RelativeLayout 3.网格布局GridLayout 4.scrollview滚动视图 Button 点击事件与长按事件 长按 按钮禁用与…...
计算机网络笔记(二)——1.2互联网概述
1.2.1网络的网络 起源于美国的互联网现已发展成为世界上最大的覆盖全球的计算机网络。 下面,我们先来看看关于网络、互连网、互联网(因特网)的一些基本概念。为了方便,后面我们所称呼的"网络"往往就是"计算机网络",而不是电信网或有…...
Ubuntu 24.04.2 允许 root 登录桌面、 ssh 远程、允许 Ubuntu 客户机与主机拖拽传递文件
允许 root 登录桌面 修改 /etc/pam.d/gdm-autologin , /etc/pam.d/gdm-password 加 # 以注释掉 auth required pam_succeed_if.so user ! root quiet_success 允许 root 通过 ssh 登录 修改 /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin …...
day18-后端Web开发——Maven高级
目录 Maven高级1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承关系2.1.1.1 思路分析2.1.1.2 实现2.1.2 版本锁定2.1.2.1 场景2.1.2.2 介绍2.1.2.3 实现2.1.2.4 属性配置 2.2 聚合2.2.1 介绍2.2.2 实现 2.3 继承与聚合对比…...
华为hcia——Datacom实验指南——三层交换和ARP的工作原理
什么是三层交换 三层交换是指连接在同一台三层交换机上,不同vlan用户,不同网段ip,通过vlanif接口进行数据交换。 什么是ARP协议 通过网络层的ip地址解析成数据链路层的mac地址。 说白了就是通过目标ip地址去问他对应的mac地址是多少。 A…...
重构谷粒商城09:人人开源框架的快速入门
谷粒商城09——人人开源框架的快速入门 前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶…...
用友 U8出入库查询SQL 连接UNION ALL
-- 销售出库单查询 SELECT 销售出库单 AS 单据类型, a.cCode AS 单号, a.dDate AS 日期, a.cMaker AS 制单人, a.cHandler AS 审核人, a.dVeriDate AS 审核日期, b.cInvCode AS 存货编码, b.iQuantity AS 数量, b.cBatch AS 批号, c.…...
【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手
目录 一、前言 二、WPS接入AI工具优势 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…...
Neo4j 数据库备份
将包括系统数据库在内的所有数据库的最近备份存储在一个安全的位置是非常重要的。这确保了在发生数据丢失或损坏时,能够迅速恢复数据库到最近的状态,减少可能的业务影响。对于不同的数据库环境(开发、测试或生产),根据…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
