编程 Redis 8.2 的 XACKDEL/XDELEX:多消费者组下,确认并删除流条目一条命令搞定

2026-10-15 21:03:21

Redis 8.2 的 XACKDEL/XDELEX:多消费者组下,确认并删除流条目一条命令搞定

Redis 8.2 于 2025-08-08 GA,Stream 新增了两个命令:XDELEX 和 XACKDEL,把「确认完还得自己清理」这段应用层逻辑收回到 Redis 里。

多消费者组清理的老麻烦

Stream 条目被消费者组读取后会留下 PEL 引用。这时候直接 XDEL,问题就来了:PEL 里可能留下悬挂引用,或者未处理完的 PEL 条目被一并清掉。以前要做「确认之后清理已确认条目」,只能自己在应用层写逻辑——遍历每个消费者组的 PEL,判断还有没有未确认的,再决定删不删。

XACKDEL 把「确认」和「删除」合并成单个原子操作;XDELEX 则支持从一个或多个 stream 删除条目,并带上消费者组的处理选项。两个命令都支持 KEEPREF、DELREF、ACKED 三个选项,用来精确控制删除时消费者组的引用如何处理。

取舍:引用计数,还是确认即删

这三个选项对应的是两条不同路线。

一条是引用计数式的延迟回收:条目还有组在引用就先留着,只递减引用,等没人引用了再真正删除。好处是语义干净,不用担心某个慢消费者组的 PEL 突然指向一个已经不存在的 entry;代价是内存释放滞后,长 PEL 的场景下条目会多驻留一段时间。

另一条是确认即删:当前组确认了就直接删掉,引用同时处理,不等待其他组。清理及时、逻辑简单,但需要你确认其他组的消费进度不会因此被破坏。

以前这个选择没得选——应用层只能自己维护状态,或者干脆容忍 PEL 残留。现在选项交给调用方,判断标准落在业务上:这个 stream 是不是单消费者组、组间消费进度差多少、能不能接受悬挂引用。ACKED 则进一步把范围收窄到已确认的条目上,避开未处理完的 PEL。

XADD 和 XTRIM 也扩展了针对删除条目的行为,裁剪和写入时对引用的处理不再是一刀切。

BITOP 新增 4 个位运算算子

BITOP 加了四个算子,把原本要多次调用才能拼出来的集合运算压进单条命令:

  • DIFF:在 X 中但不在任何 Y 中
  • DIFF1
  • ANDOR
  • ONE:恰好存在于其中一个 bitmap 中

CLUSTER SLOT-STATS

新命令 CLUSTER SLOT-STATS,按 slot 给出 key 数量、CPU 时间、网络进出流量等指标,做热点分析和容量规划时不用再自己从 INFO 里拼。

向量与键空间通知

VSIM 新增 IN 过滤算子;新增 SVS-VAMANA 向量索引类型,支持向量压缩。keyspace notifications 增加两个事件类型:OVERWRITTEN(键值被完全覆盖)和 TYPE_CHANGED(键类型发生变化)。

内存与性能数字

底层用统一的 kvobj 结构,把键名、短值和 TTL 打包进单次内存分配:短字符串内存下降 25%–37%,JSON 数值内存最高下降 67%。70+ 命令做了优化,BITCOUNT 快 35%,LINSERT/LREM/LPOS 延迟降低 25% 以上;8 个 I/O 线程下吞吐最高提升 49%。

对多消费者组的 Stream 使用方来说,这版最值得先动的是清理路径:把应用层那段「遍历 PEL 再决定删不删」的代码,换成 XACKDEL 或 XDELEX 加明确的引用选项。

复制全文 生成海报 Redis Stream 缓存 数据库

推荐文章

程序员茄子在线接单