*Redis XREADGROUP 命令

以消费者组身份从 Stream 中读取消息。支持消息确认机制和负载均衡。


*语法

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]

*参数说明

参数 类型 必填 说明
GROUP group String 消费者组名称
consumer String 消费者名称
COUNT Integer 每个 Stream 最多读取数量
BLOCK Integer 阻塞等待毫秒,0 表示永久
NOACK 标志 自动确认(不加入 PEL)
STREAMS 标志 声明后续是 Stream 列表
key String Stream 键名
ID String > 表示读取新消息,具体 ID 表示认领该 ID 的待处理消息

*返回值

条件 返回值
有消息 消息数组,格式同 XREAD
无消息/超时 nil 或空数组

*时间复杂度

O(log(N)+M),N 为 Stream 消息数,M 为返回数量。


*示例

# 创建消费者组
> XGROUP CREATE mystream mygroup $
OK

# 消费者 consumer-1 读取新消息
> XREADGROUP GROUP mygroup consumer-1 COUNT 1 STREAMS mystream >
1) 1) "mystream"
   2) 1) 1) "1717000000000-0"
         2) 1) "event"
            2) "order_created"

# 消息进入 PEL(Pending Entries List),需要 XACK 确认

*常见错误

  1. 消费者组不存在:先 XGROUP CREATE 创建组。
  2. NOACK 慎用:NOACK 自动确认,消息不会进入 PEL,丢失后无法恢复。

*最佳实践

  1. 负载均衡:多个消费者用同一 group 不同 consumer 名称,消息自动分配给不同消费者。
  2. 故障转移:消费者崩溃后,其他消费者用 XREADGROUP ... 0 认领其待处理消息。
  3. 及时 ACK:处理完消息后立即 XACK,防止 PEL 无限增长。

*FAQ

Q: XREADGROUP 和 XREAD 有什么区别? A: XREADGROUP 属于消费者组,消息进入 PEL 需要确认;XREAD 只是简单读取,不跟踪消费状态。

Q: > 和具体 ID 有什么区别? A: > 读取组内未分配给任何消费者的新消息;具体 ID(如 0)读取该消费者或组的待处理消息(PEL)。

Q: 消费者名称重要吗? A: 重要。同一消费者名称重启后会继续消费其待处理消息;不同名称是不同消费者身份。