Skip to content

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 语言写了一个简单的内存数据库原型,起名叫 RedisREmote 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.6Lua 脚本原子操作能力大幅提升
2.8Sentinel自动故障转移,告别手动切换
3.0Redis Cluster真正的分布式,水平扩展
4.0混合持久化 + 模块持久化性能飞跃,生态可扩展
5.0Stream可靠消息队列,挑战 Kafka
6.0多线程 IO突破网络 IO 瓶颈
7.0Functions脚本能力升级

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 协议完全兼容。