Redis 与作者 antirez 的故事
在数据库的世界中,Redis 独树一帜。与大多数数据库将关注点放在常规的表格或文档上不同,Redis 直接与底层的数据结构进行交互,如链表和哈希表。
这归功于 Redis 的作者 Salvatore Sanfilippo(网名为 antirez)的创新设计。作为系统编程专家,antirez 从数据结构角度思考,例如列表、哈希和集合,而高级数据表示如表格或文档则不符合他的口味。在创建 Redis 时,antirez 在数据库领域是个业余爱好者,但正是这种缺乏经验使他能够为行业带来新鲜想法。
如今,Redis 已成为主流,几乎所有的 Web 服务都能看到它的影子。根据 Stack Overflow 的调查,Redis 连续五年成为最受喜爱的数据库。
在意大利西西里岛长大的 antirez,幼时父亲是一家石化公司的电工,负责工业自动化。80 年代,他的父亲开始使用可编程逻辑控制器(PLC),对控制器产生浓厚兴趣,购买 Z80 处理器板并开始编程。
antirez 六岁时,家里购买了第一台个人电脑,德州仪器 I94A。虽然它在商业上并不成功,但它是一台有趣的机器。父亲在上面编写一些 BASIC 程序,antirez 很快有模有样地学会了键盘打字和复制 BASIC 程序,当他上一年级时就已经能够做到这些了。
随着年龄增长,antirez 继续编程。然而,在他 14 岁的时候,典型的青少年兴趣如摩托车和女孩取而代之,编程被置之脑后。直到他 18 或 19 岁的时候,他对计算机重燃热情,鼓捣 3D 建模、游戏并编写简单的程序。在帕尔马大学学习建筑时,使用从童年时代熟悉的唯一编程语言 BASIC 进行绘图。
有一天,antirez 心血来潮想买张显卡,却误买了一台调制解调器。商家拒绝退款,他只好接受了,说道:“好吧,我猜这就是一台调制解调器了!”那是 90 年代,互联网方兴未艾,他开始上网,安装了 Linux,并对信息安全产生了兴趣。他买了本关于 C 编程语言的书开始学习。很快,他发现 ping 程序中存在漏洞。
这个漏洞是这样的:Unix 通常有一个限制,非 root 用户无法在短时间内发送大量数据包。但 antirez 找到了绕过限制的方法,通过 Unix 信号。
他于 1998 年 4 月在 Bugtraq 邮件列表上发布了他的发现。Bugtraq 是一个关于网络安全的邮件列表,世界各地的安全专家会在上面发布安全问题。第二天,antirez 接到了一通来自米兰的长途电话,一个名为 SECLAB 的网络安全公司希望他加入他们。
惊愕之余,antirez 回答:“可我只是一个建筑系学生,什么都不懂啊。” 然而,SECLAB 老板还是鼓励他去米兰谈谈。会面后,老板告诉他:“回去继续你的生活,但读完这十本书后再来找我。” 这些书都涉及网络知识,如 TCP/IP 协议、防火墙、应用安全和密码学等。于是,1998 年夏天,他在西西里岛的海岸度过了日夜阅读的日子。
9 月,antirez 回到了 SECLAB,他们希望雇佣他。他休学一段时间,搬到米兰工作。第一次会议时,他听不懂同事们在说什么,觉得自己完全是个骗子。当时,意大利最优秀的黑客之一就在 SECLAB 工作。经过两个月的融入,antirez 开始做出贡献。
首先,antirez 发明了一种名为 Idle Scan 的攻击方法,至今仍是 Nmap 中著名的攻击之一,并持续受到研究。SECLAB 老板认为他对开源社区的贡献价值更大,而非客户事务处理,因此鼓励他专注于编写开源软件和研究网络攻击。
此外,antirez 创建了一个名为 hping 的命令行工具,可以发送自定义的 TCP/IP 数据包。它的功能类似于 ping,但不遵循 ICMP 协议,因此 hping 可以做更多事情,如测试防火墙规则、测试网络性能和穿透防火墙传输文件。
在 SECLAB 工作了六个月后,antirez 被解雇了。他开始晚睡晚起。对于一个 21 岁的人来说,繁华的米兰实在是太诱人了,缺乏良好的自律很容易迷失自我。尽管他在米兰的时间短暂,但在那六个月里编写了许多 C 程序,参与了许多项目,标志着他职业生涯的一个重要转折点。
在 2000 年,antirez 有幸成为 Linuxcare Italia 的一员,这家公司专注于开源软件的开发。得益于远程工作的优势,他的事业一路顺风顺水,直到互联网泡沫破裂。就在某天,他收到了公司的一封电子邮件,里面几乎毫无征兆地宣告:“我们将在 18 个国家停止运营,一个月后,你们都将失业。晚安。”
2001 年,23 岁的 antirez 有了一个需要抚养的孩子。为了养家糊口,他开始学习 PHP 并涉足前端和后端开发,同时为客户开发一些小型项目。
时光飞逝,转眼到了 2005 年,Web 2.0 的黎明时期。与朋友 Fabio Pitrola 共同创立了名为 Merzia 的公司,他们的目标是为意大利市场打造出 Web 2.0 应用程序。就在此时,意大利主要的电信公司 Telecom Italia 注意到了他们的工作,并主动展开合作。最终,Telecom Italia 收购了他们开发的两个网站:社交新闻网站 OKNOtizie 和类似于 Delicious 的书签网站 Segnalo。
几年后,antirez 和他的朋友们决定专注于一个新领域:网络分析。他们的目标是为博客作者创建一个工具,可以监测访问者的实时行为。例如,访问者通过点击谷歌一篇文章,返回主页,然后导航到特定页面。这些信息可以帮助博客作者改进他们网站的设计和导航。为此,他们开发了一个名为 LLOOGG 的工具,可以实时追踪访问者在其网站上的活动。这与谷歌分析 (Google Analytics)不同,后者直到 2011 年才引入了这个功能,而 LLOOGG 在 2007 年就已经推出,展示了其创新性。
相关链接:
https://youtu.be/WsxRq8vgsBo
起初,antirez 尝试使用 MySQL, 但很快遇到了性能瓶颈。每次 MySQL 读取或写入数据,都需要访问硬盘,而随着数据量的增长,操作受限于硬盘的读写速度,导致网站陷入停滞。从现代角度出发,经验丰富的后端工程师会告诉你不应将 MySQL 用于实时应用,但这点在 2007 年还并不那么明显。
antirez 相信使用内存可以解决这个问题,因此他用 Tcl 编程语言编写了一个内存数据库的原型。这个原型名为 LMDB(LLOOGG Memory Database),它是 Redis 的前身。源代码只有 300 多行,却足以让人对 Redis 的未来发展方向有一个清晰的认识。
首先,原型已经支持了诸如 SET、GET、LPUSH、RPUSH 等基本命令,并支持两种数据类型:字符串和列表。此外,服务器与客户端之间的通信协议与 Redis v1 使用的协议相同,具有高度的可读性和解析速度快的优点。
值得一提的是,Redis 的默认端口号 6379 也出现在 LMDB 的源代码中。这背后有一个有趣的故事。在电话键盘上,6379 代表着 MERZ。这个词源于意大利歌舞女郎 Alessia Merz,她的电视评论经常让 Antirez 和他的朋友们捧腹大笑。因此,在朋友之间,他们会用 “那是 merz!” 来形容某些愚蠢或无意义的事物。十多年来,“merz” 一词在他们的圈子里逐渐演变为形容看似愚蠢但具有技术 hack 价值的事物。这或许也能解释 Merzia 公司名字的由来。
在 Tcl 源代码的开头几行中,antirez 导入了一个包,但并没有使用它,只留下了一个注释:“# For [fork]”。他想使用 fork () 系统调用来进行数据持久化,这是一种将数据写回硬盘的机制。时至今日,Redis 的 RDB 仍然是通过 fork () 创建一个子进程来将数据写入磁盘,而父进程则继续执行原始任务。Tcl 源代码实际上并没有使用 fork (),antirez 只是在那里留下了一个注释。那时他意识到 Tcl 已经达到了极限,是时候用 C 重写它了。
2009 年 2 月,antirez 的朋友 David Welton 帮助他在 Hacker News 上向世界分享了 Redis。反响相当平淡,除了 David 之外,只有四个人回应。其中三个人表示已经有类似的项目了,只有一个人积极回应并提出了帮助。那个人就是 Ezra Zygmuntowicz(不幸于 2014 年去世,安息),他在 Ruby on Rails 社区中已经很有名,并且是 EngineYard 的联合创始人。Ezra 为 Redis 编写了最初版本的 Ruby 客户端 redis-rb,至今仍然是 Ruby 社区首选的客户端。在推动 Redis 在 Ruby 社区中的普及方面,redis-rb 起到了关键作用。
在五年时间里,Redis 为 LLOOGG 处理了 20 亿次页面访问。当该网站在 2014 年关闭时,Redis 每秒处理 350~400 个命令。所有这些都发生在一个每月只需花费 150 美元的虚拟机上。
Twitter 加入行列
尽管在 Hacker News 上的反应平淡,但 antirez 依然坚持在他的日常工作之外开发 Redis。这种情况持续了大约一年的时间,逐渐吸引了越来越多的用户。
当时,他还有另外两个开源项目:hping 和 Jim 解释器,但 Redis 是他觉得值得长期投入的第一个项目。对于网络安全失去兴趣后,他停止了对 hping 的开发。他对 Tcl 的发展方向不再抱有幻想,转而接受 Ruby,于是停止了对 Jim 解释器的开发。但他深知自己无法没有数据库,因此坚信 Redis 会取得成功并继续进行开发。即使它不成功,他也知道自己在未来几年中仍将使用它。
2009 年,与 Redis 发布的同一年,一家名为 GitHub 的创业公司的首席执行官 Chris Wanstrath 使用 Redis 构建了一个名为 Resque 的作业队列系统,用于运行 GitHub 的后台任务。在 Rails 世界中,Resque 是当时最受欢迎的作业队列系统。后来的接替者 Sidekiq 于 2012 年出现,也是基于 Redis 构建的,现在已成为 Rails 应用程序开发人员的首选。
另一家初创公司 Instagram 于 2010 年开始与 antirez 接触。在那些电子邮件中,联合创始人 Mike Krieger 讨论了如何使用 Redis 构建 Instagram。当时,Instagram 和 Redis 都刚刚起步,Mike 和 antirez 并不认识。由于 Instagram 在早期完全建立在 Redis 之上,如果没有 Redis,Instagram 可能不会存在,或者至少会推迟出现。
有趣的是,Twitter 也在 2010 年加入了 Redis 用户行列。Twitter 的关键功能 “时间线” 由 Redis 驱动。有意思的是,Redis 刚刚发布不久 (2009 年 3 月),antirez 就构建了一个名为 Retwis 的 Twitter 克隆应用,以展示一个基于 Redis 的应用程序。
大约一年的时间里,Redis 对于 antirez 来说只是一个业余项目。在没有获得报酬的情况下,他不断改进并发布新版本,直到有一天接到了 VMware 的电话。他们表示:“我们希望在经济上支持 Redis。我们在意大利有一个办公室,想雇佣你成为我们的员工。” 当 antirez 询问他们需要他做什么时,他们安抚道:“不,不,不,你只需要继续你现在正在做的事情,我们会支付你报酬。只要在你的网站上提到 Redis 得到了 VMware 的赞助就可以了。”
就这样,Redis 获得了它的第一个主要赞助商。
antirez 与 VMware 一起在 Redis 上工作了几年。后来,当 VMware 与 Pivotal 分拆时,他转到了 Pivotal。
随着 Redis 获得更多用户,第一批提供 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 上分享了与会者的照片。
回顾 Redis 在这十年间的成长历程:
同年六月,antirez 发表了一篇博文宣布辞去 Redis 项目开发者和维护者的角色。尽管他仍将担任 Redis Labs 的顾问并提供咨询意见,但他不再直接参与开发工作。对于同一个项目的十多年奉献让 antirez 感到精疲力竭。
对于 antirez 来说,编程是表达自我的方式,一种艺术形式。每个字符和换行都必须经过精心打磨,就像写作的艺术一样。软件开发就像写书一样,必须美丽、优雅且易于理解。如果这个软件恰好对他人有用,那只是一个附带的结果。
当然,antirez 明白这个想法并不现实。当你的软件被大规模采用时,你必须做出许多妥协,这可能使你的软件不完美,但对人们更有用。维护 Redis 变得越来越具有挑战性,使他陷入艺术与实用之间的两难境地。这种斗争使 antirez 感到精疲力竭,承受着压力,渴望回归他作为艺术家的身份,创造纯粹的编程艺术。
离开 Redis 项目后,antirez 写了一本关于人工智能的科幻小说,名为《Wohpe》,于 2022 年 7 月出版。同年四月,Redis 团队发布了 7.0 版本,这是 antirez 离开项目后的第一个重要版本。
Chang-Hung Liang,中国台湾人,软件考古学家。
原文链接:
https://blog.brachiosoft.com/redis-en#heading-ten-years-later
声明:本文为 InfoQ 翻译,未经许可禁止转载。
微信扫码关注该文公众号作者