Redis 与作者antirez 的故事

@高效码农  May 12, 2023

在资料库的世界,Redis 独具一格。其他多数资料库的中心思想不是表格就是文件,但在 Redis 裡,你直接与链结串列(linked list)和杂凑表(hash table)等低阶资料结构打交道。

这正是 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 年,可见之创新。

刚开始 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 大概也是这麽来的。

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 邀请过 antirez 到他们总部几次,讨论“时间轴”的新设计。有趣的是,antirez 在 Redis 刚发表完没多久(2009 年 3 月),就写了一个简单版的 Twitter 叫 Retwis,以展示如何使用 Redis。

VMware 和 Redis Labs 的资助

至此,Redis 专案对 antirez 来说还只是一个嗜好。大概持续了一年,他无偿的改进 Redis 并释出新版,直到有一天,VMware 打电话过来。

“我们想付钱赞助 Redis,VMware 在义大利有分部,我们想骋请你,你想成为我们的员工吗?”antirez 问:“那我需要为你们做什麽?”“不不不,你只要继续做你现在做的事,我们就会付你钱。你只需要在网站上写 Redis 是由 VMware 赞助的即可。”

redis.io 2010-11-27 的撷图

就这样,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)、点阵图(bitmap)、Lua 脚本编程、HyperLogLog 等
2015 年 4 月3.0丛集(cluster)、地理资料型态
2017 年 7 月4.0模组(modules):RediSearch、RedisJSON、RedisGraph 等
2018 年 10 月5.0串流(stream)
2020 年 1 月6.0SSL、存取控制(ACL)等

同年 6 月,antirez 在部落格写了一篇文章告诉大家,他决定退出 Redis 专案的开发及维护工作。他仍然会在 Redis Labs 担任顾问的角色,提供意见,但不直接参与开发。十年多来奉献在同一个专案上,让 antirez 倦怠了。

对 antirez 来说,写程式是一种表达自我的方式,是一种艺术。每一个字元、断行都要精雕细琢,彷彿是另外一种艺术形式——写作。软体开发就像是在写一本书,它必须美观、优雅、容易理解。如果这个软体刚好是对其他人也实用,那也只是副作用罢了。

当然,antirez 也理解这个想法不切实际。当你的软体被大规模採用,你就必须做出许多妥协,让你的软体变得不那麽完美,但却对大部分人实用。维护 Redis 变得愈来愈具挑战性,让他在艺术和实用性之间陷入挣扎。这使得 antirez 感到疲惫与压力,开始渴望回归那个艺术家的身份,去创作更纯粹的程式艺术。

离开 Redis 专案后,antirez 写了一本关于人工智慧的科幻小说《Wohpe》,于 2022 年 7 月出版。同年 4 月,Redis 团队发佈了新版本 7.0,这是 antirez 退出专案后的第一个重大版本。

参考资料

  1. #storiedidevelopers - Salvatore Sanfilippo aka Antirez - YouTube
  2. L’open source è un fiume in piena | Salvatore Sanfilippo | TEDxCapoPeloro - YouTube
  3. Curriculum Vitae - antirez weblog
  4. Open Source Builders: How Redis Upended the Database Market - The News Stack
  5. The Evolution of Redis - YouTube
  6. Bugtraq: pingflood.c
  7. TCP Idle Scan (-sI) | Nmap Network Scanning
  8. 深入浅出Redis - 知乎
  9. LMDB -- First version of Redis written in Tcl
  10. LMDB – First version of Redis written in Tcl | Hacker News
  11. Redis | Hacker News
  12. Redis Turns 10 – How it started with a single post on Hacker News
  13. Redis as an LRU cache - antirez weblog
  14. One year of Redis - antirez weblog
  15. Introducing Resque | The GitHub Blog
  16. Storing hundreds of millions of simple key-value pairs in Redis | Instagram Engineering
  17. LLOOGG has shut down | Sir Authur's Den
  18. The end of the Redis adventure -
  19. WOHPE di Salvatore Sanfilippo aka "antirez": e se una #AI fosse la nostra ultima speranza? - YouTube

修改记录

这篇文章在 Hacker News 获得不少回响,包括 antirez 本人。他指出原文有些错误和遗漏,我已更正如下:

  • 在米兰 antirez 没有被解雇,他是自己离开的。
  • 他的第一台电脑是 TI-99/4A,不是 TI-94A。
  • 补充一句 antirez 被邀请去 Twitter 总部的细节。


评论已关闭