Redis Stream数据类型如何实现可靠的消息发布订阅?

阿墨君_7962

阿墨君_7962

2026-08-28

628人浏览

原创

redis stream 不是 pub/sub,而是可靠有序可回溯的消息队列;需用 xadd + xreadgroup + ack 配合独立消费者组实现类 pub/sub 功能,且必须手动建组、ack 和运维游标。

redis stream数据类型如何实现可靠的消息发布订阅?

Redis Stream 本身不提供“发布/订阅”语义,它实现的是**可靠、有序、可回溯的消息队列**。想用 Stream 达到类似 Pub/Sub 的效果(比如广播给多个服务),必须靠消费者组(Consumer Group)+ 多个独立组来模拟,而不是直接替换 PUBLISH/SUBSCRIBE

为什么不能直接用 XADD + XREAD 当作 Pub/Sub?

因为 XREAD 是单次拉取、无状态、不记录偏移的读法:所有调用者都从同一 ID 开始读,消息会被重复消费;没有自动游标管理,无法区分“谁读了哪条”;离线后无法续读——这和 Pub/Sub 一样不可靠,甚至更难维护。

  • XREAD STREAMS stream_name 0-0 每次都从头读,不是“订阅”,是“快照拉取”
  • 没消费者组时,XREAD 不保存进度,重启或断连即丢失上下文
  • 无法做到“一条消息只被某组内一个消费者处理”,天然不支持负载均衡

真正可靠的方案:XADD + XREADGROUP + ACK

核心是把每个业务方建一个独立的消费者组(比如 group-ordergroup-inventory),它们互不影响,各自维护自己的 last-delivered-id。这才是“可靠发布订阅”的落地方式。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 发消息只用一次 XADD stream_name * field value,所有组都能看到
  • 每个组用 XREADGROUP GROUP group-name consumer-1 COUNT 10 BLOCK 5000 STREAMS stream_name > —— > 表示“只读新消息”,自动更新组内游标
  • 消费成功后必须显式 XACK stream_name group-name id1 id2,否则消息会留在 PEL(Pending Entries List)里,下次还能捞到
  • 如果消费者崩溃,未 ACK 的消息会在 PEL 中保留,其他同组消费者可用 XCLAIM 接管

容易踩的坑:消费者组名、消费者名、ID 写错就全乱套

Stream 对名字大小写敏感,且组初始化有隐含逻辑,错一步就卡住:

  • 第一次用 XREADGROUP 读某个不存在的组,Redis 不会自动创建,必须先 XGROUP CREATE stream_name group-name $$ 表示从最新消息开始)
  • consumer-name 在组内必须唯一,重复名字会导致消息被覆盖或丢弃(不是报错,而是行为异常)
  • XREADGROUP> 只对新消息有效;如果想重放历史,得指定具体 ID,比如 0-0,但要注意该 ID 必须存在且未被 DEL
  • Stream 默认无限增长,不设 MAXLENMINID,磁盘可能被撑爆——尤其日志类场景

真正麻烦的不是命令怎么写,而是“谁负责建组、谁负责清理 PEL、谁监控游标滞后”。这些逻辑不在 Redis 里,得在应用层兜底。Stream 提供了可靠基座,但不替你做运维判断。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

2371

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

494

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

402

19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4069

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3555

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6312

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

603

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

716

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5742

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习