开源构建者的故事:Redis 如何以一己之力颠覆数据库市场

本文由黄健宏翻译自 thenewstack.io/open-source-builders-how-redis-upended-the-database-market/ ,首发于 blog.huangz.me

按理来说,如果 Salvatore Sanfilippo 打算在数据库领域闯荡一番,那么他至少应该具备相应的资质,比如先在 Oracle 或者 SQL Server 上耕耘个十年八年,然后再辞职去追梦——但事实并非如此。 Sanfilippo 说当初他在 2009 年开始创作 Redis 的时候,自己还只是一个数据库的业余爱好者,并且也是第一次进入数据库领域。 实际上,正因为他在数据库方面缺少经验,所以才导致他打破了各种被认为是正确无比的数据库工程“铁则”。

但实际上这种离经叛道并不是一件坏事。

现如今,Redis 已经成为了世界上最受欢迎的数据库之一,而我们正享受着 Sanfilippo 打破规则带来的好处。 虽然那些依赖 Redis 的产品和服务很多都没有贴上“Redis inside”的贴纸,但我们很有可能每天都在使用 Redis ,毕竟 Uber 、Instacart 、 Slack 、 Hulu 、 Twitter 、 Instagram 以及很多公司都在使用 Redis 。 不过 Sanfilippo 并没有打算告诉我们该如何使用 Redis ,“Redis 应该用在什么地方我说了不算——应用的开发者在这方面更有发言权”,他说。

为了弄清楚 Redis 出现的原因以及它的发展历程,我们采访了开源项目 Redis 的创始人 Salvatore Sanfilippo 。

在创作 Redis 之前,Sanfilippo 在安全领域等方面已经小有名气。 在安全领域,他创建了网络安全工具 hping 以及名为 Idle Scan 的端口扫描技术。 此外,他还创建了名为 Visitors 的网络日志分析器,Jim 解释器(一个小型的 Tcl 编程语言实现),还有几种硬件驱动。 换句话说,他并没有闲着,而是一直都有所作为。

这些忙碌主要和他努力扩大自己的创业公司规模有关,特别是其中一个名为 lloogg.com 的实时分析服务。 Sanfilippo 挣扎着想要让 lloogg.com 运行在 MySQL 这一关系数据库上,但尝试之后却发现,为 1 万名用户提供服务所需的硬件开销要比提供服务带来的收入高得多。 他觉得把工作负载(workload)储存在内存里面似乎是一个不错的想法,并且更关键的是,这些负载——将数据推入至列表然后再将列表裁剪为固定长度——无法简单地使用关系数据库来实现。 于是他就开始着手构建 Redis 。

Sanfilippo 在创建 Redis 并没有拼凑不同数据库的特性,而是对底层的数据模型做了不同的思考。 最终,他构建出了一个内存 NoSQL 数据库,它既可以储存数据又可以用作缓存,并且在这个过程中打破了各种数据库的“铁则”。

实际上,Sanfilippo 的做法遭到了数据库知识分子的一致批评。 刚开始,他们指责 Redis 将数据放在内存里面的做法。 之后又批评 Redis 使用 fork 系统调用来实现数据库持久化,并认为 Lua 脚本应该使用名字而不是脚本体的 SHA1 校验和来进行调用。

这些批评者也许对传统数据库的构建方法了然于胸,但他们却对如何构建未来数据库一窍不通。

如何结识朋友并影响他人

Sanfilippo 说尽管数据库专家对他的工作有诸多抱怨,但他仍然还是能够自由地创建一种新型的数据库。 考虑到开源一直以来都是他生活中的重要部分,他选择在开放的环境中进行创新也是理所当然的。 “我相信分享的力量”,他说。 根据 Sanfilippo 的说法,自从在 18 岁时安装了 Slackware 1.2.3 ,并且意识到它包含了 C 语言编译器在内的诸多东西之后,他的职业生涯就开始了。 “实际上,我的软件开发生涯就是伴随着开源开始的,所以对我来说开源就是一种自然而然的方式。”他说。

但对 Sanfilippo 来说,开源并不是仅仅和授权有关。

“我相信软件开发是一种人类活动,并且需要有人来讲述故事”,Sanfilippo 说,“所以我到了不同的地方去讲 Redis 的故事”。逐渐地,人们开始聆听并拥抱 Redis ,刚开始是在初创企业社区,后来是在成熟的企业里面。

Sanfilippo 指出,刚开始的时候,比起所谓的数据库专家的帮助,他更看重自己的自由,但随着时间的推移,围绕 Redis 已经出现了一个社区。 Sanfilippo 说,10 年之后,“Redis 的内核必定将是多人合作的产物”。

但这并不意味着 Sanfilippo 已经把自己的手从方向盘上拿开了:他承认自己很不擅长委派工作,以至于直到今天他还是自己一个人编写所有的 Redis 文档。

虽然 Sanfilippo 欢迎人们对 Redis 做出贡献,但他也承认社区的意见有好也有坏。 例如,有些人可能会想要用 Redis 去解决一些 Sanfilippo 并没有打算解决的问题。 另外,还有一个事实,那就是构建系统软件并不是一件简单的事情。 “在大多数时候,你只能从那些拿着薪水编写这种软件的人那里得到严肃的贡献”,他说,当然有时候也会有例外。 他承认,向 Redis 这样一个严肃的数据库系统做贡献并不是一件可以在周日早上进行的休闲活动。

在过去的十多年,Sanfilippo 常常会感受到压力,担心 Redis 是否会成功,钱是否够用等问题。 但幸运的是,随着 Redis 的成功,这些问题都已经不再是问题了。 今天,Sanfilippo 很幸运,他能够作为 Redis Labs 的员工,全身心地投入到 Redis 的开发中。

不过你可别指望他能够告诉你该如何使用 Redis 。

“我对于如何使用 Redis 没有太多发言权,应用开发者比我知道得更清楚”他说,并解释道:每个应用都有自己的目标,必须提供的保证,以及延迟和可扩展性考虑。 Sanfilippo 说,他唯一希望的就是 Redis 可以用于解决问题:无论是作为主数据库,还是其他数据库的索引,又或者是智能缓存、消息队列,等等。

Sanfilippo 说,他没有硬性地规划 Redis 的未来,而是提供了一套组件,使得人们可以创造性地组装它们。 Redis 也很容易修改,“开发者只要进行少量改动,就能够让 Redis 完成一些预想之外的事情。” Sanfilippo 说,这种做法是可行的。

Sanfilippo 并没有把自己看作是某种权威的领导者。 “我更喜欢设计新的东西,并通过编码将它们变为现实”,他说,如果人们也喜欢我创造的东西,那当然最好不过了。 对于 Redis 来说,“开发者想成为国王还是王后——都取决于他们自身。”Sanfilippo 总结道。

文/Matt Asay · 译/黄健宏

2020.5.20

Tip

你对 Redis 有兴趣,想要学习 Redis 吗? 是的话请不要错过我的 《Redis入门与实战》 以及 其他 Redis 书