*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: 重要。同一消费者名称重启后会继续消费其待处理消息;不同名称是不同消费者身份。