【Redis从入门到精通】第70篇:Redis未来展望——从7.x新特性到Redis Stack的全栈野心 上一篇【第69篇】Redis性能调优实战——从监控到参数调整的全套方案系列完结感谢阅读2009年一个意大利程序员写了Redis。2015年Redis成为了GitHub上Star最多的数据库项目。2024年Redis宣布修改开源协议Valkey横空出世。2026年你读完了这70篇文章成为了一名Redis高手。这是《Redis从入门到精通》系列的最后一篇文章。我们不聊单个命令或特性而是站在更高处看看这个改变了互联网基础设施格局的数据库从何而来将往何处去。一、Redis发展史时间线Redis进化时间线 2009年 ─ Redis 1.0 诞生 │ antirez为了解决LLOOGG的实时统计问题 │ 用C语言写了第一个版本 │ 特性String、List、Set数据结构 │ 2010年 ─ Redis 2.0 │ 虚拟内存后来被淘汰、Pub/Sub │ 发布订阅机制为后来消息队列打下基础 │ 2011年 ─ Redis 2.2 ~ 2.4 │ 新增Hash、ZSet数据结构 │ 数据结构家族基本成型 │ 2012年 ─ Redis 2.6 │ Lua脚本支持、PSYNC部分同步 │ 脚本让Redis有了逻辑能力 │ 2013年 ─ Redis 2.8 │ Sentinel哨兵模式、SCAN系列命令 │ Keys* 退出历史舞台 │ 2014年 ─ Redis 3.0 │ Redis Cluster集群方案正式发布 │ 分布式终于有了官方解决方案 │ 2015年 ─ antirez加入Redis Labs现Redis Inc. │ 项目正式商业化运营 │ 2017年 ─ Redis 4.0 │ 模块系统Modules API、LFU淘汰 │ 从此Redis可以无限扩展 │ 2018年 ─ Redis 5.0 │ Stream数据结构、新的ZPOP/BZPOP │ 终于有了真正的消息队列 │ 2020年 ─ Redis 6.0 │ 多线程IO仅网络IO、ACL权限控制 │ RESP3协议、客户端缓存 │ antirez宣布退休Redis迎来新维护者 │ 2022年 ─ Redis 7.0 │ Multi-Part AOF、Functions、ACL改进 │ Listpack替代ziplist │ 2023年 ─ Redis 7.2 │ Sharded Pub/Sub、LMPOP │ 2024年 ─ 协议变更与Valkey分叉 │ Redis宣布从BSD改为RSALv2SSPLv1 │ Linux基金会宣布Valkey项目 │ 开源社区迎来重大变局 │ 2025年 ─ Redis 8.0 发布 │ 持续创新中...二、Redis 7.0一次内部革命Redis 7.0与其说增加了多少新功能不如说是一次深度的内部重构。它解决了很多长期存在的架构问题。2.1 Multi-Part AOF这是7.0最重要的改进之一。旧的AOF重写机制使用fork子进程对内存消耗极大。Multi-Part AOF彻底改变了AOF的存储方式旧版AOF重写 ┌─────────────────────────────────────────┐ │ 步骤1: fork子进程 │ │ 父进程内存 10GB │ │ fork时需要拷贝页表可能阻塞数百毫秒 │ │ 子进程同样占用10GB COW内存写时复制 │ │ │ │ 步骤2: 子进程遍历所有数据 │ │ 10GB的遍历IO密集 │ │ │ │ 步骤3: 写入新AOF文件 │ │ 一次性写入可能数GB │ │ │ │ 缺点整个过程对Redis性能冲击很大 │ └─────────────────────────────────────────┘ 新版Multi-Part AOF ┌─────────────────────────────────────────┐ │ 基础文件base 增量文件incr │ │ │ │ appendonly.aof.1.base.rdb ← RDB格式快照 │ │ appendonly.aof.1.incr.aof ← 增量命令日志 │ │ │ │ 优势 │ │ ✓ 不需要fork子进程 │ │ ✓ 不需要遍历所有数据 │ │ ✓ 增量追加IO平滑 │ │ ✓ 多版本共存回滚更安全 │ └─────────────────────────────────────────┘2.2 Listpack替代ZiplistZiplist的痛点 - 级联更新修改一个元素可能触发整个列表重写 - 查找效率低O(N)顺序扫描 - 编码复杂不同类型的entry编码不同 Listpack的改进 - 每个entry记录自己的长度而不是总偏移 - 消除了级联更新问题 - 编码更简洁性能更好 Ziplist entry: Listpack entry: ┌─────────┬──────┬──────┬────────┐ ┌──────┬──────┬────────┐ │prev_len │ flag │ data │ end │ │ flag │ data │ len │ │(可能级联)│ │ │ │ │ │ │(局部) │ └─────────┴──────┴──────┴────────┘ └──────┴──────┴────────┘ ↑ 这里就是级联更新的根源 ↑ 记录自己长度无级联2.3 Redis Functions-- Redis 7.0: 在服务端注册持久化的Lua函数-- 不同于EVAL脚本内容每次都要传输Functions是持久化在服务端的-- 加载函数库#!lua namemylibredis.register_function(my_ping,function()returnPONGend)redis.register_function(double,function(key)localvalredis.call(GET,key)returnval*2end)-- 调用函数-- FCALL my_ping 0-- FCALL double 1 mykey2.4 ACL v2# Redis 7.0 ACL改进# 支持key权限模式匹配ACL SETUSER app_user onpassword ~app:** all -dangerous# ~app:* → 只允许操作app:开头的key# * → 允许所有Pub/Sub频道# all → 允许所有命令分类# -dangerous→ 但禁止危险命令FLUSHALL、CONFIG等# Redis 7.0新增选择器(Selector)ACL SETUSER power_user onpwd(~admin:* all)# selector 1: admin命名空间全权限(~public:* read)# selector 2: public命名空间只读三、Redis 7.2集群能力的强化3.1 Sharded Pub/SubRedis 7.2引入了Sharded Pub/Sub解决了传统Pub/Sub在Cluster模式下的性能瓶颈传统Pub/Sub在Cluster中 ┌─────────────────────────────────────────┐ │ 发布一条消息 → 广播到所有节点 │ │ 即使只有一个节点上有订阅者 │ │ → 集群间消息广播 巨大的网络开销 │ └─────────────────────────────────────────┘ Sharded Pub/Sub ┌─────────────────────────────────────────┐ │ 消息按channel被哈希到特定slot │ │ 只发到拥有该slot的节点 │ │ → 精确路由网络开销最小化 │ │ │ │ 使用SSUBSCRIBE / SPUBLISH │ │ SSUBSCRIBE orders.{shard_id} │ │ SPUBLISH orders.1 new order │ └─────────────────────────────────────────┘3.2 LMPOP一次弹出多个列表# 从多个列表中弹出最左边非空的一个127.0.0.1:6379LMPOP2queue1 queue2 LEFT# 2列表数量# 等同于哪个队列有数据就从哪个取# 不需要客户端轮询多个队列四、Redis Stack从缓存到全栈平台的野心Redis Stack是Redis的全家桶版本集成了多个扩展模块让Redis从缓存升级为全栈数据处理平台。Redis Stack Redis Server 核心扩展模块 ┌──────────────────────────────────────────────┐ │ Redis Stack │ │ │ │ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │ │RediSearch│ │RedisJSON │ │RedisTimeSeries │ │ │ │ 全文搜索 │ │ JSON存储 │ │ 时序数据 │ │ │ └──────────┘ └──────────┘ └───────────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ │ │RedisBloom│ │RedisGraph│ │ RedisGears │ │ │ │ 概率数据 │ │ 图数据库 │ │ 无服务器引擎 │ │ │ └──────────┘ └──────────┘ └───────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ RedisInsight │ │ │ │ 可视化桌面管理工具 │ │ │ └──────────────────────────────────────────┘ │ └──────────────────────────────────────────────┘4.1 RediSearch让Redis拥有搜索引擎的能力# 创建索引FT.CREATE idx:products ON HASH PREFIX1product: SCHEMA name TEXT SORTABLE price NUMERIC SORTABLE description TEXT category TAG SORTABLE# 添加文档HSET product:1 nameiPhone 18 Proprice9999description最新款苹果手机category手机HSET product:2 nameMacBook Proprice14999description苹果笔记本电脑category电脑# 全文搜索FT.SEARCH idx:products苹果# 返回product:1和product:2# 模糊搜索 过滤FT.SEARCH idx:productsname:(iPhone) price:[5000 15000]# 名称包含iPhone且价格在5000-15000之间的商品# 聚合查询FT.AGGREGATE idx:products*GROUPBY1category REDUCE AVG1price AS avg_price# 按分类分组计算平均价格RediSearch的核心能力功能说明类比全文索引中文分词、英文词干Elasticsearch模糊匹配前缀/后缀/包含SQL LIKE数值范围大于/小于/区间SQL WHERE price 100地理搜索基于坐标的半径查询MongoDB Geo聚合查询GROUP BY / SUM / AVGSQL聚合自动补全搜索建议Elasticsearch Suggester4.2 RedisJSONJSON文档的原生存储# 存储JSON文档JSON.SET user:1 ${name:张三,age:25,address:{city:北京,district:海淀}}# 路径查询JSON.GET user:1 $.address.city# [北京]# 更新嵌套字段JSON.SET user:1 $.age26JSON.NUMINCRBY user:1 $.age1# age 1# 数组操作JSON.SET user:1 $.hobbies[编程,跑步,读书]JSON.ARRAPPEND user:1 $.hobbies摄影# 追加元素JSON.ARRPOP user:1 $.hobbies# 弹出最后一个# 多条件查询结合RediSearchJSON.SET user:1 ${name:张三,age:25,city:北京}JSON.SET user:2 ${name:李四,age:30,city:上海}4.3 RedisTimeSeries专业时序数据处理# 创建时序TS.CREATE temperature:room1 RETENTION86400000LABELS room1sensor temp# └─ 保留时间(毫秒) └─ 标签# 添加数据点TS.ADD temperature:room1171670000000023.5TS.ADD temperature:room1171670000100023.8TS.ADD temperature:room1 *24.0# * 使用当前时间戳# 范围查询TS.RANGE temperature:room117167000000001716703600000# 聚合降采样TS.RANGE temperature:room117167000000001716703600000AGGREGATION avg60000# 每分钟的平均温度# 跨时序聚合TS.MRANGE... FILTERroom1# 查询所有room1的温度计4.4 RedisBloom你已认识的老熟人我们在第065篇已经用过的布隆过滤器在Redis Stack中得到了更完整的支持# 布隆过滤器BF.ADD bloom:users user_001 BF.EXISTS bloom:users user_001# 1 可能存在BF.EXISTS bloom:users user_999# 0 一定不存在# 布谷鸟过滤器支持删除CF.ADDNX cf:users user_001 CF.DEL cf:users user_001# 可以删除CF.EXISTS cf:users user_001# 0 已删除# Top-KTOPK.RESERVE topk:pages50# 统计top 50TOPK.ADD topk:pages page1 page2 page3... TOPK.LIST topk:pages# 返回top K元素# Count-Min Sketch频率统计CMS.INITBYDIM cms:clicks20005CMS.INCRBY cms:clicks page:home1CMS.QUERY cms:clicks page:home# 估计点击数# T-Digest分位数统计TDIGEST.CREATE tdigest:latency TDIGEST.ADD tdigest:latency1.22.50.83.1... TDIGEST.QUANTILE tdigest:latency0.5# 中位数TDIGEST.QUANTILE tdigest:latency0.99# P99五、Redis 8.0与新的发展方向截至本文撰写时2026年5月Redis 8.0已经发布。以下是已知的重要特性Redis 8.0 新特性概览 1. 更强大的Cluster能力 - 改进的slot迁移更少的阻塞 - 自动rebalancing - 跨slot的事务支持 2. 性能和可观测性 - 更多的延迟监控指标 - 改进的内存分析工具 - 异步删除的进一步优化 3. 开发者体验 - RESP3协议的完整支持 - 更友好的客户端库支持 - 改进的TLS和认证机制 4. 人工智能集成 - Vector Similarity Search向量相似搜索 - 支持RAG应用的向量存储 - 与LLM生态的集成六、Valkey分叉事件2024年开源社区的地震2024年3月Redis Inc.宣布将Redis的核心从BSD许可证改为RSALv2和SSPLv1双许可证。这个决定在开源社区引发了巨大反响。事件时间线 2024.3.20 Redis Inc.宣布协议变更 2024.3.22 Linux基金会宣布Valkey项目 2024.3.28 谷歌、亚马逊、甲骨文、爱立信等联合支持Valkey 2024.4 Valkey 7.2.5发布基于Redis 7.2的最后一个BSD版本 2024.7 Valkey 8.0发布独立发展路线 2024.Q4 各大云厂商陆续迁移 至今 Redis和Valkey并行发展 协议变化要点 ┌─────────────────────────────────────────┐ │ Redis 7.4 使用 RSALv2 SSPLv1 │ │ │ │ RSALv2 (Redis Source Available License): │ │ - 允许使用、修改、分发 │ │ - 但不能用Redis构建与Redis竞争的产品 │ │ - 不能提供Redis作为托管服务 │ │ │ │ SSPLv1 (Server Side Public License): │ │ - 如果提供Redis作为服务 │ │ - 必须开源所有相关的管理软件代码 │ │ │ │ 影响最大的是云厂商的托管Redis服务 │ │ AWS ElastiCache、阿里云Redis等 │ └─────────────────────────────────────────┘Redis vs Valkey选哪个 继续用Redis ✓ 官方团队维护 ✓ 有企业级支持Redis Enterprise ✓ 如果只是内部使用协议变化无影响 ✓ 如果你是云厂商需要购买商业许可 切换到Valkey ✓ 完全开源BSD许可证 ✓ Linux基金会管理 ✓ 主流云厂商支持AWS/GCP/阿里云都有贡献 ✓ 社区驱动开发 ✓ 如果你需要托管Redis服务Valkey无许可问题 建议 - 大多数用户继续用Redis协议变化对你没影响 - 云厂商/SaaS平台考虑Valkey或购买Redis商业许可 - 观望者两个项目目前功能几乎相同迁移成本低⚠️ 注意本文写于2026年5月以上关于Valkey和Redis发展的信息可能随时间变化。建议在做技术选型时查阅最新的官方公告。七、Redis与云原生7.1 Kubernetes OperatorRedis K8s部署架构 ┌─────────────────────────────────────────────────┐ │ Kubernetes Cluster │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ Redis Operator │ │ │ │ ┌───────────┐ ┌───────────┐ │ │ │ │ │ Master Pod│ │ Slave Pod │ Sentinel Pod│ │ │ │ │ redis:7 │ │ redis:7 │ │ │ │ │ │ PVC: 50Gi │ │ PVC: 50Gi │ │ │ │ │ └───────────┘ └───────────┘ │ │ │ │ 自动故障转移、扩缩容、备份恢复 │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────┐ │ │ │ Redis Cluster on K8s │ │ │ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ │ │ │ │ S0 │ │ S1 │ │ S2 │ │ S3 │ │ S4 │ │ S5 │ │ │ │ │ │M/S │ │M/S │ │M/S │ │M/S │ │M/S │ │M/S │ │ │ │ │ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ │ │ │ │ StatefulSet Headless Service │ │ │ └─────────────────────────────────────────────┘ │ │ │ │ 推荐Operator │ │ - Redis Enterprise Operator (官方) │ │ - Spotahome Redis Operator (社区流行) │ │ - OT-CONTAINER-KIT Redis Operator (CNCF相关) │ └─────────────────────────────────────────────────┘7.2 Serverless Redis云厂商正在推动Redis的Serverless化Serverless Redis的特性 - 按使用量计费存储请求数 - 自动扩缩容 - 零运维 - 与K8s/云函数无缝集成 主要产品 - AWS ElastiCache Serverless - 阿里云Tair Serverless - Upstash RedisServerless原生 - Redis Enterprise Cloud灵活的自动扩缩容八、学习资源推荐8.1 继续深入资源类型适合阶段redis.io/docs官方文档全阶段Redis源码GitHub源码阅读进阶《Redis设计与实现》黄健宏书籍初~中级《Redis实战》Josiah L. Carlson书籍中级Redis University免费在线课程课程全阶段RedisConf 演讲视频视频进阶redis.io/commands命令参考全阶段8.2 社区与动态Redis官方博客redis.io/blogValkey项目valkey.ioRedis Mailing Listgroups.google.com/g/redis-dbGitHub Discussionsgithub.com/redis/redis/discussions九、系列70篇知识体系回顾从第001篇到第070篇我们走完了Redis从入门到精通的完整旅程。以下是完整的知识地图《Redis从入门到精通》系列 70 篇完整目录 第1-10篇入门基础 ├─ 001 Redis是什么——从意大利披萨店讲起 ├─ 002 手把手安装Redis——从源码到Docker的五种姿势 ├─ 003 Redis数据类型全景——不仅仅是缓存 ├─ 004 Redis配置文件那些事 ├─ 005 Redis客户端操作指南 ├─ 006 Redis管道与批量操作 ├─ 007 Redis命令速查手册 ├─ 008 Redis安全最佳实践 ├─ 009 redisObject对象系统全解析 └─ 010 告别char* SDS重新定义字符串 第11-20篇数据结构深度解析 ├─ 011 SDS实战——Redis字符串操作背后的黑科技 ├─ 012 链表——Redis列表的底层支撑 ├─ 013 哈希表——Redis字典的核心数据结构 ├─ 014 Rehash揭秘——Redis字典扩容缩容的精妙设计 ├─ 015 跳跃表——有序集合背后的精妙数据结构 ├─ 016 跳跃表vs平衡树 ├─ 017 整数集合 ├─ 018 压缩列表 ├─ 019 String对象的七十二变 └─ 020 List对象底层大揭秘 第21-30篇对象与持久化 ├─ 021 Hash对象——ziplist和hashtable的双重人格 ├─ 022 Set对象——intset和hashtable的混搭艺术 ├─ 023 ZSet对象——ziplist和skiplist的完美组合 ├─ 024 Redis内存优化完全指南 ├─ 025 Redis数据库那些事 ├─ 026 Redis过期键机制 ├─ 027 过期键的骨牌效应 ├─ 028 数据库通知 ├─ 029 RDB持久化 └─ 030 RDB文件格式完全解析 第31-40篇持久化与架构 ├─ 031 AOF持久化 ├─ 032 AOF重写 ├─ 033 RDB vs AOF ├─ 034 Redis事件驱动模型 ├─ 035 Redis为什么这么快 ├─ 036 Redis客户端属性大揭秘 ├─ 037 Redis服务器启动全流程 ├─ 038 serverCron心跳定时任务 ├─ 039 Redis主从复制 └─ 040 旧版复制的硬伤 第41-50篇集群与高可用 ├─ 041 PSYNC登场 ├─ 042 复制全流程 ├─ 043 Redis Sentinel ├─ 044 Sentinel启动与监控 ├─ 045 主观下线和客观下线 ├─ 046 Sentinel选主 ├─ 047 Redis Cluster ├─ 048-050 Cluster数据分布/伸缩/复制与故障转移 第51-60篇进阶功能 ├─ 051 Cluster复制与故障转移 ├─ 052 Sentinel vs Cluster ├─ 053 Redis发布订阅 ├─ 054 发布订阅实战 ├─ 055 Redis事务 ├─ 056 Redis事务的ACID分析 ├─ 057-060 (进阶主题) 第61-64篇高级应用 ├─ 061 慢查询日志 ├─ 062 Redis监视器 ├─ 063 分布式锁 └─ 064 限流器 第65-70篇生产实战与展望 ├─ 065 缓存穿透/击穿/雪崩——三大缓存坑的解决方案 ├─ 066 消息队列——用Redis实现轻量级MQ的四种方案 ├─ 067 Redis Stream——终于有了真正的消息队列 ├─ 068 HyperLogLog——用极小内存统计超大基数 ├─ 069 Redis性能调优实战——从监控到参数调整的全套方案 └─ 070 Redis未来展望——从7.x新特性到Redis Stack的全栈野心 ← 本篇写在最后70篇文章从SET key value到Redis Stack全栈平台从单机缓存到Cluster集群从几KB的SDS到12KB的HyperLogLog统计亿级数据——Redis的世界远比最初想象的丰富。有一个来自antirez的故事一直很打动我Redis最初只是为了解决他另一个项目LLOOGG的实时统计问题。他没打算做一个数据库也没打算让它被全世界使用。他只是写了一个解决自己问题的工具顺便开源了。然后这个顺便改变了一切。最后把antirez在Redis 7.0发布时的话送给大家“Redis is a data structure server. It’s not a cache, it’s not a database, it’s not a message broker. It’s something that gives you data structures over the network. What you do with them, it’s your own story.”Redis给了我们数据结构而我们写出了自己的故事。感谢你读完了这70篇文章。祝你写出属于自己的精彩故事。上一篇【第69篇】Redis性能调优实战——从监控到参数调整的全套方案系列完结感谢阅读