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 数据库备份
将包括系统数据库在内的所有数据库的最近备份存储在一个安全的位置是非常重要的。这确保了在发生数据丢失或损坏时,能够迅速恢复数据库到最近的状态,减少可能的业务影响。对于不同的数据库环境(开发、测试或生产),根据…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
