*Redis XINFO CONSUMERS 命令
XINFO CONSUMERS 用于返回指定 Stream 消费组中所有消费者的详细信息,包括 pending 数量、idle 时间等。
*语法
XINFO CONSUMERS key group
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Stream 键名 |
| group | String | 是 | 消费组名称 |
*返回值
- Array:每个消费者为一个子数组,包含以下字段
name:消费者名称pending:该消费者的 pending 消息数量idle:距上次尝试交互的毫秒数(XREADGROUP / XCLAIM / XAUTOCLAIM)inactive:距上次成功交互的毫秒数(Redis 7.2+)
- Error:key 不存在、不是 Stream、组不存在等
*时间复杂度
O(1)
*
*示例
*查看消费组消费者
> XADD mystream * msg hello
"1638125000000-0"
> XGROUP CREATE mystream mygroup 0
OK
> XREADGROUP GROUP mygroup Alice COUNT 1 STREAMS mystream >
...
> XINFO CONSUMERS mystream mygroup
1) 1) "name"
2) "Alice"
3) "pending"
4) (integer) 1
5) "idle"
6) (integer) 9104628
7) "inactive"
8) (integer) 18104698
*多个消费者
> XREADGROUP GROUP mygroup Bob COUNT 1 STREAMS mystream >
...
> XINFO CONSUMERS mystream mygroup
1) 1) "name"
2) "Alice"
3) "pending"
4) (integer) 1
5) "idle"
6) (integer) 9104628
7) "inactive"
8) (integer) 18104698
2) 1) "name"
2) "Bob"
3) "pending"
4) (integer) 1
5) "idle"
6) (integer) 83841983
7) "inactive"
8) (integer) 993841998
*空闲消费者检测
> XINFO CONSUMERS mystream mygroup
1) 1) "name"
2) "worker-1"
3) "pending"
4) (integer) 5
5) "idle"
6) (integer) 3600000
7) "inactive"
8) (integer) 3600000
# worker-1 已空闲 1 小时,可考虑用 XAUTOCLAIM 回收消息
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| NOGROUP | 消费组不存在 | 确认 group 名称正确 |
| ERR no such key | key 不存在 | 确认 key 名称正确 |
| WRONGTYPE | key 不是 Stream | 确认 key 的数据类型 |
*最佳实践
- 监控
idle和inactive值,识别挂掉的消费者 - 结合 XPENDING 和 XAUTOCLAIM 实现自动故障转移
- 消费者命名建议包含主机/进程信息,如
worker-node1-pid1234 pending持续增长的消费者可能存在处理瓶颈或死锁
*FAQ
Q1: idle 和 inactive 有什么区别?
A: idle 是距上次尝试交互的时间(包括未成功获取消息的 XREADGROUP);inactive 是距上次成功交互的时间(真正处理到消息)。Redis 7.2 之前只有 idle,含义等同于现在的 inactive。
Q2: 消费者会过期消失吗? A: 消费者不会在超时后自动删除,即使长时间不活动也会保留在组内。如需清理,可使用 XGROUP DELCONSUMER。
Q3: 刚创建的消费组为什么看不到消费者? A: 消费者只有在首次调用 XREADGROUP 后才会被注册到组内。