*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 接管并处理。