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不一致。