资讯 Redis 8.12 RC1:集合成员级 TTL、BLESS 防淘汰与压缩位图进核心

2026-10-30 21:10:26

Redis 8.12 RC1:集合成员级 TTL、BLESS 防淘汰与压缩位图进核心

Redis 8.12 RC1 于 2026-10-29 发布,是 Redis Open Source 8.12 的首个 Release Candidate。RC 意味着功能已经冻结,属于预发布版本,不要在生产环境使用。

已测试的操作系统:Ubuntu 22.04/24.04/26.04,Rocky Linux 8.10/9.7/10.1,AlmaLinux 8.10/9.7/10.1,Debian 12.13/13.4,Alpine 3.23,macOS 14.8.4/15.7.4/26.3(Intel 与 ARM)。

安全修复

  • RediSearch/RediSearch#10073:索引值的哈希计算改为抗碰撞,避免构造输入导致的 HashDoS 式索引退化。(MOD-14459)
  • RediSearch/RediSearch#11202:索引 TEXT 字段中不完整的 UTF-8 字符不再越界读取。(MOD-18088)

新特性

集合成员级过期

#15938 给 Set 引入了成员粒度的 TTL,命令分两组:

设置过期时间:

SEXPIRE    key member seconds
SPEXPIRE   key member milliseconds
SEXPIREAT  key member unix-time-seconds
SPEXPIREAT key member unix-time-milliseconds

读取剩余 TTL 或过期时间戳:

STTL        key member   # 秒
SPTTL       key member   # 毫秒
SEXPIRETIME key member   # 秒级时间戳
SPEXPIRETIME key member  # 毫秒级时间戳

和 key 级 EXPIRE 的区别在于作用域:key 级过期一到,整个 Set 连同所有成员一起消失;成员级 TTL 只清理单个成员,key 本身仍然存在,SCARD、SMEMBERS 也会随之变化。

成员过期后 SCARD/SMEMBERS 的即时行为,取决于过期删除采用惰性还是主动清理,以及该行为在复制与 AOF 中如何传播——这一部分需要在目标版本上自行实测确认,不要按 key 级过期的语义直接推断。

BLESS:保护指定 key 不被淘汰

#15649 新增 BLESS 命令,用于把指定 key 标记为不被淘汰。

在设置了 maxmemory 和淘汰策略(maxmemory-policy)的实例上,淘汰逻辑会优先把其他 key 驱逐出去,被 BLESS 的 key 继续留在内存里。适合放那些一旦被淘汰就会带来明显恢复成本的、规模小却频繁读取的对象,比如热配置、队列的元数据。

风险同样直接:被保护的 key 长期占用内存,等于缩减了可淘汰的空间。保护的对象太多或太大,maxmemory 的压力会转移到剩余 key 上,极端情况下淘汰仍然释放不出足够内存。保护列表要小,并且有明确的移出机制。

压缩位图与 BITRANGEINTARRAY

#15331 把 redis-roaring 合并进 Redis 核心,位图使用更少内存,位图操作也更快。

#15986 新增 BITRANGEINTARRAY,等价于 redis-roaring 的 R.RANGEINTARRAY,返回指定范围内所有置位(值为 1)的位偏移。这一点补上了原有命令的空白:BITCOUNT 只能给出范围内的置位总数,BITPOS 只能定位第一个满足条件的位,要枚举范围内具体哪些位被置位,原先只能靠客户端逐段扫描。现在可以在服务端一次性拿到偏移数组。

CLUSTER MIGRATION STATUS 报告两阶段进度

#15829 之后,CLUSTER MIGRATION STATUS 同时报告快照阶段和增量阶段的迁移进度,不必再靠间接指标猜测迁移卡在哪一步。

TLS 命名组

#15556 支持通过 tls-groups 配置 TLS 命名组。

Count-min sketch 扩展

RedisBloom#1063:

  • CMS.INITBYDIM 和 CMS.INITBYPROB 支持可选的 CELL_SIZE,用更小的 cell 换取更低的内存占用。
  • CMS.INCRBY 支持负增量,可用于对计数做递减。
  • CMS.INFO 会报告 cell size。

RediSearch / RedisJSON

  • RedisJSON#1640:JSON 深层路径支持自动创建。
  • RediSearch#11330:HNSW 向量字段新增 SQ8 压缩(MOD-6132)。
  • RediSearch#10151:FT.HYBRID 支持 EXPLAINSCORE(MOD-10044)。
  • RediSearch#10247:本地执行 FT.HYBRID 时启用 RETURN_STRICT 超时处理(MOD-16492)。
  • RediSearch#11278:FT.ALTER 做 schema 追加时不再触发不必要的文档重建索引(MOD-18171)。
  • RediSearch#11384:只修改 score/payload 的哈希更新不再触发重建索引(MOD-18182)。
  • RediSearch#11230:未触及任何向量索引字段的哈希文档不再重建索引(MOD-17688)。

Bug 修复(选摘)

  • #15569:对已删除流条目的 XDELEX DELREF 改动可能未传播到副本或 AOF。
  • #15508:基于随机基数树遍历的操作在从特定叶子节点起步时行为可能出错。
  • #15604:使用共享模板的哈希内存用量可能计算错误。
  • #15489:XSETID 降低流的 entries_added 计数后,RDB 文件可能加载失败。
  • #15626:SET 在给定过大的相对 TTL 时可能算出错误的过期时间。
  • #15628:主动碎片整理可能错误处理紧凑哈希使用的共享模板注册表。
  • #15530:故障转移后,副本可能仍连着另一个副本而不是新的主节点。
  • #15733:非法的集群槽区间被合并进合法区间后可能被接受。
  • #15756:RESTORE 在给定过大的相对 TTL 时可能算出错误的过期时间。
  • #15699:SETBIT 或 BITFIELD 扩展字符串时内存增长可能记账错误。
  • #15815:XTRIM 可能让流进入某种状态,导致包含它的 RDB 文件无法加载。
  • #15795:畸形命令跨多次网络读取到达时,客户端可能收不到协议错误。
  • #15875:ARLASTITEMS 可能漏掉数组中空隙之后的元素。
  • #15916:旧版 AOF 文件在加载完成前被升级可能导致数据丢失。
  • #15917:Linux 上的 Hiredis 客户端建立 TCP 连接时可能错误处理错误。
  • #15869:模块线程暂停 I/O 线程时 Redis 可能崩溃。
  • #15468:订阅用户频道权限被撤销或用户被删除后,若客户端已改用另一用户重新认证,Pub/Sub 订阅可能仍然有效。
  • #15623:哈希字段过期后,由哈希字段过期通知调度的模块动作可能被延迟。
  • #15680:副本迁移到其他分片后可能丢数据。
  • #15587:LMOVEM 产生的键空间通知可能与 LMOVE 不一致。
复制全文 生成海报 Redis 新版本 缓存 运维

推荐文章

程序员茄子在线接单