Redis 的意外开源:一个意大利程序员的个人项目如何改变数据库世界
当意大利程序员萨尔瓦托雷·桑菲利波为自己的创业公司开发实时分析工具时,他没想到这个个人项目会成为全球最受欢迎的内存数据库。
导语
2009年3月的西西里岛,春寒料峭。在卡塔尼亚郊外的一栋小房子里,35岁的萨尔瓦托雷·桑菲利波盯着电脑屏幕上那行刚写下的代码,深吸了一口气。他刚刚为自己的实时分析项目创建了一个简单的键值存储——REmote DIctionary Server,简称 Redis。这只是为了解决一个具体问题:如何在内存中快速存储和检索用户行为数据。桑菲利波没有预料到,这个仅用两周完成的原型,将在未来15年里成为支撑全球互联网基础设施的关键组件,被 Twitter、GitHub、Stack Overflow 等科技巨头采用,每天处理数万亿次请求。这是一个关于一个程序员、一个想法和开源社区如何改变世界的传奇故事。
时代背景(Why now)
2009年的互联网,正在经历一场深刻的技术变革。
Web 2.0 的巅峰
Facebook 刚刚突破 2 亿用户,Twitter 正在爆发式增长,社交媒体成为主流。这些应用有一个共同特点:实时性。用户期望看到朋友的最新动态、收到即时通知、看到实时的趋势话题。
移动应用的黎明
iPhone 3GS 于2009年发布,App Store 正在重塑软件行业。移动应用需要快速响应,因为用户无法忍受在小小的手机屏幕上等待加载。
传统数据库的困境
MySQL、PostgreSQL 等关系型数据库为持久化存储而设计,数据写入磁盘,强调数据安全。但在需要微秒级响应的场景下,它们显得力不从心:
- 会话存储:用户登录状态需要快速读写
- 实时排行榜:游戏分数需要实时更新和排序
- 缓存:频繁访问的数据需要从内存读取
- 消息队列:应用组件间的异步通信
Memcached 是当时最流行的内存缓存解决方案,但它功能简单,只支持键值对,且重启后数据丢失。
实时分析的需求
互联网公司开始意识到数据的价值。他们想要实时了解用户行为:谁在访问、点了什么按钮、停留了多久。传统的批量处理(每晚运行一次分析任务)太慢了,需要实时或准实时的分析能力。
这正是 Redis 诞生的土壤。
产品诞生(Origin Story)
萨尔瓦托雷·桑菲利波(Salvatore Sanfilippo),在意大利被称为”antirez”,是一个自学成才的程序员。
他出生在卡塔尼亚,西西里岛的第二大城市。没有正式的计算机科学学位,桑菲利波通过阅读书籍、写代码、参与开源项目自学成才。他曾是系统管理员、Web 开发者、嵌入式系统工程师。
2006年,桑菲利波创办了一家名为”Wappwork”的初创公司,开发移动应用。公司后来更名为”LLOOGG”,转型做网站实时分析服务。
“LLOOGG 让我陷入了困境,“桑菲利波后来回忆,“我们需要实时跟踪数百万用户的页面浏览行为,但 MySQL 太慢了。每次查询都要等待磁盘 I/O,而用户期望毫秒级的响应。”
他尝试使用 Memcached,但它太简单,不支持持久化,也不支持复杂的数据结构。他需要一个更好的解决方案。
2009年3月,桑菲利波决定自己动手。他给自己两周时间,创建一个简单的内存数据库原型。
他的设计原则很简单:
- 快:所有操作都在内存中完成,复杂度 O(1)
- 简单:使用简单的文本协议(后来演变为 RESP——Redis Serialization Protocol)
- 功能丰富:不仅支持字符串,还支持列表、集合、哈希等数据结构
两周后,Redis 的第一个版本诞生了。桑菲利波在他的博客上发布了这个项目,并惊讶地发现反响热烈。
“人们开始发邮件给我,说’这太棒了,正是我需要的’,“桑菲利波说,“我意识到这可能比 LLOOGG 本身更有价值。“
第一个关键突破(First Breakthrough)
Redis 的第一个关键突破,来自于它的数据结构。
与 Memcached 的简单键值对不同,Redis 提供了丰富的数据类型:
Strings(字符串):最基础的类型,但支持原子操作(INCR、DECR),可以直接用作计数器。
Lists(列表):实现为双向链表,支持 LPUSH、RPOP 等操作,天然适合做消息队列。
Sets(集合):无序的唯一值集合,支持交集、并集、差集操作,适合做标签系统、共同好友。
Sorted Sets(有序集合):每个元素关联一个分数,自动按分数排序,这是实时排行榜的完美数据结构。
Hashes(哈希):键值对的集合,适合存储对象。
这些数据结构看似简单,但它们解决了真实世界的问题:
Twitter 的 Timeline:用列表存储用户的推文流,新推文 LPUSH 到列表头部,读取时取前 N 条。
游戏排行榜:用有序集合存储玩家分数,ZRANK 可以立即获取玩家排名,ZREVRANGE 获取前 100 名。
会话管理:用哈希存储用户会话数据,设置过期时间自动清理。
速率限制:用字符串的 INCR 和 EXPIRE 实现 API 限流。
2009年6月,Redis 0.09 版本发布,支持持久化(RDB 快照)。这让 Redis 从纯缓存变成了真正的数据库——即使重启,数据也不会丢失。
2010年3月,Redis 1.0 正式发布。桑菲利波已经收到了来自 VMWare 的工作邀请。
扩张阶段(Growth)
2010年至2013年,是 Redis 的快速扩张期。
加入 VMWare
2010年,桑菲利波接受了 VMWare 的邀请,成为全职 Redis 开发者。这对 Redis 来说是重要的转折点——在此之前,Redis 只是桑菲利波的业余项目;现在,他可以全身心投入。
VMWare 提供了资源和合法性。Redis 不再只是一个”意大利程序员的玩具”,而是 VMWare 支持的开源项目。
2.0 版本:革命性的持久化
2011年10月,Redis 2.0 发布,引入了 AOF(Append Only File)持久化机制。与 RDB 快照不同,AOF 记录每一个写操作,重启时重放。这提供了更好的数据安全性,虽然牺牲了一些性能。
2.0 还引入了虚拟内存(Virtual Memory),允许 Redis 使用磁盘存储不常用的数据。但这个功能后来被证明过于复杂,在 2.4 版本中被移除。
社区爆发
2012年至2013年,Redis 的用户数呈指数级增长。GitHub 使用 Redis 存储实时通知;Twitter 使用 Redis 存储时间线和社交图谱;Stack Overflow 使用 Redis 做缓存和实时分析。
GitHub 的工程团队甚至写了一篇著名博客文章《How We Made GitHub Fast》,详细描述了 Redis 在他们的架构中的关键作用。
Redis 2.6 和 Lua 脚本
2012年10月,Redis 2.6 发布,引入了 Lua 脚本支持。这让开发者可以在 Redis 服务器端执行复杂的逻辑,而无需多次往返客户端。
Lua 脚本的引入标志着 Redis 从一个简单的数据结构服务器,向完整的应用平台演进。
关键竞争(Competition)
Redis 的崛起并非没有挑战。
Memcached 的坚守
Memcached 依然是简单缓存场景的首选。它的内存效率更高(没有 Redis 的元数据开销),协议更简单。Facebook、Wikipedia 等网站依然主要使用 Memcached。
但 Memcached 的创新几乎停滞。它的简单性既是优点也是局限——它只做一件事(键值缓存),而且做得很好,但不支持复杂数据结构。
Couchbase 和 Membase
2011年,CouchDB 和 Memcached 背后的公司合并,推出了 Couchbase。这是一个持久化的键值存储,支持 Memcached 协议,同时提供持久化和复制。
Couchbase 定位为企业级解决方案,提供更好的管理工具和商用支持。它吸引了一些企业用户,但从未在开发者社区获得 Redis 那样的热情。
MongoDB 和 NoSQL 浪潮
MongoDB、Cassandra、HBase 等 NoSQL 数据库也在竞争同一批用户。但 Redis 找到了自己的定位:它不是通用数据库,而是特定场景的专用工具。许多公司同时使用多种数据库:PostgreSQL 做主存储,Redis 做缓存和实时处理。
Redis 的优势
Redis 在竞争中胜出的关键:
- 开发者体验:简单的 API、丰富的文档、活跃的社区
- 数据结构:列表、集合、有序集合等数据结构解决真实问题
- 性能:单线程架构避免了锁竞争,性能可预测
- 生态系统:客户端库支持几乎所有编程语言
拐点(Turning Point)
Redis 的关键转折点出现在2013年至2015年间。
离开 VMWare,成立 Redis Labs
2013年,桑菲利波离开 VMWare,加入了新成立的 Redis Labs(后来更名为 Redis Inc.)。这是一家商业化 Redis 的公司,提供托管 Redis 服务和 Redis 企业版。
这个决定曾经引发争议。一些人担心 Redis 会失去开源精神,变成专有软件。但桑菲利波坚持认为,商业化是 Redis 长期健康的必要条件。
“开源软件需要可持续的商业模式,“桑菲利波解释道,“Redis Labs 让我可以全职开发 Redis,同时保持代码开源。”
Redis 3.0:集群模式
2015年4月,Redis 3.0 发布,引入了 Redis Cluster——官方的分布式解决方案。
在此之前,Redis 只能运行在单台服务器上,内存容量是硬性限制(虽然有一些第三方分片方案)。Redis Cluster 允许数据自动分片到多个节点,提供了水平扩展能力。
Redis Cluster 的发布标志着 Redis 从”小型缓存”向”大规模数据平台”的转变。现在,Redis 可以处理 TB 级别的数据。
AWS ElastiCache 和云原生
AWS 于2011年推出 ElastiCache,2013年开始支持 Redis。这极大降低了使用 Redis 的门槛——开发者无需管理服务器,只需要点击几下就能获得一个高可用的 Redis 集群。
Google Cloud Memorystore、Azure Cache for Redis 等类似服务相继推出,Redis 成为云原生应用的标准组件。
结果(Outcome)
到2024年,Redis 已经成为全球最受欢迎的内存数据库。
使用数据:
- 每年超过 20 亿次 Docker 镜像拉取
- 被超过 50% 的开发者使用(Stack Overflow 调查)
- GitHub 上超过 63,000 个 star
- 每天处理数万亿次请求
企业客户:
- Twitter/X:时间线、社交图谱、实时分析
- GitHub:实时通知、操作队列
- Stack Overflow:缓存、会话管理、排行榜
- Snapchat:消息队列、实时功能
- Weibo: feeds、计数器、排行榜
产品生态:
- Redis Open Source:核心开源项目,BSD 许可证
- Redis Stack:包含 RedisJSON、RediSearch、RedisGraph、RedisTimeSeries、RedisBloom 等模块
- Redis Enterprise:企业级功能,包括 Active-Active 地理复制、Redis on Flash、增强的安全性
- Redis Cloud:完全托管的云服务,支持 AWS、Azure、GCP
Redis 7.x(2023年):
- 函数(Functions):服务器端脚本,替代 Lua
- Sharded Pub/Sub:分布式发布订阅
- 性能优化:更少的内存占用,更快的命令执行
2024年许可证变更:
2024年3月,Redis Inc. 宣布更改许可证,从 BSD 改为 RSAL(Redis Source Available License)和 SSPL(Server Side Public License)。这限制了云厂商(如 AWS)在不付费的情况下提供 Redis 托管服务。
这一决定在开源社区引发争议,导致 Linux 基金会推出了 Valkey——Redis 的分支,保持 BSD 许可证。这场”开源 vs. 云厂商”的争议仍在继续。
规律总结(Lessons)
Redis 的故事,为开源创业提供了独特的视角。
1. 解决自己的痛点
Redis 诞生于桑菲利波的真实需求——LLOOGG 需要实时分析能力。最好的产品往往来自创始人自己的痛点,因为他们知道什么才是真正重要的。
2. 简单即是强大
Redis 的设计哲学是简单:单线程、内存操作、文本协议。这种简单性让 Redis 既快速又可靠。复杂的功能通过数据结构组合实现,而不是增加核心复杂度。
3. 数据结构的重要性
Redis 的成功证明了数据结构的重要性。列表、集合、有序集合——这些不是简单的”功能”,而是解决特定问题的钥匙。正确的设计可以优雅地解决复杂问题。
4. 社区驱动的增长
Redis 从未有过大规模的市场推广。它的增长完全依靠口碑和开源社区。桑菲利波通过博客、Twitter、GitHub 与社区保持密切联系,响应用户反馈。
5. 商业化与开源的平衡
Redis Labs 的模式——核心开源,企业功能付费——为开源商业化提供了范本。这确保了项目的可持续性,同时保持了对社区的承诺。
6. 一个人的力量
Redis 最初几年几乎是桑菲利波一个人的项目。这证明了个人开发者的力量——在正确的时机,用正确的想法,一个人可以改变整个行业。
7. 适应云时代
Redis 从自托管软件向云服务的转型是成功的关键。开发者越来越倾向于使用托管服务,而不是自己管理基础设施。
“最好的代码不是最聪明的代码,而是最简单的代码。Redis 的每一行代码都经过深思熟虑,去除一切不必要的复杂度。因为简单,所以快速;因为简单,所以可靠;因为简单,所以持久。”
—— 萨尔瓦托雷·桑菲利波,Redis 创始人