首页/数据/Redis 进阶速查/XPENDING 与 XCLAIM 处理未确认消息
数据结构与选型42 条

XPENDING 与 XCLAIM 处理未确认消息

XPENDING 查看各消费者的未确认消息数与范围,XCLAIM 把超时未确认的消息转给其他消费者重试,XAUTOCLAIM 可批量认领。

Redis 进阶速查数据更新于 2026-10-13

XPENDING 与 XCLAIM 是什么

消息被某个消费者读走但还没确认时,会记录在消费组的待处理列表(PEL)里,归属到读它的那个消费者名下。待处理列表是 Stream 可靠性的核心:它让「已投递但未处理完成」这件事变得可观测、可干预。XPENDING 用来查看积压情况,XCLAIM 把空闲超过指定时长的消息转交给另一个消费者重试,XAUTOCLAIM 则可以一次批量认领多条,适合做僵尸消费者的兜底清理。

基本信息

概览查询XPENDING key group,返回总数、最小与最大 ID、各消费者未确认数
明细查询XPENDING key group - + 10,列出具体消息与空闲时长
单条认领XCLAIM key group consumer <min-idle-time> <id>
批量认领XAUTOCLAIM key group consumer <min-idle-time> <start> COUNT n
确认XACK key group id,处理完成后把消息从待处理列表中移除

典型使用场景

  • 消费者崩溃恢复:把宕机消费者的未确认消息转交给在线的消费者重试
  • 僵尸消费者清理:消费者下线但记录仍在,用批量认领把消息收回到可用节点
  • 积压监控:把待处理总数与最老消息的空闲时长接入监控,积压出现即告警
  • 长耗时任务保护:设置足够的空闲阈值,避免把仍在处理中的消息抢走
  • 上线变更后的核对:确认消费者换名或缩容后没有遗留无法归属的消息

查看与认领

查看与认领
redis-cli XPENDING orders g1                     # 总览:总数、ID 范围、各消费者未确认数
redis-cli XPENDING orders g1 - + 10              # 前 10 条明细与空闲时长
redis-cli XCLAIM orders g1 consumer2 60000 1730020000000-0   # 空闲超 1 分钟后认领单条
redis-cli XAUTOCLAIM orders g1 consumer2 60000 0-0 COUNT 10  # 批量认领,游标从 0-0 开始
redis-cli XACK orders g1 1730020000000-0         # 处理完成后确认
redis-cli XINFO GROUPS orders                    # 各组 pending 数量与最后投递 ID

认领参数的含义

参数含义取值建议
min-idle-time只认领空闲超过该毫秒数的消息必须大于单条消息的最长处理时间
start 游标XAUTOCLAIM 的起始 ID首次用 0-0,后续用返回的新游标
COUNT单次认领上限按消费者吞吐设置,避免一次抢太多
JUSTID只返回 ID,不返回消息体只做转发或计数时更省带宽
空闲阈值是防误抢的关键:min-idle-time 表示「这条消息已经被读出多久没有被确认」,设置得比正常处理耗时长,就不会把正在处理中的消息抢走。阈值一旦设置过短,会出现两个消费者同时处理同一条消息的重复执行。
待处理列表会持续占用内存:未确认的消息不会自动清理,长期积压既是内存问题也是业务问题——意味着有消息没有被处理完。监控应同时看总数与最老消息的空闲时长,只关注总数会漏掉「少量消息长期卡住」的情况。

易错点

  • 处理后忘记 XACK,消息一直留在待处理列表中,业务侧表现为部分订单永远不再被处理
  • min-idle-time 设得过短,正在处理中的消息被其他消费者认领,同一条消息被重复执行
  • 认领后没有重新执行处理逻辑或没有幂等保护,重复执行造成数据被写两次
  • 只监控待处理总数不看最老消息空闲时长,少量长期卡住的消息在总数平稳时被完全忽略

数据来源与参考

  • Redis 官方文档:XPENDING / XCLAIM / XAUTOCLAIM 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌