*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

*常见错误

  1. ID 格式错误:ID 必须是 毫秒-序列号 或特殊值 $/0

*最佳实践

  1. 消费者组外消费:XREAD 适合简单消费者,不需要消息确认机制。
  2. BLOCK 等待:BLOCK 0 永久阻塞等待新消息,配合超时重连。
  3. ID=0 全量读取:首次读取用 0,之后用上次最后一条消息的 ID。

*FAQ

Q: XREAD 和 BLPOP 有什么区别? A: XREAD 读 Stream(支持多消费者、消息确认);BLPOP 读 List(简单队列,无确认)。

Q: $ 是什么意思? A: $ 表示只接收 XREAD 命令执行后到达的新消息,不读取历史消息。

Q: XREAD 可以重复消费吗? A: 可以。XREAD 只是读取,不会移除或确认消息。多次读取相同范围会得到相同消息。