当前位置: 首页 > news >正文

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 基本流程

  1. 订阅频道:订阅者通过 SUBSCRIBE 命令订阅一个或多个频道。

  2. 发布消息:发布者通过 PUBLISH 命令向指定频道发送消息。

  3. 接收消息:所有订阅了该频道的订阅者都会接收到消息。

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. 轻量化开源代表&#xff…...

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 的机制&#xff0c;允许你在不阻塞主线程的情况下执行耗时的任务。这对于保持网页的响应性和流畅性非常重要&#xff0c;特别是在需要进行复杂计算或大量数据处理时。 主要特点 多线程&#xff1…...

[原创](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系统编程中&#xff0c;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网络的网络 起源于美国的互联网现已发展成为世界上最大的覆盖全球的计算机网络。 下面&#xff0c;我们先来看看关于网络、互连网、互联网(因特网)的一些基本概念。为了方便&#xff0c;后面我们所称呼的"网络"往往就是"计算机网络",而不是电信网或有…...

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的工作原理

什么是三层交换 三层交换是指连接在同一台三层交换机上&#xff0c;不同vlan用户&#xff0c;不同网段ip&#xff0c;通过vlanif接口进行数据交换。 什么是ARP协议 通过网络层的ip地址解析成数据链路层的mac地址。 说白了就是通过目标ip地址去问他对应的mac地址是多少。 A…...

重构谷粒商城09:人人开源框架的快速入门

谷粒商城09——人人开源框架的快速入门 前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶…...

用友 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 数据库备份

将包括系统数据库在内的所有数据库的最近备份存储在一个安全的位置是非常重要的。这确保了在发生数据丢失或损坏时&#xff0c;能够迅速恢复数据库到最近的状态&#xff0c;减少可能的业务影响。对于不同的数据库环境&#xff08;开发、测试或生产&#xff09;&#xff0c;根据…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...