Stream 出现后,很多团队会问:是不是可以不用 MQ 了?这个问题本身就有点危险,因为 Stream 确实比 List 更像消息系统,但它仍然是 Redis 里的内存数据结构。

Stream 的价值在于追加日志、范围读取、消费组和待确认列表。它能解决 List 没有 ack 的问题,但也带来了 PEL、lag、trim 和消费者转移这些治理成本。

先把机制边界说清楚

这一篇讨论 Stream 的存储与消费组模型,不讨论跨数据中心消息系统。只要消息堆积、重放和保留策略成为核心诉求,就必须评估 Redis 内存和持久化边界。

整体路径

Stream 存储与消费组

上面这张图先把主线铺开:消息存在 rax/listpack,消费状态存在 PEL。读 Redis 这类系统,最重要的是别只停在命令接口,要继续追问它在内存里是什么形状、在主线程上走多远、失败时会留下什么状态。

底层机制

  • Stream entry 用毫秒时间和序列号组成 ID,天然支持按范围读取。
  • 底层用 rax 组织宏节点,节点内部用 listpack 紧凑保存多条消息字段。
  • Consumer Group 通过 PEL 记录已投递未确认消息,XACK 只是清理待确认状态。
  • XTRIM 控制保留量;只写不裁剪会让 Stream 持续吃内存。

这些机制放在一起看,就能把「这个命令能不能用」改成「这个命令在当前数据规模下还便不便宜」。Redis 的很多坑,不是命令本身错了,而是数据规模和访问方式已经越过了它的舒适区。

取舍与边界

Stream 适合轻量消息流、事件日志和异步削峰,但它不自动提供无限堆积、跨集群重平衡和强事务投递。

典型问题:用机制化例子排查

  • 每个 Stream 都要定义保留策略,明确按条数还是按时间裁剪。
  • 消费者要监控 pending、idle 和 lag,挂掉后用 XAUTOCLAIM 做接管。
  • 消息处理必须幂等,因为重试和转移会造成重复投递。
  • 关键业务消息如果需要长期保留、严格顺序或跨机房治理,优先考虑专业 MQ。

收束:一句判断

Stream 是 Redis 的日志型数据结构,不是万能消息中间件。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 Redis」,欢迎关注公众号 「十三Tech」。后续会继续按数据结构、底层机制、持久化、高可用和实战排查这条线更新。

十三Tech公众号二维码