Redis 8.4 升级笔记:原子槽迁移、字符串原子操作与 FT.HYBRID
官方文档:
Release notes:
Cloud breaking changes:
Redis 8.4 在 8.2 基础上主要补了三块:集群运维、字符串原子操作、流与查询引擎。下面是相对 8.2 的主要变化。
集群:原子槽迁移与槽级指标
CLUSTER MIGRATION做原子槽迁移,把槽和其关联数据放在一次原子操作里搬完,消除过去迁移过程中那段短暂不可用窗口。CLUSTER SLOT-STATS给出每槽用量指标:key 数、CPU 时间、网络 I/O。
这两条配合用,槽分布倾斜和热点槽能直接从指标看出来,迁移也不再需要业务侧容忍一个不可用间隙。
字符串:DELEX / DIGEST / SET 扩展 / MSETEX
DELEX:值匹配指定条件时才删 key。DIGEST:生成 key 值的加密摘要,用于完整性校验。SET新增扩展,支持原子 compare-and-set 和 compare-and-delete,可用来做无锁数据结构和乐观并发控制。MSETEX:一次原子地设置多个 key 并更新它们的过期时间。
这几个命令把「先读再判断再写」的竞态收进了单条原子操作,原来靠 Lua 脚本或 WATCH/MULTI 实现的逻辑可以简化。
流:XREADGROUP CLAIM
XREADGROUP 新增 CLAIM min-idle-time 选项:一次操作里既能认领并处理闲置的 pending 条目,也能消费新到达的条目,不必再分两轮读。
查询引擎:FT.HYBRID
FT.HYBRID 支持混合查询,用 Reciprocal Rank Fusion(RRF)和线性组合融合多种排序算法的打分。
新增配置:
search-default-scorer:默认文本与 tag 打分器,新默认值是BM25STD。search-on-oom:查询时遇到 OOM 的行为,三档——IGNORE(OOM 也照常查)、FAIL(启动时任一节点处于 OOM 就失败)、RETURN(仅部分集群节点 OOM 时返回部分结果,默认值)。search-io-threads:集群管理器协调器使用的通信线程数,默认 20。
性能改动
- I/O threading:吞吐提升明显,缓存类场景(10% SET、90% GET)在 4 核下提升超过 30%。
LOOKAHEAD预取(#14440):通过 lookahead 管道提前解析多条命令,运行时可配,默认 16。BITCOUNT:AVX2、AVX512 popcount 实现,另有 Arm Neon SIMD 向量化。- HyperLogLog:无分支比较优化 + Arm Neon SIMD 向量化。
- Vector set 的
VADD/VSIM:AVX2、AVX512 点积实现。 - JSON:同构数组与短字符串内联,内存占用最多降低 91%。
AOF 启动修复
新增 aof-load-corrupt-tail-max-size:启动时允许 Redis 自动修复尾部轻微损坏的 AOF。
配置参数汇总
aof-load-corrupt-tail-max-size、decode_array_with_array_mt(Lua 中控制空 JSON 数组的处理方式)、lookahead(运行时 lookahead 深度,默认 16)、search-default-scorer、search-on-oom、search-io-threads。
已知限制
- 原子槽迁移期间,搜索命令(
FT.SEARCH、FT.AGGREGATE、FT.CURSOR、FT.HYBRID)和时序命令(TS.MGET、TS.MRANGE、TS.MREVRANGE、TS.QUERYINDEX)可能返回部分结果或重复。 FT.PROFILE、FT.EXPLAIN、FT.EXPLAINCLI不包含FT.HYBRID选项。FT.HYBRID指标不在FT.INFO和INFO中显示。- 部分
FT.HYBRID选项尚未上线:EXPLAINSCORE、SHARD_K_RATIO、YIELD_DISTANCE_AS、WITHCURSOR。 COMBINE步骤之后用FILTER做后置过滤,当前不支持。
升级判断
集群在线扩缩容频繁、对迁移窗口敏感的部署,8.4 的原子槽迁移是主要收益点;但迁移期间搜索与时序命令可能返回部分结果或重复,一致性要求高的读路径要避开迁移窗口,或用 CLUSTER SLOT-STATS 先确认没有正在进行的迁移。
依赖默认文本打分的业务要注意 search-default-scorer 换成 BM25STD 后排序结果会变,需要旧行为就显式指定打分器。search-on-oom 默认 RETURN,即部分节点 OOM 时返回部分结果;要强一致失败语义就改 FAIL。I/O threading 的收益与核数和负载相关,上线前按自己的 SET/GET 比例压测确认。
打算用 FT.HYBRID 的,先把上面的限制过一遍:缺的选项和后置过滤会影响查询写法,FT.PROFILE/FT.EXPLAIN 暂时看不到它的执行细节,指标也要另找地方观测。AOF 的 aof-load-corrupt-tail-max-size 只处理尾部轻微损坏,不能替代备份与校验。