*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 确认
*常见错误
- 消费者组不存在:先 XGROUP CREATE 创建组。
- NOACK 慎用:NOACK 自动确认,消息不会进入 PEL,丢失后无法恢复。
*最佳实践
- 负载均衡:多个消费者用同一 group 不同 consumer 名称,消息自动分配给不同消费者。
- 故障转移:消费者崩溃后,其他消费者用
XREADGROUP ... 0认领其待处理消息。 - 及时 ACK:处理完消息后立即 XACK,防止 PEL 无限增长。
*FAQ
Q: XREADGROUP 和 XREAD 有什么区别? A: XREADGROUP 属于消费者组,消息进入 PEL 需要确认;XREAD 只是简单读取,不跟踪消费状态。
Q: > 和具体 ID 有什么区别?
A: > 读取组内未分配给任何消费者的新消息;具体 ID(如 0)读取该消费者或组的待处理消息(PEL)。
Q: 消费者名称重要吗? A: 重要。同一消费者名称重启后会继续消费其待处理消息;不同名称是不同消费者身份。