当前位置: 首页 > 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;根据…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...