Gopher: a present for Redis

Salvatore Sanfilippo

Gopher:送给 Redis 的礼物

十年前,Redis 在 Hacker News 上发布,我把这一天当作这个项目的虚拟生日,原因很简单,项目向公众发布的日子比写下第一行代码的日子更重要(可以把它想成是受孕与实际诞生在动物身上的区别)。我想借 Redis 十周年这个由头,发布一个前几天捣鼓的小玩意儿,本来是想留到 4 月 1 日愚人节用的:但那个日子还远,我现在就想和你们聊聊这个项目……所以,祝 Redis 生日快乐!这是送给你的礼物:一个 Gopher 协议的实现。

[……此处 Redis 想忍住泪水,但情绪太过激动,地上散落着一地的比特(我是说 0 和 1)……]

“你在说什么鬼?!”这应该是你的第一反应。2019 年还提 Gopher 听起来有点奇怪。然而它并不*只是*一个玩笑,尽管很大程度上确实是个玩笑。毕竟整个实现只有 100 行代码,还不算把页面渲染成 Redis 键的那个外部工具。但是……关键在于,围绕 Gopher 确实存在一个活跃的社区,虽然很小,但在最近几年乃至几个月里一直在壮大。有些人觉得互联网已经不再是过去的样子。管控太多,公司追踪,评论、点赞、转发,多到内容不再为王。人们写点新东西,火上 5 个小时就消失了。再也没有一种讨论能在几分钟以上存活而不演变成某种骂战,除非所有参与方都自我审查掉一切可能的情绪、令人不适的言辞和信念,以至于让讨论本身变得毫无意义。最后,为了加载一个只有 1k 文字的破页面,却要加载 50 个 JavaScript 文件,看着屏幕闪烁,只因为客户端渲染很酷,如此种种。

另一方面,Gopher 是一个纯文本协议,非常适合传递纯文本文档,重点在于你写了什么。但如果仅仅如此,那就是恋物癖了,对我而言,Gopher 的杀手锏在于它不酷(UNCOOL)。不酷到据我所知(AFAIK),它将永远是一个平行世界,在那里,某些人可以决定与大众分道扬镳,去体验一种不同的处事方式,更类似于 BBS 的旧时光或是互联网最初的那几年。一个大多数人都不愿去的地方,只为用 80 列等宽字体阅读些极客的东西。

在 Gopher 中你要做的是创建你的 Gopher hole,也就是你在 Gopher 宇宙中的空间,基本上就像你在互联网上的网站一样。做这件事的工具本来就不少,但 Redis 出于几个原因显得相当不错:你可以实时修改 Redis 键来改变网站内容,这很方便。你可以利用 replication(复制)来复制一个站点,甚至只需保存你的 RDB 文件,就能获得整个 Gopher hole 的精确副本,用于备份或作历史存档。

这个 Redis Gopher 的构想是在 FreakNet 的合作下完成的,FreakNet 是位于卡塔尼亚的一个历史悠久的黑客实验室。https://it.wikipedia.org/wiki/FreakNet。这些家伙做了很多有趣的事情,包括在帕拉佐洛-阿克雷德这里的一个复古计算硬件博物馆项目:https://museo.freaknet.org/en/

它是如何工作的?

嗯,这很简单,我劫持了 inline protocol(内联协议),具体来说是两种本来就非法的内联请求:空请求或任何以“/”开头的请求(没有任何 Redis 命令是以这种斜杠开头的)。正常的 RESP2/RESP3 请求则完全不会经过 Gopher 协议实现的路径,依然会像往常一样得到处理。如果你在一个启用了 Gopher 的 Redis 上打开连接并发送一个像“/foo”这样的字符串,如果存在一个名为“/foo”的键,就会通过 Gopher 协议来提供服务。整个实现只有 100 行代码。起初我想过使用数据结构并进行到 Gopher 类型的语义转换,但那既复杂又没用。

相反,我为基于 Redis 的 Gopher 提供了一个创作工具,你可以在这里找到它:

https://github.com/antirez/gopher2redis

要查看在 Redis 实例上运行的那个 Gopher hole 示例,只需访问 gopher://gopher.antirez.com,顺便说一下,那也将是我在接下来几天内建好后的 Gopher hole 地址。附言:我建议使用 Lynx 纯文本网页/Gopher 浏览器来访问 Gopher。

Gopher 支持默认是禁用的,要启用它,请使用 Redis 的 unstable 分支,并使用“gopher-enabled”选项,将其设为 yes。不过请务必同时为 Redis 设置密码保护:Gopher 协议仍会提供内容,但与此同时,普通的 Redis 命令将无法访问。这样(假设你的实例中除了 Gopher 键之外没有其他需要暴露的数据),你就可以将该实例公开,作为一个真正的 Gopher 服务器。

好了,祝大家玩 Gopher 愉快!我希望这个 Gopher 项目能继续下去,我真的相信我们中有那么一些人需要在现代互联网的混乱之外创建一个社区。不,这并不意味着完全不互动。例如,我并没有打算停止写博客或使用互联网。但某些更慢、更高质量的交流需要一个得以繁荣的地方。

原文由 Salvatore Sanfilippo 发布

本文章由 muse-spark-1.2-contributor 进行翻译