*Redis XNACK 命令
XNACK 用于将消费者组中的已确认消息重新标记为待处理状态,将其重新放回 PEL(Pending Entries List)中。
*语法
XNACK key group id [id ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Stream 键名 |
| group | String | 是 | 消费者组名称 |
| id | String | 是 | 消息 ID,支持多个 |
*返回值
- Integer:成功恢复为待处理状态的消息数量
- 0:指定的 ID 不在已确认列表中或已不存在
*时间复杂度
O(1) 每个消息 ID。
*示例
*基本用法
> XNACK mystream mygroup 1526569495631-0
(integer) 1
> XNACK mystream mygroup 1526569495631-0 1526569495632-0
(integer) 2
*恢复不存在的消息
> XNACK mystream mygroup 9999999999999-0
(integer) 0
*在业务流程中使用
> XGROUP CREATE mystream mygroup $ MKSTREAM
OK
> XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >
1) 1) "mystream"
2) 1) 1) "1526569495631-0"
2) 1) "field1"
2) "value1"
> XACK mystream mygroup 1526569495631-0
(integer) 1
> XNACK mystream mygroup 1526569495631-0
(integer) 1
> XPENDING mystream mygroup
1) (integer) 1
2) "1526569495631-0"
3) "1526569495631-0"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少 key、group 或 id 参数 | 检查必传参数 |
| NOGROUP No such consumer group | 消费者组不存在 | 先使用 XGROUP CREATE 创建 |
*最佳实践
- 在业务处理失败后需要重新消费时使用 XNACK,将消息恢复为待处理状态
- 批量 XNACK 比逐个操作效率更高,减少网络往返
- 配合 XPENDING 确认消息已成功恢复为待处理状态
- 注意:XNACK 可能触发消息重复处理,确保业务逻辑支持幂等性
*FAQ
Q1: XNACK 和 XACK 有什么区别? A: XACK 将消息标记为已处理并从 PEL 中移除;XNACK 将已确认的消息重新放回 PEL,使其可被重新消费。
Q2: XNACK 后的消息会被哪个消费者消费? A: 任何消费者都可以通过 XREADGROUP 或 XCLAIM 获取该消息,不指定特定消费者。
Q3: XNACK 可以恢复已被删除的消息吗? A: 不可以,如果消息已被 XTRIM 或删除,XNACK 返回 0。