Redis 从入门到精通(十四):Redis 7.x 新特性全解 —— 系列收官之作 Redis 从入门到精通十四Redis 7.x 新特性全解 —— 系列收官之作一、版本演进速览Redis 5.0 (2018.10): Stream 类型、ZPOPMIN/ZPOPMAX Redis 6.0 (2020.04): ACL 2.0、多线程 I/O、TLS、RESP3 Redis 7.0 (2022.04): Multi-Part AOF、listpack 全面替代、Redis Function、ACL 增强 Redis 7.2 (2023.08): 扩展 listpack 覆盖范围、优化内存效率 Redis 7.4 (2024.07): Hash 过期、更优的内存效率二、Multi-Part AOF持久化架构重构这是 Redis 7.0 最重要的改进之一第三篇已经详细讲过这里做总结。2.1 旧版 AOF 的问题重写时一个巨大的内存缓冲区aof_rewrite_buf高并发下可能 OOM单一 AOF 文件重写失败时状态不明确文件过大时需要手动 BGREWRITEAOF2.2 Multi-Part AOF 的改进# 新架构的文件结构appendonlydir/ ├── appendonly.aof.manifest# 清单文件总指挥├── appendonly.aof.1.base.rdb# BaseRDB 格式的全量快照├── appendonly.aof.1.incr.aof# Incremental增量 AOF└── appendonly.aof.2.incr.aof# 下一个增量文件核心优势改进点旧版Redis 7.0重写缓冲区单一大内存缓冲直接写入新的 incr 文件增量文件轮转不支持达到阈值自动切新文件磁盘空间回收重写后才删旧文件渐进式清理历史文件恢复灵活性全有或全无可按 manifest 选择性恢复三、Listpack 全面替代 Ziplist第二篇详细讲过两者的实现差异这里聚焦于 Redis 7.x 的迁移进展。3.1 替代时间线版本进展Redis 5.0listpack 首次引入仅用于 StreamRedis 7.0Hash、ZSet 的小数据编码默认使用 listpackRedis 7.2listpack 覆盖范围进一步扩大Redis 7.4ziplist 相关配置项几乎全部移除3.2 迁移配置# Redis 7.0 的新配置替代旧的 ziplist 配置hash-max-listpack-entries512# 替代 hash-max-ziplist-entrieshash-max-listpack-value64# 替代 hash-max-ziplist-valuezset-max-listpack-entries128# 替代 zset-max-ziplist-entrieszset-max-listpack-value64# 替代 zset-max-ziplist-value# 升级到 Redis 7.2 后旧的 ziplist 配置自动忽略3.3 为什么一定要换连锁更新问题是 ziplist 的致命缺陷第二篇第四节的完整推演listpack 通过去掉prevlen字段彻底消除。在高并发写入场景下ziplist 的连锁更新可能导致毫秒级甚至秒级的延迟抖动——listpack 完全没有这个问题。四、Redis FunctionLua 脚本的下一代方案第八篇介绍了 Lua 脚本和 Redis Function 的区别这里深入。4.1 Function vs Lua 脚本# 传统 Lua 脚本EVALreturn redis.call(GET, KEYS[1])1mykey# 问题脚本内容每次传输SHA1 不可读重启后缓存丢失# Redis FunctionFUNCTION LOAD#!lua namemylib redis.register_function(my_get, function(keys, args) return redis.call(GET, keys[1]) end)FCALL my_get1mykey# 优势函数名可读可持久化管理方便# 查看函数库FUNCTION LIST# 导出函数库FUNCTION DUMP# 恢复函数库FUNCTION RESTOREserialized# 删除函数库FUNCTION DELETE mylib# 查看函数库统计FUNCTION STATS4.2 Function 的持久化优势特性Lua 脚本Redis Function重启后脚本缓存丢失需重新 SCRIPT LOAD函数随 AOF/RDB 持久化重启后自动恢复主从复制脚本内容复制到从库函数定义复制到从库管理方式SHA1 哈希不可读函数名可读库组织无函数库library组织RESP3不感知可返回 RESP3 类型 Map/Set五、ACL 增强5.1 ACL 2.0 核心功能# 创建用户精细的权限控制ACL SETUSER app_user onpassword123\~app:*\# 只能操作 app:* 前缀的 keyread\# 允许读命令hash\# 允许 Hash 命令-write\# 禁止写命令-dangerous# 禁止危险命令# 通道权限Pub/SubACL SETUSER subscriber onpass\channel:*# 只能订阅特定频道# 选择器Selector多规则组合ACL SETUSER power_user onpass\(~app:* all)\# Selector 1: 对 app:* 有全部权限(~cache:* read)# Selector 2: 对 cache:* 只有读权限5.2 ACL 日志# 查看被拒绝的命令ACL LOG10# 重置 ACL 日志ACL LOG RESET# 输出# 1) 1) count # 拒绝次数# 2) reason # 拒绝原因# 3) context # 上下文# 4) username # 用户# 5) client-info # 客户端信息5.3 最佳实践# 1. 禁用 default 用户ACL SETUSER default off# 2. 最小权限原则ACL SETUSER app onpass ~app:* read write -dangerous# 3. 定期审计ACL LIST ACL LOG100# 4. 保存配置ACL SAVE六、性能和命令变更6.1 性能提升优化项版本效果多线程 I/O6.0网络读写多线程命令执行仍单线程。io-threads 4dict 内存优化7.0哈希表内存占用降低约 20%SDS 头优化7.0embstr 阈值从 44 字节提升到 44 字节jemalloc 优化String 整数编码7.0整数的编码和操作更快listpack 替代 ziplist7.0/7.2消除连锁更新延迟更稳定6.2 新增命令# Redis 7.0 新增SINTERCARD numkeys key[key...][LIMIT limit]# 交集数量不返回具体元素ZINTERCARD numkeys key[key...][LIMIT limit]# ZSet 交集数量EXPIRETIME key# 获取过期时间Unix 时间戳秒PEXPIRETIME key# 同上毫秒SORT_RO key[BY...]# 排序只读不修改原 key# Redis 7.2 新增WAIT replicatestimeout# 等待指定数量从库确认同步复制# Redis 7.4 新增HEXPIRE key seconds[NX|XX|GT|LT]FIELDS num field[field...]HPEXPIRE key ms[NX|XX|GT|LT]FIELDS num field[field...]HEXPIRETIME key FIELDS num field[field...]HTTL key FIELDS num field[field...]6.3 重点新命令详解# HEXPIRE: Hash 字段级别过期7.4 重大更新HSET user:session:1001 tokenabcuser_id1001HEXPIRE user:session:10013600FIELDS1token# 只有 token 字段会过期user_id 不设过期# SINTERCARD: 高效统计交集数量# 旧方式SINTER set1 set2 → SMEMBERS → 数数量O(NMK)# 新方式SINTERCARD 2 set1 set2O(NM) 且不传输完整数据SADD set1 a b c d e SADD set2 c d e f g SINTERCARD2set1 set2# 返回 3c,d,eSINTERCARD2set1 set2 LIMIT2# 返回 2只要够 2 个就停止# SORT_RO: 只读排序SADD numbers303221SORT_RO numbers BY * LIMIT02ASC# 返回 [1, 3]原 key 不变七、升级建议7.1 版本推荐当前版本推荐目标理由Redis 5.x7.0跨越式升级获得 Stream ACL FunctionRedis 6.07.0 / 7.27.0 稳定7.2 最新优化Redis 6.27.2生产验证充分listpack 覆盖更广新项目7.2 或最新稳定版直接上最新7.2 升级前检查清单# 1. 检查废弃配置# ziplist 相关配置改为 listpack# 旧的 RDB/AOF 文件格式兼容# 2. 检查命令兼容性redis-cli--clustercheck# 集群模式INFO replication# 主从状态# 3. 滚动升级Cluster / Sentinel# 先升级从库 → 故障转移 → 升级旧主库# 逐个操作不可全部同时升级# 4. 监控观察# 升级后观察 24 小时内存、延迟、慢查询、主从同步八、系列总回顾经过十四篇文章我们构建了完整的 Redis 知识体系运维与未来13-14第十三篇性能优化与运维第十四篇7.x 新特性高级进阶篇10-12第十篇高级特性第十一篇客户端与连接池第十二篇业务场景实战业务应用篇7-9第七篇缓存设计第八篇事务/Lua/Pipeline第九篇分布式锁基础设施篇3-6第三篇持久化机制第四篇主从复制第五篇哨兵 Sentinel第六篇集群 Cluster基础篇1-2第一篇基础入门第二篇深入数据结构十四篇文章四个层次层次篇目核心收获基础1-2五种类型 六大底层结构理解 Redis “怎么存”基础设施3-6持久化 → 主从 → Sentinel → Cluster“越来越稳”业务应用7-9缓存设计 原子操作 分布式锁“从能用到好用”进阶运维10-14高级特性 客户端 实战 运维 新版本本系列到此完结。从第一篇的SET key value到最后一篇的Multi-Part AOF和Redis Function我们走完了 Redis 从入门到精通的全过程。希望这十四篇文章成为你面试复习的知识图谱、生产排障的参考手册、系统设计的灵感来源。感谢阅读。如有疑问或建议欢迎在每篇文章下方评论交流。