我们非常高兴地欢迎 Salvatore Sanfilippo 回归 Redis——您可能更熟悉他的名字“antirez”。Salvatore 于 2009 年创建了 Redis 项目,并一直负责到 2020 年,之后他休息了一段时间,专注于家庭和其他项目。在这篇文章中,他解释了是什么让他长时间休息后又回到了 Redis。我们很高兴他以 Redis 布道者的新身份回归,并期待他帮助我们继续发展社区。这篇文章最初以“我离开的地方” 为题发表在 Salvatore 的个人博客上。我们经许可在此转载。
我不是那种对自己的工作产生强烈依恋的人。当我决定离开 Redis 时,大约是 1620 天前(约 4.44 年),我再也没有看过 Redis 的源代码、提交信息或任何相关内容。有时,当我需要使用 Redis 时,我只是下载并编译它。我只需输入“make”,就很高兴地看到,多年之后,构建 Redis 仍然如此简单。
我的抽离并不是因为我讨厌过去的工作。虽然从长远来看,我的创造性工作变得越来越不重要,“处理项目”的活动变得越来越繁重——这是许多程序员都能适应的转变,但这并非我擅长的——好吧,我离开时仍然喜欢做 Redis 相关的事情。然而,我并不认同大多数与我同龄(我现在 47 岁)的人所持的观点:他们认为自己仍然年轻。我想要做新的事情,尤其是写作。我想要花更多时间陪伴家人并帮助亲戚。我确实需要休息。
然而,在“写作的几年里”(顺便说一句,我仍在写作),我经常回到编程,作为从紧张的写作中放松的方式(写作是我发现唯一比编程更耗费脑力的活动):我做了一些嵌入式项目;玩了更多神经网络;构建了 Telegram 机器人:什么都沾了点。随机瞎折腾挺有趣的,但从长远来看,我感觉自己缺乏一个真正的目标,每天都开始感受到更强烈的回归技术世界的紧迫感。与此同时,我看到 Redis 社区正在分裂,这让我有些担忧,即使我只是一个局外人。
于是我开始想,也许,毕竟,我可以在 Redis 生态系统中重新扮演一个角色。也许我可以重塑公司对待社区的态度。也许我甚至可以帮助 Redis 核心重新成为新开发的主要焦点。基本上,我可以成为某种“布道者”(我不喜欢这个职位的名称,但……好吧,你懂的),也就是说,一方面,作为公司和社区之间的桥梁,同时也能制作编程演示,发明和描述新模式,编写关于新旧内容的文档、视频和博客文章。那么,新事物的设计呢?我可以从社区人们的工作中学习,从他们的困难中提炼,然后反馈设计想法,以便 Redis 能够发展。
有一天,我女儿(现在 12 岁,她是我生命中的重要人物,用她的智慧、创造力和爱点亮了我的日子)想去纽约度过生日。我们决定,是的,这毕竟是个好主意,我们最近过了几年非常困难的日子,所以,为什么不呢?我女儿现在更像一个少女,而不是孩子。因此,在纽约,我想:也许现在是时候了,我可以找一份兼职工作。我最近通过视频通话见到了新任 Redis CEO Rowan Trollope。我感觉我可以和他一起努力,调整公司与社区的关系以及代码库的方向。于是我给他写了一封电子邮件,问道:你认为我能否以某种身份回归?Rowan 对我的提议表示了兴趣,很快我们就达成了一些协议。
人们会问我 *实际上* 为什么这样做,除了上面写的内容之外,是否有其他隐情,是否涉及某种协议,或者一大笔钱;是否有奇怪或不清楚的地方。但有时事情就是这么无聊:1. 是我联系了公司,而不是反过来。2. 我回归不是为了拿巨额报酬,也不是为了利用某种情况——只是正常工资(但声明一下:是的,我像以前一样拥有 Redis 股票期权,不多也不少)。3. 对于 Redis 改变许可证,我没有大的问题;尤其是我认为社区的分裂 *并非* 真正与此有关。但既然人们肯定会问我这个非常重要的问题,我最好立刻把所有真相告诉大家。
我几乎一生都在编写开源软件。然而,就像我是一个无神论者,但看到别人相信上帝时仍然感到高兴(如果这能帮助他们度过生活的艰难),我也不认为开源是编写软件的唯一方式。当我开始在一家公司开发 Redis 时,我是两位创始人之一,那时我们保留了闭源代码(Redis 后来之所以开源,是因为它不被认为是核心产品的一部分)。我们不希望我们的服务被其他人复制,就这么简单。所以在这方面我不是一个极端分子——我只在软件设计方面是一个极端分子。
此外,我不认为开放性和许可证仅仅是 OSI(开放源代码促进会)告诉我们的那样。我认为许可证是一个关于你可以做什么和不能做什么的范围。同时,我确实担心大型云提供商改变了系统软件领域的激励机制。Redis 并不是唯一一个改变许可证的项目,它实际上是最后一个……在一大堆项目中的最后一个。我感觉近年来许多项目甚至没有启动,就是因为缺乏清晰的潜在商业模式。所以,Redis 的许可证变更不是我的决定,也许我会选择不同的许可证?我不确定,现在重新讨论太容易了,我已经远离这个领域多年,并且没有商业压力。但总的来说,我能理解这个选择。
此外,如果你阅读了新的 Redis 许可证,当然,它不是 BSD 许可证,但基本上只要你不将 Redis 作为一项服务出售,你就可以像以前一样以非常相似的方式和自由度使用它(我的意思是,你仍然可以修改 Redis,重新分发它,在你的营利性公司中商业使用 Redis,免费使用等等)。如果你愿意,你 *甚至* 仍然可以将 Redis 作为服务出售,前提是将所有编排系统也按照相同的许可证发布(这可能是没有人会做的,但这表明了许可证的 copyleft 方法)。许可证语言几乎与 AGPL 相同,只是在 SAAS 相关部分有所修改。所以,它没有得到 OSI 批准?是的,但我对将 SSPL 称为封闭许可证持保留意见。
你会说(我能听见你):真正的问题在于有公司控制着开源项目的方向!所以最终利益会更偏向公司,而不是用户群体。我很感谢有许多项目没有公司的直接参与(除了外部赞助),但你知道吗?在许多大型项目中,公司的参与实际上减缓了偏离正确轨道的进程。这在 Redis 的案例中确实发生过。
让我们回到过去,回到 Redis 的最初日子。
当 Redis 开始流行起来时,我想找到一种方法继续投入其中。这发生在 VMware 赞助我的工作之前。我开始思考商业模式,你猜怎么着?它是一种闭源产品的形式,这些产品可以以某种方式帮助人们运行 Redis,以这样或那样的方式。(令人惊讶的是,与这个想法相关的一个代码仓库仍然在线,显示着 *15* 年前的提交: https://github.com/antirez/redis-tools)
我曾打算尝试某种开放核心模式;我还记得我曾想过将新代码的 BSD 许可证延迟六个月发布,以便为付费用户创造某种优势。现在我不相信我会做出那样不负责任、对用户玩弄奇怪把戏的事情,但我能做到今天这样,要感谢 VMware,以及后来更广泛地感谢 Redis Labs:他们让我成为了一个开放源代码软件界的罗宾汉,我从一家公司那里得到了丰厚的报酬,不,不是为了公司的利益,而仅仅是为了 Redis 社区的最佳利益。我确定,这比拥有自己的公司要好得多。
VMware 以及后来的 Redis Labs,不仅仅为我付出了报酬。如果你快速查看代码仓库的贡献历史,你会看到第二大贡献者是 Oran Agra (Redis),然后是 Pieter Noordhuis (VMware),等等。
所以,基本上我认为,12 年来只专注于用户基础编写的 BSD 代码是一件很不错的事情,是值得高兴的。而对我来说,目前最重要的一点是,与社区的分裂并非由于许可证问题,或者至少主要不是因为许可证。实际上,新许可证可以解决其中的一部分问题:现在不再有将核心代码置于维护模式、将新开发放入模块中的动力。有了新许可证,云提供商不能再随意复制 Redis 代码库并出售,而无需任何收入分成(这要求真的很高吗?这本可以避免你最近看到的所有许可证变更,不仅仅是 Redis)。有了新许可证,焦点可以重新回到 Redis 核心,新的、令人兴奋的功能将由世界各地的开发者掌握。数十名因其工作得到良好报酬的人将在 GitHub 仓库中提交有用的、文档完善的变更。这也是我想要帮助公司实现的一件事,我会为此努力。我们需要让许可证变更对用户基础和功能产生积极影响:这就是我的想法。
但还有更多:Redis 对开发向量能力越来越感兴趣,并且总体上支持你可以通过人工智能进行的编程。现在,我每天都阅读 Hacker News,看到大量技术人员不喜欢人工智能和新的发展。我也看到很多人甚至懒得深入尝试最新的模型(提示:Claude AI 独树一帜),仍然认为它们有点没用。对我来说,情况不同。我一直热爱神经网络。我在 2003 年写了我的第一个神经网络库,并被整个概念的力量和酷炫程度完全震撼了。现在,在 2024 年底,我终于看到这个领域的惊人成果,几年前看起来像科幻小说的东西现在成为可能:最近 Claude AI 成为了我的推理/编辑/编程伙伴。我现在能够比过去完成更多的事情。我经常因为人工智能而做 *更多的工作*,但我做得更好。最近,我为一家意大利出版商写了一篇科幻短篇小说,多亏 Claude 对部分内容的批评,我重写了结尾,写出了更好的作品(我没有让 Claude 写故事或情节的任何一行:人工智能的伟大用法不是让机器做你做得更好的事情)。
昨天,我需要评估我的向量经过 8 位量化后点积计算能快多少;我告诉 Claude 我需要一个以特定方式设计的基准测试,两分钟后我就可以测试它,修改它,并了解它是否值得。基本上,人工智能没有取代我,人工智能通过我的工作反馈加速或提升了我。我相信(无论 RAG 有多流行,它不一定是主要应用,也不是最未来可期或最有用的,因为模型的上下文越来越大,很快流行模型的注意力可能会有线性复杂度),抱歉离题了,我想说的是,我相信学习型嵌入(learned embeddings)会一直存在,而向量搜索属于 Redis,原因有几个:首先,向量索引是数据结构,尤其是慢速的数据结构,而这样的数据结构在内存中可以很好地工作。此外,因为我认为我找到了暴露它们的完美 API。
在我设计 Redis 的过程中,我总是表现出一些矛盾的倾向。我总是乐于拒绝某些看起来非常适合项目的东西(比如命名 Lua 脚本,哈希字段过期时间,顺便说一下,它们现在都是 Redis 的一部分),但同时我又添加了 Lua 脚本能力——当这看起来像疯了一样时,一个解释器竟然在 Redis 里面?!——还有 Pub/Sub 能力,这似乎与上下文无关,然后是 Streams,甚至还有在计算机科学书籍中不存在的合成数据结构,比如有序集合。因为对我来说,新特性是否适合 Redis 取决于两点:用例和内部设计契合度。对我来说,Redis 是程序员的乐高积木,而不是一个“产品”。
所以最近我开始思考,有序集合可以启发一种新的数据类型,其中分数实际上是一个向量。在我与 Rowan 交流的同时,我开始撰写设计文档,然后开始实现新数据类型的概念验证,从头重新实现了 HNSW(而不是使用现有的库,因为我想调整每一个细节),以 Redis 的方式。好吧,我不确定这最终会怎样,我仍在编码的早期阶段,但如果这个提议被接受,也许我最终会再次贡献代码。我实现的这个模块(之后可能会合并到核心——现在它只是为了简单起见作为一个模块)实现了直接操作嵌入的新命令。我只给你们看一个提示:
VSIM top_1000_movies_imdb ELE “The Matrix” WITHSCORES
所以你有了 VSIM, VADD, VCARD,这些都是显而易见的。这完全是基于有序集合的想法,但使用多维分数(嵌入向量!)和 K-NN 匹配。你觉得怎么样?当然,除此之外还有许多实现技巧来提高效率。但目前这只是概念验证代码,让我再多花点时间在这上面。我正在实现线程、降维、量化等等许多东西。说实话,相当有趣。
正如你所见,这里没有提到混合搜索(hybrid search),这是最近关于向量存储的热门词汇。再说一次,这就是 Redis 的方式:让开发者扮演一个角色,并由他们自己决定权衡:毕竟,他们知道自己在建模什么。每个键都有一个向量索引,就像程序员使用有序集合时一样,他们会创造有趣的分割策略、新的模式、Lua 脚本、模式以及所有需要的东西来构建他们的用例。
然而,虽然通常关联的项目可能是一个小字符串或文档 ID,但没有什么阻止它成为更复杂的东西,带有可以稍后过滤的元数据(但我会抵制这种想法)。我只是觉得许多用例并不真正需要复杂的服务器端过滤,可以通过预先分区数据来建模。
我非常感兴趣的是可能添加一个 STORE 选项,将结果存储到有序集合中,而不是返回给用户,当然,分数就是相似度。所有这些也会对效率、可伸缩性、使用脚本的能力等方面产生复杂而有趣的影响:我希望在接下来的几周和几个月里有机会更多地谈论它。
好吧,好吧:回到这篇博客文章的主题。但也许上面的内容才是 *真正* 的重点,那些令人兴奋的新想法。
所有这一切都为了说明,我回来了。我认为现在是时候向所有的 Redis 社区成员表达深深的感谢,感谢你们多年来所做的一切。再见,我希望这段旅程中还有更多的东西可以添加。
附言:我在 BlueSky 上很活跃,如果你想关注这一切的进展。 https://bsky.app/profile/antirez.bsky.social