首页/数据/数据库速查/Streams 基础:XADD / XREAD / XRANGE
Redis 运维与场景124 条

Streams 基础:XADD / XREAD / XRANGE

Stream 是 Redis 5 的追加式消息日志:XADD 追加(自动生成 时间戳-序号 ID),XRANGE 范围读,XREAD 阻塞读新消息,天然支持回溯与多消费者。

数据库速查数据更新于 2026-10-13

Stream 是什么

Stream 是 Redis 5.0 引入的追加式消息日志:每条消息带单调递增的 ID(毫秒时间戳-序号,如 1737100000000-0),按 ID 从小到大排列保存。它同时具备 List 的先进先出、Pub/Sub 的多播,以及消费者组、ACK 确认与历史回溯能力,可以当轻量消息队列使用。

基本信息

版本要求Redis 5.0 及以上
写入命令XADD key ID field value(ID 用 * 由服务端生成)
读取命令XRANGE / XREVRANGE / XREAD / XREADGROUP
容量控制XADD MAXLEN 或 XTRIM,常用 MAXLEN ~ N
确认机制消费者组配合 XACK,未确认消息记入 PEL

典型使用场景

  • 订单、支付等异步任务分发:生产端 XADD 写入,多个消费者组并行拉取
  • 断线不丢消息:用消费者组 XREADGROUP 读取、处理完再 XACK,重启后从 PEL 继续
  • 历史重放:按 ID 区间 XRANGE 重新读取,做数据补偿或对账
  • 指标采集:把采样点追加成消息,再按 ID 区间做窗口统计
  • 替代 List 做可靠队列:List 弹出即丢失,Stream 有未确认队列可以追责

写入与读取

写入与读取
XADD orders * user u1 amount 99            # * 让服务端生成 ID
XADD orders * user u2 amount 12
XLEN orders                                # 消息总数
XRANGE orders - + COUNT 10                 # 从头读 10 条
XREVRANGE orders + - COUNT 10              # 从尾读 10 条
XREAD COUNT 5 BLOCK 3000 STREAMS orders $  # 阻塞 3 秒,只读之后的新消息
XTRIM orders MAXLEN ~ 100000               # 近似裁剪,防止无限增长

输出逐列读法

字段含义正常与异常
消息 ID毫秒时间戳-序号,全局单调递增同一毫秒内多条时序号自增,手工指定必须递增
XRANGE 返回二维数组:ID 加字段值列表- 代表最小值,+ 代表最大值
XREAD BLOCK阻塞毫秒数,0 表示永久阻塞超时返回空,客户端必须判空
$ 与 0$ 只读此后写入的新消息,0 从头读用错会漏消息或把历史全量读一遍
ID 单调递增是范围查询与断点续传的基础;消费端要自己记录「读到哪」,别指望 $ 帮你记住位置。
与 List 队列对比:List 弹出即完成、无确认无回溯;Stream 支持消费者组、ACK、多播与历史读取,是更完整的消息方案。
Stream 不设上限会一直增长:用 XADD MAXLEN ~ N 或定时 XTRIM 控制长度,否则内存被慢慢吃光。

易错点

  • XREAD 用 $ 读取:重启或断线期间写入的消息全部漏掉,方案是记录并复用最后读到的 ID,或改用消费者组
  • 不做 XTRIM:消息永久堆积,内存持续上涨直到触发淘汰或实例崩溃
  • 消费者组读完不 XACK:未确认消息一直留在 PEL,XPENDING 越积越多,重启后重复消费
  • 把 Stream 当精确一次投递:Redis 只保证至少一次,消费端必须做幂等

数据来源与参考

  • Redis 官方文档: Streams
  • Redis 官方文档: XADD

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌