Appearance
Redis 发展史
Redis 如今是世界上最流行的内存数据库之一,但它的诞生充满了偶然性。从一个意大利程序员为了解决自己网站的实时统计问题,到成为全球数百万开发者依赖的基础设施,Redis 的故事是一个典型的"工程师造轮子,造出了火箭"的故事。
一、缘起:一个程序员的痛点
1.1 2009 年,意大利西西里岛
故事的主角是 Salvatore Sanfilippo,网名 antirez,一位意大利程序员。他和朋友在 2009 年做了一个叫 LLOOGG 的网站,这是一个实时统计博客访问量的 Web 分析工具。
LLOOGG 的需求:
- 实时统计每个博客的访问量
- 记录最近 N 条访问记录
- 按不同维度统计(按博客、按来源、按时间)
传统方案的困境:
MySQL → 太慢了,实时写入扛不住
Memcached → 只有 key-value,不能做列表、统计
自己写内存数据结构 → 需要持久化,否则重启数据全丢1.2 为什么 MySQL 不行?
antirez 的尝试:
MySQL 存储每条访问记录:
INSERT INTO pageviews (blog_id, referrer, time) VALUES (...)
SELECT COUNT(*) FROM pageviews WHERE blog_id = 123
问题:
- 每秒几千条写入,MySQL 扛不住
- 实时统计需要频繁 GROUP BY / COUNT,太慢
- 即使分库分表,复杂度太高
antirez 的想法:
"如果我把数据都放在内存里,直接操作内存数据结构,不就行了吗?"1.3 为什么不直接用 Memcached?
当时 Memcached 已经是流行的缓存系统,但 antirez 发现它不够用:
Memcached 的局限:
❌ 只有简单的 key-value(String)
❌ 没有 List、Set 等数据结构
❌ 不支持持久化,重启数据全丢
❌ 不支持主从复制
❌ 不支持原子操作(如 INCR、LPUSH)
LLOOGG 需要的能力:
✅ 列表:保存最近 N 条访问记录 → List
✅ 计数器:实时统计访问量 → INCR
✅ 集合:按来源去重统计 → Set
✅ 持久化:重启后数据还在 → RDB二、诞生:2009 年 2 月,第一个版本
2.1 最初只是一个"玩具"
2009 年 2 月,antirez 花了大约两周时间,用 C 语言写了一个简单的内存数据库原型,起名叫 Redis(REmote DIctionary Server)。
Redis 1.0(2009 年 2 月):
- 用 C 语言编写,约 2 万行代码
- 支持 String 和 List 两种数据结构
- 基于 epoll 的事件驱动模型
- 支持 RDB 持久化
- 单线程执行命令
- 没有集群、没有哨兵、没有 AOF
antirez 的初衷:
"我只是想解决 LLOOGG 的性能问题,没想过要做一个数据库"2.2 为什么用 C 语言?
antirez 选择 C 的原因:
1. 性能极致:内存操作,不能有任何性能损耗
2. 自己熟悉:antirez 是 Tcl 和 C 的老手
3. 无依赖:不需要 VM,不需要运行时
4. 控制力:直接管理内存,做极致优化2.3 为什么叫 Redis?
antirez 的解释:
"Redis" 是 "REmote DIctionary Server" 的缩写
远程:可以通过网络访问
字典:核心数据结构是 key-value
服务器:作为独立进程运行
非常简单直接的名字,没有花哨的含义三、关键转折:被 Hacker News 发现
3.1 2009 年 3 月,开源发布
antirez 把 Redis 发布到 GitHub 上,并在 Hacker News 上发了一个帖子:
"I wrote a little server that loads a dataset into memory and forks to save. It's like memcached but with more data types."
Hacker News 上的反响:
"This is exactly what I needed for my startup!"
"The code is so clean and readable!"
"Why didn't anyone think of this before?"
帖子迅速登上 Hacker News 首页
引起了 GitHub 和 Twitter 工程师的注意3.2 社区的力量
早期最重要的贡献者:
Pieter Noordhuis(GitHub 工程师):
- 贡献了 AOF 持久化
- 贡献了主从复制
- 成为 Redis 核心开发者
Matt Stancliff(Twitter 工程师):
- 贡献了 Redis Cluster 设计
- 推动了 Redis 在 Twitter 的落地
Itamar Haber(Redis Labs):
- 成为 Redis 的"布道者"
- 编写了大量文档和教程一个有趣的事实:Redis 的 logo(红色立方体)是 antirez 的妻子设计的。
四、演化:从玩具到基础设施
4.1 版本演进图谱
┌─────────────────────────────────────────────────────────────────┐
│ Redis 版本演进 │
│ │
│ 2009.02 Redis 1.0 │
│ ├── String, List, RDB │
│ │ │
│ 2009.12 Redis 1.2 │
│ ├── Set, ZSet, Hash │
│ │ │
│ 2010.03 Redis 2.0 │
│ ├── 主从复制, 虚拟内存, 发布订阅 │
│ │ │
│ 2011.04 Redis 2.2 │
│ ├── AOF 持久化 │
│ │ │
│ 2012.05 Redis 2.6 │
│ ├── Lua 脚本, 毫秒过期, 新的内存管理 │
│ │ │
│ 2013.11 Redis 2.8 │
│ ├── Sentinel 哨兵, 部分复制, SCAN 命令 │
│ │ │
│ 2015.04 Redis 3.0 │
│ ├── Redis Cluster 集群(最重要里程碑) │
│ │ │
│ 2017.07 Redis 4.0 │
│ ├── 模块系统, 混合持久化, UNLINK, 异步删除 │
│ │ │
│ 2018.10 Redis 5.0 │
│ ├── Stream 消息队列, 新集群管理 │
│ │ │
│ 2020.04 Redis 6.0 │
│ ├── 多线程 IO, ACL 权限, RESP3 协议, SSL │
│ │ │
│ 2022.04 Redis 7.0 │
│ ├── Redis Functions, 多部分 AOF, ACL v2 │
│ │ │
│ 2024.03 Redis 许可证变更(重要转折) │
│ └── 从 BSD 3-Clause 变更为 RSALv2 + SSPLv1 │
│ │
│ 2024.04 Valkey 诞生(Redis 社区分支) │
│ └── Linux 基金会托管, BSD 许可证, 社区驱动 │
└─────────────────────────────────────────────────────────────────┘4.2 各版本的关键突破
| 版本 | 突破 | 意义 |
|---|---|---|
| 1.0 | 基础数据结构 + RDB | 从 0 到 1 |
| 2.0 | 主从复制 | 高可用基础 |
| 2.6 | Lua 脚本 | 原子操作能力大幅提升 |
| 2.8 | Sentinel | 自动故障转移,告别手动切换 |
| 3.0 | Redis Cluster | 真正的分布式,水平扩展 |
| 4.0 | 混合持久化 + 模块 | 持久化性能飞跃,生态可扩展 |
| 5.0 | Stream | 可靠消息队列,挑战 Kafka |
| 6.0 | 多线程 IO | 突破网络 IO 瓶颈 |
| 7.0 | Functions | 脚本能力升级 |
4.3 几个关键决策
决策一:单线程模型
antirez 的坚持:
"Redis 的瓶颈是内存和网络,不是 CPU"
"单线程让代码简单,没有锁的复杂性"
"我宁愿用简单的代码实现 90% 的性能,而不是复杂的代码实现 100%"
这个决策让 Redis 的代码一直保持简洁可读
直到 6.0 才在 IO 层面引入多线程(命令执行仍是单线程)决策二:选择 epoll 而非 libevent
antirez 的选择:
一开始 Redis 用的是 libevent 库
但 antirez 觉得 libevent 太重了,自己写了一个简洁的事件库(ae.c)
直接调用 epoll(Linux)/ kqueue(BSD)/ select(其他)
结果:ae.c 只有 500 行代码,比 libevent 轻量太多
这个决策让 Redis 的依赖降到最低决策三:主从复制的设计
antirez 的哲学:
"复制的语义必须简单明了"
SLAVEOF 命令:
- 一个 Slave 只能有一个 Master
- 复制是异步的
- 断线后尝试增量同步(部分重同步)
这个简单清晰的设计,让主从复制非常可靠五、作者 antirez 的故事
5.1 他是谁?
Salvatore Sanfilippo(antirez)
- 1977 年出生于意大利西西里岛
- 自学编程,没有计算机学位
- 早年是 Tcl 语言的核心贡献者
- 写过 hping3(网络安全工具)、idle(Tcl IDE)
- Redis 是他最著名的作品
- 2015 年加入 Redis Labs,全职开发 Redis
- 2020 年离开 Redis Labs,从 Redis 维护者角色退下来5.2 为什么离开 Redis?
antirez 在 2020 年 6 月 30 日的博客中写道:
"我写代码不是为了成为项目的'独裁者',
而是为了创造有价值的东西。
现在 Redis 已经成熟了,有优秀的团队在维护。
我更像一个艺术家,而不是一个管理者。
我想去做一些新的东西了。"
他离开后:
- Redis 由 Redis Labs 的团队继续维护
- antirez 没有再参与 Redis 的开发
- 他写了一本科幻小说《Wohpe》
- 偶尔在 Twitter 上分享编程和生活5.3 antirez 的编程哲学
antirez 的名言和思想:
1. "代码是写给人看的,顺便给机器执行"
→ Redis 的代码极其干净,注释很少但命名清晰
2. "简单比快更重要"
→ Redis 选择单线程,不是因为多线程做不到,而是因为简单
3. "不要为了可能的未来需求写代码"
→ Redis 从不提前实现功能,只有真正需要时才加
4. "性能是设计出来的,不是优化出来的"
→ Redis 的数据结构从设计之初就考虑性能
5. "好的软件是打磨出来的,不是一次性写出来的"
→ Redis 每个版本都在持续改进,但从不推翻重来六、2024 年许可证变更风波
6.1 发生了什么?
2024 年 3 月 20 日,Redis 宣布:
从 BSD 3-Clause 开源许可证
变更为 RSALv2 + SSPLv1 双许可证
这意味着:
- 云服务商不能免费使用 Redis 提供托管服务
- AWS、Google Cloud 等需要与 Redis 公司签署商业协议
- 普通用户使用不受影响6.2 Valkey 的诞生
社区的反应:
许可证变更后,社区迅速行动
2024 年 3 月 28 日(仅 8 天后):
- Linux 基金会宣布托管 Valkey
- 基于 Redis 7.2.4 的 BSD 许可证分支
- 由 Google、AWS、Oracle、爱立信等共同维护
- 完全兼容 Redis 协议
2024 年 4 月 16 日:
- Valkey 7.2.5 发布,首个正式版本
- 功能与 Redis 7.2 完全兼容
2024 年 7 月:
- Valkey 8.0 发布,开始独立演进
- 新增异步 IO 线程、多核优化等特性6.3 影响分析
对用户的影响:
✅ 普通用户:几乎无影响,Redis 仍然免费
✅ 自建 Redis 集群:无影响
⚠️ 云服务商:需要购买商业许可
⚠️ 使用云 Redis 服务:可能涨价
Valkey 的意义:
✅ 为社区提供了一个 BSD 许可的选择
✅ 与 Redis 协议兼容,迁移成本低
✅ 由多家大公司共同维护,不依赖单一厂商
未来展望:
Redis 和 Valkey 可能会分道扬镳
Redis 继续在 Redis Labs 下发展
Valkey 走社区驱动的路线七、Redis 的影响与遗产
7.1 技术影响
Redis 改变了什么:
1. 数据结构服务器的概念
在 Redis 之前,数据库都是"存数据"的
Redis 之后,"数据结构即服务"成为新范式
2. 内存数据库的主流化
在 Redis 之前,内存数据库是小众技术
Redis 之后,内存优先成为架构设计的默认选择
3. 分布式系统的模式
分布式锁、计数器、排行榜、消息队列
这些模式因 Redis 而变得简单
4. 开源项目的典范
小而美的代码、清晰的文档、活跃的社区
Redis 展示了如何做一个好的开源项目7.2 使用规模
Redis 的体量:
- GitHub Stars:67,000+
- Docker Hub 下载量:超过 10 亿次
- 使用 Redis 的公司:Twitter、GitHub、Stack Overflow、微博、快手、滴滴
- 全球付费用户:超过 10,000 家企业
- 年收入:Redis Labs 估值超过 20 亿美元7.3 一个意大利人的传奇
从 2009 到 2024:
一个意大利程序员,因为自己的网站性能问题
花两周写了一个"小工具"
没想到 15 年后,它成为了全球最流行的数据库之一
antirez 没有计算机学位,没有大公司背景
他只是一个热爱编程、追求简洁的工程师
用代码改变了一个行业
这就是开源的力量:
一个好的想法 + 简洁的实现 + 开放的社区 = 改变世界八、面试要点
Q1:Redis 的作者是谁?为什么写 Redis?
Salvatore Sanfilippo(antirez),意大利程序员。2009 年为了解决自己网站 LLOOGG 的实时统计问题,写了 Redis。因为 MySQL 太慢,Memcached 功能太弱,他需要一个支持多种数据结构、能持久化的内存数据库。
Q2:Redis 的版本演进中最重要的里程碑是什么?
Redis 3.0(2015 年)的 Cluster 集群是最重要的里程碑,实现了真正的分布式水平扩展。其次是 2.8 的 Sentinel(自动故障转移)、5.0 的 Stream(可靠消息队列)、6.0 的多线程 IO。
Q3:Redis 为什么选择单线程?
antirez 认为 Redis 的瓶颈是内存和网络 IO,不是 CPU。单线程避免了锁竞争和上下文切换,代码更简洁可靠。直到 6.0 才在 IO 层面引入多线程,命令执行仍是单线程。
Q4:Redis 许可证变更后,Valkey 是什么?
Valkey 是 Redis 许可证变更后,由 Linux 基金会托管的社区分支,基于 Redis 7.2.4,使用 BSD 许可证。由 Google、AWS、Oracle 等共同维护,与 Redis 协议完全兼容。
