*Redis XACK 命令

XACK 用于将消费者组中的待处理消息标记为已正确处理,将其从 PEL(Pending Entries List)中移除。


*语法

XACK key group id [id ...]

*参数说明

参数 类型 必填 说明
key String Stream 键名
group String 消费者组名称
id String 消息 ID,支持多个

*返回值

  • Integer:成功确认的消息数量(实际能在 PEL 中解析到的 ID 数量)
  • 0:所有指定的 ID 都不在 PEL 中

*时间复杂度

O(1) 每个消息 ID。


*示例

*基本用法

> XACK mystream mygroup 1526569495631-0
(integer) 1
> XACK mystream mygroup 1526569495631-0 1526569495632-0
(integer) 2

*确认不存在的消息

> XACK 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

*常见错误

错误 原因 解决
ERR wrong number of arguments 缺少 key、group 或 id 参数 检查必传参数
NOGROUP No such consumer group 消费者组不存在 先使用 XGROUP CREATE 创建

*最佳实践

  • 在业务逻辑成功处理消息后调用 XACK,确保消息不会重复处理
  • 批量 XACK 比逐个确认效率更高,减少网络往返
  • 如果消费者崩溃,未 XACK 的消息会被其他消费者通过 XCLAIM 接管
  • 配合 XPENDING 定期检查长期未确认的消息

*FAQ

Q1: XACK 后消息还在 Stream 中吗? A: 是的,XACK 只是将消息从 PEL 中移除,消息本身仍在 Stream 中,直到被 XTRIM 或删除。

Q2: 重复 XACK 同一个 ID 会报错吗? A: 不会,重复 XACK 返回 0,表示该 ID 已不在 PEL 中。

Q3: 如果消费者崩溃,未 XACK 的消息怎么办? A: 未确认的消息会一直留在 PEL 中,其他消费者可以通过 XCLAIM 接管并处理。