详解redis(14):数据结构Stream

一、为什么 Redis 一定要出 Stream?

发布订阅(Pub/Sub)的问题

优点

实时

简单

缺陷

不持久化

客户端离线 → 消息直接丢

无法回溯历史消息

本质原因:

Pub/Sub 是"广播事件",不是"存储消息"

List 实现消息队列的问题

优点

FIFO

可阻塞

问题一:消息一旦消费就没了

无法重复消费

消费失败,消息直接丢

问题二:没有 ACK 机制

消费者 RPOP 后宕机

消息已经被删除

问题三:ID 需要自己维护

分布式环境下很麻烦

本质原因:

List 是"容器",不是"消息日志"

二、Redis Stream 的设计目标

Redis 官方目标很明确:

做一个"真正的消息队列 / 消息日志系统"

Stream 要解决的问题:

能力 是否支持
消息持久化
全局唯一 ID
消息不丢
消费确认(ACK)
多消费者
消费组
消息回溯

三、Stream 是什么?

Redis Stream 是一个"只追加的消息日志(Append-Only Log)"

Stream 的数据模型

消息 ID 是什么?

<毫秒时间戳>-<序列号>

特点:

全局有序

天然递增

分布式安全

Redis 自动生成(*

为什么 ID 如此重要?

用来 定位消息

用来 断点续消费

用来 回溯历史消息

Stream 如何解决旧方案的问题?

1. 消息持久化

Stream 数据:

存在内存

写 AOF / RDB

Redis 重启 消息仍在

2.支持历史消息读取

可以从头读到尾

离线重连也能补消息

3. 自动生成全局唯一 ID

Redis 保证:

不重复

单调递增

4. ACK 确认机制

只有 ACK 后:

消息才算"已处理"

消费者宕机?

未 ACK 的消息会留在 Pending List

5. 消费组

这是 Stream 最重要的能力

没有消费组(广播)

每个消费者都能读到所有消息

有消费组(负载均衡)

特点:

一条消息只会被一个消费者处理

天然负载均衡

非常适合后台任务、订单处理

Stream vs List vs Pub/Sub

特性 Pub/Sub List Stream
持久化
消息确认
重复消费
消费组
消息回溯
适合生产 勉强
相关推荐
雨中飘荡的记忆1 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
NineData2 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师4 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石8 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
曲幽10 小时前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript