Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。
下面我们详细展开对比。
Redis Pub/Sub 的核心特点
它是一个发后即忘的模型。
- 发布者(Publisher) 将消息发送到频道(Channel)。
- 订阅者(Subscriber) 监听频道。
- Redis Broker 接收到消息后,会立即将其推送给当前所有在线的订阅者。
对比分析
特性维度 | Redis Pub/Sub | 专业 MQ (Kafka / RabbitMQ) |
---|---|---|
可靠性 & 持久化 | 极低。消息是瞬时的,不落盘。如果发布时订阅者不在线,消息会永久丢失。Redis 重启也会丢失所有途中的消息。 | 极高。消息默认会持久化到磁盘。支持多种消息确认机制,确保消息至少被消费一次。 |
消息确认 (ACK) | 无。发布者不知道消息是否被成功接收,订阅者也无法告知 Broker 自己已处理完毕。 | 有。消费者处理完消息后会发送 ACK 信号。如果 Broker 未收到 ACK(如消费者崩溃),消息会重新投递给其他消费者。 |
消息回溯/重放 | 不支持。消息一旦发出就消失了,无法查看历史消息。 | 支持。Kafka 基于日志和偏移量(Offset),可以从任意位置重读消息。RabbitMQ 也可以通过特定配置实现消息重放。 |
消费者负载均衡 | 不支持。如果多个消费者订阅同一个频道,所有消费者都会收到同一条消息,导致重复处理。它是一个纯粹的广播模型。 | 支持(核心功能)。通过消费组 (Consumer Group),一个 Topic/Queue 的消息可以被组内的多个消费者分摊处理,实现负载均衡和高可用。 |
性能 & 延迟 | 极高,延迟极低。完全基于内存,没有磁盘 I/O,逻辑简单,消息传递速度非常快。 | 高,延迟较低。性能非常高,但因为涉及持久化、ACK 等复杂机制,通常延迟会略高于 Redis Pub/Sub。 |
功能丰富度 | 非常基础。只有发布、订阅、取消订阅等几个简单命令。 | 非常丰富。支持复杂的路由策略(RabbitMQ 的 Exchange)、消息过滤、死信队列、优先级队列、事务、延迟消息、管理后台等。 |
部署与运维 | 极其简单。它只是 Redis 的一个内置功能,无需额外部署和配置。 | 相对复杂。需要独立部署和维护 Broker 集群,如 Kafka 需要 Zookeeper/KRaft,RabbitMQ 需要 Erlang 环境。 |
Redis Pub/Sub 的优点总结
- 极简设计:API 非常简单(
PUBLISH
,SUBSCRIBE
),上手快,集成成本低。 - 极致性能:由于纯内存操作,消息传递延迟是微秒级的,非常适合对实时性要求苛刻的场景。
- 轻量无依赖:如果你的项目中已经在使用 Redis,那么引入消息通信功能是零成本的,不需要额外部署一套重型的 MQ 系统。
Redis Pub/Sub 的缺点总结(也是专业 MQ 的优势所在)
- 致命的可靠性问题:“离线即丢失” 是其最大的短板。这使得它完全不适用于任何要求消息必须送达的业务场景,如订单处理、支付通知等。
- 无状态:无法追溯历史,无法应对消费者宕机后的消息补偿。
- 广播天性:天然的“扇出”(Fan-out)模式,虽然是优点,但在需要“点对点”任务分发的场景下(一个任务只被一个工作进程处理),这就是个巨大的缺点。
适用场景:发挥“快”和“简”的优势
基于以上优缺点,Redis Pub/Sub 适用于那些可以容忍消息丢失,但追求极致实时性的场景:
-
实时聊天室/弹幕系统:
- 一条弹幕或聊天消息,偶尔丢失一两条对整体体验影响不大,但必须保证低延迟。
-
实时数据看板/股价推送:
- 金融 App 中的股价更新、体育比赛的比分直播。用户关心的是最新的数据,旧数据丢失了也无所谓。
-
服务间的状态广播/事件通知:
- 微服务架构中,一个服务可以发布一个事件,比如 “用户
ID:123
的信息已更新”。 - 订阅此事件的服务(如缓存服务、搜索索引服务)可以接收通知并做出相应操作(如:清空该用户的缓存)。即使某次通知丢失,通常也有其他机制兜底(如缓存的 TTL 过期)。
- 微服务架构中,一个服务可以发布一个事件,比如 “用户
-
简单的“触发器”:
- 触发一些非核心、幂等的操作。例如,发布一个“开始清理日志”的信号,哪个后台进程收到了就去执行。
结论与建议
- 把 Redis Pub/Sub 当作一个“信号系统”或“实时事件总线”,而不是一个可靠的“消息队列”。
- 当你的需求是:快、简单、允许丢消息,那么 Redis Pub/Sub 是一个绝佳的轻量级选择。
- 当你的需求涉及:业务核心流程、数据一致性、任务处理、金融交易等任何“一条都不能少”的场景,请毫不犹豫地选择专业的 MQ(如 Kafka, RabbitMQ)。
如果你希望在 Redis 生态内找到一个更可靠的消息队列方案,Redis 5.0 推出的 Streams 是更好的选择。它通过消费组、持久化和 ACK 机制,解决了 Pub/Sub 和 List 的诸多缺点,是 Redis 作为轻量级可靠消息队列的最佳实践。
相关文章:
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...