Redis 8.8 的 INCREX:把 INCR + EXPIRE 限流合成一条原子命令
Redis Open Source 8.8(2026-05 发布)带来一个新命令 INCREX,以及新的 Array 数据结构、hash 字段级通知等。信息来源为 redis.io 官方 8.8 release notes 与 what's new。
一、INCREX:窗口计数器限流命令
INCREX(PR #15045)把 INCR、INCRBY、INCRBYFLOAT、上下界(bounds)与过期(expiration)组合成一条原子操作,专门用来做窗口计数限流。
在此之前,窗口计数限流的常规写法是两条命令配合:
INCR key
EXPIRE key
问题在于这两步之间不是原子的:INCR 成功、EXPIRE 没执行上,key 就会一直留着不消失,计数窗口失去意义。要用 Lua 脚本或者事务(MULTI/EXEC)把它们包起来,才能保证原子性。
INCREX 把这件事变成单命令,省掉多命令事务。原子性由服务端保证,不会出现 INCR 成功而 EXPIRE 没设上的窗口漏洞。计数与过期窗口由一条命令一起决定,限流逻辑不用再拆成两次往返。
二、新 Array 数据结构
Redis 8.8 引入新的 Array 数据结构(PR #15162,由 @antirez 贡献),为有序、可索引的集合提供专用类型。此前要表达「有序 + 可按索引访问」的集合,多半用 list 或 JSON 数组凑。
三、hash 字段级通知(subkey notification)
新增对 hash 字段的 subkey 通知,即 keyspace notifications 可以做到字段级,而不再只到 key 级别。需要配合 keyspace notification 配置使用,例如 notify-keyspace-events 中的相应标志。这样订阅方在 hash 某个字段发生变化时就能收到事件,不必在 key 粒度上被唤醒后自己去比对。
四、其他新增命令与能力
- XNACK:新的 streams 命令,允许消费者显式释放 pending 消息,对消费者组的 PEL(pending entries list)有更细粒度控制。
- ZUNION / ZINTER / ZUNIONSTORE / ZINTERSTORE:新增 COUNT 聚合器(aggregator),用于组合有序集合时统计。
- JSON.SET:新增 FPHA 参数,为同构浮点数组指定浮点类型。
- TS.RANGE / TS.REVRANGE / TS.MRANGE / TS.MREVRANGE:单条命令支持多个聚合器。
- FT.HYBRID 的 KNN 子句:新增参数,可请求每个分片更少的候选,在 cluster 模式下降低开销。
- FT.PROFILE:支持对 FT.HYBRID 做 profiling。
- FT.AGGREGATE:新增组内排序 reducer,GROUPBY 之后可展开分组文档并在组内排序。
五、性能改进(8.8)
这一版的优化点比较分散,分几类:
- HyperLogLog 使用 4 个独立累加器,最后合并。
- MGET / MSET 批量预取(batched prefetch)。
- HGETALL 在 hashtable 编码的 hash 上批量预取(#14988)。
- 给 jemalloc 传 size hint 加快释放(#15071)。
- 编译期 jemalloc 调优,降低分配器与统计开销(#15096)。
- 向量索引热路径(HNSW 与暴力搜索)去虚化(devirtualization),降低单次查询延迟。
- AArch64 启用 inline LSE 原子操作,提升 ARM64 原子吞吐。
- 大量 key 同时过期时的过期处理开销降低。
- x86_64 release 构建启用 LTO。
- 迭代器移植到 Rust,减少 FFI 开销。
版本线与文档
8.8 的补丁线为:8.8.0(2026-05)、8.8.1(2026-07)、8.8.2(2026-08,含安全修复)。后续 8.10 引入 compact hashes 与 HIMPORT。
官方文档: