*Redis XREAD 命令
从一个或多个 Stream 中读取消息。支持阻塞等待新消息。
*语法
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| COUNT | Integer | 否 | 每个 Stream 最多返回的消息数 |
| BLOCK | Integer | 否 | 阻塞等待毫秒,0 表示永久阻塞 |
| STREAMS | 标志 | 是 | 声明后续是 Stream 列表 |
| key | String | 是 | Stream 键名 |
| id | String | 是 | 起始 ID,$ 表示只读新消息 |
*返回值
| 条件 | 返回值 |
|---|---|
| 有消息 | 数组 [[stream, [id, [field, value, ...]], ...], ...] |
| 无消息且非阻塞 | nil |
| 超时 | nil |
*时间复杂度
O(N+M),N 为 Stream 数量,M 为返回消息数量。
*示例
# 非阻塞读取
> XREAD STREAMS mystream 0
1) 1) "mystream"
2) 1) 1) "1717000000000-0"
2) 1) "sensor_id"
2) "1234"
3) "temperature"
4) "19.8"
# 只读新消息(消费者模式)
> XREAD BLOCK 5000 STREAMS mystream $
# 阻塞等待新消息,超时返回 nil
1) 1) "mystream"
2) 1) 1) "1717000000001-0"
2) 1) "event"
2) "click"
# 多 Stream
> XREAD COUNT 2 STREAMS stream1 stream2 0 0
*常见错误
- ID 格式错误:ID 必须是
毫秒-序列号或特殊值$/0。
*最佳实践
- 消费者组外消费:XREAD 适合简单消费者,不需要消息确认机制。
- BLOCK 等待:BLOCK 0 永久阻塞等待新消息,配合超时重连。
- ID=0 全量读取:首次读取用 0,之后用上次最后一条消息的 ID。
*FAQ
Q: XREAD 和 BLPOP 有什么区别? A: XREAD 读 Stream(支持多消费者、消息确认);BLPOP 读 List(简单队列,无确认)。
Q: $ 是什么意思?
A: $ 表示只接收 XREAD 命令执行后到达的新消息,不读取历史消息。
Q: XREAD 可以重复消费吗? A: 可以。XREAD 只是读取,不会移除或确认消息。多次读取相同范围会得到相同消息。