我一直觉得 Redis 在数据库世界里独具一格。其他多数数据库的中心思想不是表格就
是文件,但在 Redis 里,你直接与链结串行(linked list)和杂凑表(hash table)
等低阶资料结构打交道。
这个设计实在太奇妙了,我很好奇背后创作的故事,就花了一些时间研究,写下这篇
故事。
图文连结并茂版:https://blog.brachiosoft.com/redis
脸书专页:https://www.facebook.com/brachiosoft
Redis 的独创设计出自意大利的程式设计师 Salvatore Sanfilippo(网络名称
antirez)之手。精通系统程式设计的 antirez,喜欢用串行、杂凑、集合(set)等
资料结构来思考问题,表格或文件这种高阶的资料表达方式不合他的味口。在创造
Redis 时,antirez 是数据库的门外汉,但也许就是他没经验,才能为数据库领域带
来新想法。
多年后的今天,Redis 已成为主流,几乎所有网络服务背后都能见到它的踪影。在
Stack Overflow 的调查报告上,Redis 更是蝉联五年最受爱戴的数据库。
## antirez 早年生活
antirez 在意大利西西里长大,小时候,他的父亲在一间石化公司工作,担任电工,
借此接触工业自动化的问题。80 年代,他父亲开始使用可编程逻辑控制器(PLC),
并对这些控制器产生兴趣,于是他买了一块 Z80 处理器的板子,开始在上面写程式。
antirez 六岁时,家里买了第一台个人电脑,TI-99/4A。那是一台商业上不成功
,但很有趣的电脑。他父亲会那上面写了一些 BASIC 程式,antirez 有样学样,小学
一年级时就会打键盘、复制 BASIC 程式等。
随着年龄增长,antirez 继续写程式。到了 14 岁,青少年时期的兴趣,像是摩托车
、女孩子,接踵而至,写程式这个兴趣就被抛诸脑后。直到 18-19 岁时,antirez 才
重拾对电脑的兴趣,用电脑玩 3D 建模、游戏,也写一些简单的程式。在巴勒摩大学
建筑学院就读大学时,他会用 BASIC 来画图。BASIC 是他儿时学过的程式语言,也是
他当时唯一会的语言。
## 资安公司 SECLAB
有一天,antirez 想买一张显示卡,却不小心买成了调制解调器,商家不肯退款,antirez
就顺其自然:“调制解调器就调制解调器吧!”当时是 90 年代,网络逐渐平民化。他连上网
路,安装了 Linux,开始对资讯安全产生兴趣。他买了一本 C 语言的书,开始学习 C
语言。不久之后,他发现 ping 程式有一个漏洞。
这个漏洞是这样的:在 Unix 里通常有一个限制,如果你不是 root,则无法快速在短
时间内发送大量封包。但 antirez 发现透过 Unix 讯号,可以绕过这个限制。
他在 Bugtraq 邮件列表上发表这个发现,当时是 1998 年 4 月。Bugtraq 是一个关
于资安的邮件列表,全球的资安专家都会在上面发布安全问题。隔天,antirez 接到
一通从米兰打来的长途电话,一间名叫 SECLAB 的资安公司问他要不要来工作。
antirez 受宠若惊:“但我只是一个建筑系的大学生,我什么都不懂。”但 SECLAB
的老板还是鼓励他来米兰一趟,和他们聊聊。antirez 去了米兰与他们见面,公司的
老板告诉 antirez:“你回去继续生活,但是读这十本书,读完再回来找我。”这十
本书都是关于网络的,如 TCP/IP 协定、防火墙、应用程式安全、密码学等。1998 年
夏天,antirez 就每天西西里岛的海边读这些书。
九月,antirez 回去找 SECLAB,他们想聘请 antirez。休学后,antirez 搬到米兰工
作。第一次开会时,antirez 完全听不懂同事在说什么,冒牌者症候群油然而生。当
时意大利一些厉害的骇客都在 SECLAB 工作,在这充满强者的环境里,经过两个月的
洗礼,antirez 也开始做出贡献。
首先,antirez 发明了一种名为 Idle Scan 的攻击手法。它至今仍是 Nmap 的著名的
攻击手法之一,仍被人们研究著。SECLAB 的老板认为 antirez 在开源社群的工作成
果,比去应付客户有价值,就叫他不需烦恼客户,只要专心写开源软件,在资安领域
研究攻击手法。
此外,antirez 还写了一个名叫 hping 的工具。它是一个可以让你传送客制 TCP/IP
封包的命令列工具,它的作用类似 ping,但它不一定要像 ping 走 ICMP 协定,所以
hping 可以做到更多事。例如:测试防火墙规则、测试网络效能、绕过防火墙传输档
案。
在 SECLAB 待了六个月之后,antirez 离开了。因为他开始晚睡,工作迟到,米兰这
个大城市对一个 21 岁的年轻人实在太多采多姿,自治力不好很容易迷惘其中。虽然
时间短,期间 antirez 写了很多 C 语言的程式,参与了很多专案,这六个月是
antirez 职涯上很重要的转泪点。
## 自创公司 Merzia
2000 年,antirez 加入了 Linuxcare 意大利分部,公司业务是开源软件,他又在家
远距工作,一切都很好——直到网络泡沫破灭。那一天公司发了一封邮件告诉员工:
“我们要关闭 18 个国家的业务,一个月后你们全部即将失业,晚安。”
2001 年,当时 23 岁的 antirez 有一个小孩,他需要养家活口。他开始写一些 PHP
,包办前后端,帮客户做小专案。
2005 年是 Web 2.0 萌芽的年代,他跟朋友 Fabio Pitrola 开了一间叫 Merzia 的公
司,想在意大利市场做一些 Web 2.0 的应用。意大利电信(Telecom Italia)看到了
他们做的东西,写了一封邮件,试图建立合作关系。意大利电信后来买下他们做两个
网站:一个是社交新闻网站 OKNOtizie,另一个是类似书签网站 Delicious 的
Segnalo。
## LLOOGG 与 Redis 的诞生
又过了几年,antirez 和他朋友决定专注一个新领域:网站分析。他们想为部落客打
造一个工具,让他们可以看到访客的即时行为。例如:一个访客从 Google 按进了这
篇文章,回到首页,然后跳到某一页。部落客可借此改进网站的导览设计。这个工具
名为 LLOOGG,当时的网站首页上有几句介绍,说明它与 Google Analytics 的不同之
处。
LLOOGG 特别之处就在于它让网站管理员监看某个访客当下在网站上的活动,
Google Analytics 一直到了 2011 才有这个功能,而 LLOOGG 创立在 2007 年,可见
之创新。
LLOOGG 当时运作的样子:https://www.youtube.com/watch?v=WsxRq8vgsBo
刚开始 antirez 尝试使用 MySQL,但马上就发现性能问题。MySQL 每读写一笔资料,
都要动用到硬盘,资料量一多,运算全卡在硬盘的读写,网站就动弹不得。从现今眼
光来看,有经验的后端工程师都会知道不应该选 MySQL 来实现即时应用,但在 2007
年这一切并不是这么显而易见。
antirez 认为使用内存可以解决这个问题,于是他先用 Tcl 程式语言写了一个记忆
体数据库的原型(prototype),名叫 LMDB(LLOOGG Memory Database),这就是
Redis 的前身。这个原型源码只有 300 多行,但已足够让你一窥 Redis 的大致样貌。
首先,这个原型已支援像是 SET、GET、LPUSH、RPUSH 等基本指令,你可以在上面使
用字串(string)与串行(list)两种资料型别。此外,服务器与客户端的通讯协定
与 Redis v1 一致,设计上要让人类可读(human readable)且可快速解析(fast to
parse)。
Redis 默认的埠号 6379 也早已出现在 Tcl 源码当中。九宫格键盘上 6379 对应到
MERZ,由来是 Alessia Merz,一位意大利的模特儿。Alessia Merz 在电视上常说一
些不经大脑的话,逗乐 antirez 和他的朋友们,在朋友间他们会说“那个很 merz!
”来形容某个事物很蠢、没意义。这个词经过十几年的转变,merz 渐渐被他们用来形
容看起来很蠢,但却有具有研究价值的东西,可看出他们的公司名字 Merzia 大概也
是这么来的。
Redis 的原型:https://gist.github.com/antirez/6ca04dd191bdb82aad9fb241013e88a8
Tcl 源码的前几行,antirez 引用了一个套件却没使用,只留了一行注解
# For [fork]。当时他想要利用 fork() 系统呼叫来实做永久储存(persistence)
——把资料写回硬盘的机制。这至今仍是 Redis RDB 的运作方式:利用 fork() 创造
出一个子行程,让子行程去将资料写到硬盘,父行程则继续做原来该做的事。Tcl 源
码没有真的用到 fork(),antirez 只留了一行注解在那里,因为当时他理解到 Tcl
已到了极限,是时候以 C 语言改写了。
2009 年 2 月,antirez 的朋友 David Welton 帮他把 Redis 在 Hacker News 上公
诸于世——结果除了发文者之外,只有四个人回应他:三个人说已经其他类似的专案
了,只有一个人给予正面回复,并提供帮助。这个人就是 Ezra Zygmuntowicz(不幸
在 2014 年去世 RIP),他当时在 Ruby on Rails 社群已相当著名,是 EngineYard
的共同创办人。Ezra 为 Redis 写了初版的 Ruby 客户端 redis-rb,至今还是 Ruby
客户端的首选,也成为 Redis 在 Ruby 社群流行起来的重要推手。
五年来,Redis 帮 LLOOGG 处理了二十亿次浏览量。在 2014 年关站时,Redis 每秒
处理 350-400 个指令。而这整个系统仅是跑在一台每月 150 美金的虚拟机器上。
## GitHub, Instagram, Twitter 加入行列
尽管 Hacker News 上没有获得热烈回响,antirez 每天仍利用工作之余开发 Redis,
大概持续了一年,慢慢开始吸引用户。
当时他手上还有两个开源专案:hping 和 Jim Interpreter,但 Redis 是第一个让他
觉得可以长期投资的专案。他对资安失去兴趣后,就停止开发 hping;他对 Tcl 的走
向失望,投入 Ruby 的怀抱后,就停止开发 Jim Interpreter。但他很肯定他离不开
数据库,所以 antirez 就假设 Redis 会成功,继续开发,因为就算不成功,至少他
自己在往后几年都会继续使用这个数据库。
2009 年,与 Redis 发布同年,一间叫 GitHub 新创公司的 CEO,Chris Wanstrath
利用 Redis 写了一个工作队列系统 Resque,用来跑 GitHub 的背景任务。在 Rails
的世界,Resque 是当时最热门的工作队列系统。2012 年出现的一个后起之秀
Sidekiq,也是建立在 Redis 的基础上,是现在 Rails 工程师的首选。
另一间新创公司 Instagram,其中一个创办人 Mike Krieger 在 2010 年开始与
antirez 通信,讨论该怎么利用 Redis 打造 Instagram。当时 Instagram 和 Redis
都是刚起步,Mike 和 antirez 也互不相识。因为 Instagram 在最初几年是完全建造
在 Redis 之上的,所以如果没有 Redis,很可能就不会有 Instagram,或至少会晚点
才问市。
2010 年,Twitter 也加入 Redis 的行列。Twitter 最重要的功能“时间轴”,背后
便是使用 Redis。有趣的是,antirez 在 Redis 刚发表完没多久(2009 年 3 月),
就写了一个简单版的 Twitter 叫 Retwis,以展示如何使用 Redis。
## VMware 和 Redis Labs 的资助
至此,Redis 专案对 antirez 来说还只是一个嗜好。大概持续了一年,他无偿的改进
Redis 并释出新版,直到有一天,VMware 打电话过来。
“我们想付钱赞助 Redis,VMware 在意大利有分部,我们想骋请你,你想成为我们的
员工吗?”antirez 问:“那我需要为你们做什么?”“不不不,你只要继续做你现在
做的事,我们就会付你钱。你只需要在网站上写 Redis 是由 VMware 赞助的即可。”
就这样,Redis 有了一个金主,antirez 和 VMware 合作开发 Redis 好几年。VMware
后来与 Pivotal 分拆,antirez 又转到了 Pivotal。
随着用户愈来愈多,市场上出现了第一批提供 Redis 顾问服务的公司,其中有一间来
自以色列特拉维夫的公司叫 Redis Labs。它本来的名字叫 Garantia Data,一开始是
数据库供应商,后来公司改名为 Redis Labs,转型专注做 Redis 相关的业务。
Pivotal 和 Redis Labs 有一个共同投资人,某一天他告诉 antirez:“你在 VMware
干嘛?去 Redis Labs 吧,那里才是你产品的支援中心。”于是 antirez 转到了
Redis Labs,并在那边工作至今。2021 年 8 月,Redis Labs 更正式改名为 Redis,
原本是专案网站的 redis.io 变成了公司网站。
## 十年后
Redis 诞生后十年,2020 年 1 月,antirez 在 Redis Day 会议的讲台上,用他招牌
的意大利腔英文介绍 Redis 6.0 的新功能。在 Twitter 上还可以找到一些与会人员
和 antirez 的合照。
回顾 Redis 这十年来的成长:
时间 版本 新功能
2009 年 2 月 ? 字串、串行
2009 年 9 月 1.0 集合、有序集合(sorted set)、永久储存(RDB, AOF)等
2010 年 9 月 2.0 杂凑、发布订阅(pub/sub)、Lua 脚本、HyperLogLog 等
2015 年 4 月 3.0 丛集(cluster)、地理资料型态
2017 年 7 月 4.0 模组(modules):RediSearch、RedisJSON、RedisGraph 等
2018 年 10 月 5.0 串流(stream)
2020 年 1 月 6.0 SSL、存取控制(ACL)等
同年 6 月,antirez 在部落格写了一篇文章告诉大家,他决定退出 Redis 专案的开
发及维护工作。他仍然会在 Redis Labs 担任顾问的角色,提供意见,但不直接参与
开发。十年多来奉献在同一个专案上,让 antirez 倦怠了。
对 antirez 来说,写程式是一种表达自我的方式,是一种艺术。每一个字符、断行都
要精雕细琢,仿佛是另外一种艺术形式——写作。软件开发就像是在写一本书,它必
须美观、优雅、容易理解。如果这个软件刚好是对其他人也实用,那也只是副作用罢
了。
当然,antirez 也理解这个想法不切实际。当你的软件被大规模采用,你就必须做出
许多妥协,让你的软件变得不那么完美,但却对大部分人实用。维护 Redis 变得愈来
愈具挑战性,让他在艺术和实用性之间陷入挣扎。这使得 antirez 感到疲惫与压力,
开始渴望回归那个艺术家的身份,去创作更纯粹的程式艺术。
离开 Redis 专案后,antirez 写了一本关于人工智能的科幻小说《Wohpe》,于 2022
年 7 月出版。同年 4 月,Redis 团队发布了新版本 7.0,这是 antirez 退出专案后
的第一个重大版本。