*Redis XPENDING 命令
XPENDING 返回消费者组待处理条目列表(PEL)的摘要信息或详细信息,包括已投递但未被确认的消息。
*语法
XPENDING key group [[IDLE min-idle-time] start end count [consumer]]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Stream 键名 |
| group | String | 是 | 消费者组名称 |
| IDLE | Integer | 否 | 最小空闲时间(毫秒),仅返回空闲时间大于此值的消息 |
| start | String | 否 | 范围起始 ID(+ 或 -) |
| end | String | 否 | 范围结束 ID(+ 或 -) |
| count | Integer | 否 | 返回的最大消息数量 |
| consumer | String | 否 | 仅返回指定消费者的待处理消息 |
*返回值
无额外参数时:
- Array:包含 4 个元素:
- 待处理消息总数(Integer)
- 最小 ID(String)
- 最大 ID(String)
- 消费者数组,每个消费者包含名称和待处理数量
带范围参数时:
- Array:待处理消息的详细信息数组,每个元素包含 ID、消费者、空闲时间、重试次数
*时间复杂度
- 仅返回摘要且消费者数量少:O(1) - 返回详细信息:O(N),N 为返回的元素数量
- 使用 IDLE 过滤时:O(M),M 为扫描的总条目数
*示例
*查看 PEL 摘要
> XPENDING mystream mygroup
1) (integer) 3
2) "1526569495631-0"
3) "1526569495633-0"
4) 1) 1) "consumer1"
2) "2"
2) 1) "consumer2"
2) "1"
*查看详细待处理消息
> XPENDING mystream mygroup - + 10
1) 1) "1526569495631-0"
2) "consumer1"
3) (integer) 60000
4) (integer) 1
2) 1) "1526569495632-0"
2) "consumer1"
3) (integer) 120000
4) (integer) 2
*使用 IDLE 过滤
> XPENDING mystream mygroup IDLE 60000 - + 10
1) 1) "1526569495632-0"
2) "consumer1"
3) (integer) 120000
4) (integer) 2
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数不足或格式错误 | 检查 key、group 和可选参数格式 |
| NOGROUP No such consumer group | 消费者组不存在 | 先创建消费者组 |
*最佳实践
- 定期调用 XPENDING 监控待处理消息数量,发现积压及时告警
- 使用 IDLE 参数找出长时间未处理的消息,然后通过 XCLAIM 转移给其他消费者
- 结合重试次数(delivery count)识别可能的问题消息,超过阈值可放入死信队列
- 在生产环境中建议定时巡检 XPENDING,作为消费者健康度指标
*FAQ
Q1: XPENDING 返回的空闲时间(idle)是什么意思? A: 自消息最后一次被投递给某个消费者以来经过的毫秒数。如果消息被 XCLAIM,空闲时间会被重置。
Q2: 如何找出所有待处理消息?
A: 使用 XPENDING key group - + 1000,返回最多 1000 条待处理消息的详细信息。
Q3: XPENDING 和 XINFO CONSUMERS 有什么区别? A: XPENDING 关注具体的消息条目;XINFO CONSUMERS 关注消费者级别的统计信息(如消费者总数、各自待处理数量)。