*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: 任何消费者都可以通过 XREADGROUPXCLAIM 获取该消息,不指定特定消费者。

Q3: XNACK 可以恢复已被删除的消息吗? A: 不可以,如果消息已被 XTRIM 或删除,XNACK 返回 0。