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 控制长度,否则内存被慢慢吃光。