Gopher:送给 Redis 的礼物
原文由 Salvatore Sanfilippo 于 发布,订阅该博客
十年前,Redis 在 Hacker News 上发布,我就把那一天当作这个项目的虚拟生日,原因很简单——项目向公众发布的日子,比第一行代码写下的日子更重要(就像生物的受孕与真正出生之别)。借着 Redis 十周年的机会,我想发布一个前几天捣鼓的小东西,本来想留到 4 月 1 日愚人节再发的,但那天还远,我现在就想跟你们聊聊这个项目……所以,祝 Redis 生日快乐!这是送给你的礼物:一个 Gopher 协议的实现。
[……此时 Redis 努力忍住眼泪,可情绪太过激动,地上散落了一地的比特(我是说 0 和 1)……]
WTF,你在说什么?!这应该是你的第一反应。2019 年还提 Gopher 听起来确实有点奇怪。不过它并不*仅仅*是个玩笑,虽然很大程度上就是个玩笑。毕竟整个实现也就 100 行代码,还不算把页面渲染成 Redis 键的外部工具。但……关键在于,Gopher 周围真的有一个活跃的社区,虽然很小,但在最近几年、最近几个月里一直在壮大。有些人觉得互联网已经不再是从前的样子。管控太多,公司追踪,评论、点赞、转发,多到内容本身不再是主角。人们写点新东西,也就火个 5 小时然后就消失了。再也没有哪场讨论能撑过几分钟而不演变成某种骂战,除非所有参与者都自我审查掉一切可能的情绪、刺耳的词和观点,到最后让讨论本身变得毫无意义。最后,为了加载一个只有 1k 文字的破页面,却要加载 50 个 JavaScript 文件,看着屏幕闪烁,就因为客户端渲染很酷,诸如此类。
另一方面,Gopher 是一个纯文本协议,非常适合用来传递纯文本文档,重点就在于你写了什么。但如果只是这样,那就是恋物癖了,对我而言,Gopher 的杀手锏在于它很不酷。不酷到据我所知,它将永远是一个另类现实,在那里,某些人可以决定与众人分离,去体验一种不同的做事方式,更像是 BBS 的旧时光或是互联网最初的那几年。一个大多数人都不愿去的地方,只为了用 80 列等宽字体去读些极客的东西。
在 Gopher 里你要做的是创建你的 Gopher hole,也就是你在 Gopher 宇宙中的空间,基本上就相当于你在互联网上的网站。本来就已经不乏实现这一点的工具了,但 Redis 在几个方面相当不错:你可以实时修改 Redis 的键来改变网站内容,这很方便。你可以利用复制功能来复制站点,甚至可以直接保存 RDB 文件,来获得整个 Gopher hole 的精确副本,用于归档、备份或留作历史记录。
这个 Redis Gopher 的构想是在位于卡塔尼亚的历史性黑客实验室 FreakNet 的协作下诞生的。https://it.wikipedia.org/wiki/FreakNet。那帮人做了很多有趣的事,包括在帕拉佐洛-阿克雷德的复古计算硬件博物馆项目:https://museo.freaknet.org/en/。
它是怎么工作的?
说起来很简单,我劫持了 inline 协议,具体来说是两种本来就非法的 inline 请求:空请求,或任何以“/”开头的请求(没有任何 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 项目能继续下去,我真的相信我们中有那么几个人,需要在现代互联网的混乱之外创建一个社区。不,这并不意味着要完全隔绝。比如我并不打算停止写博客或使用互联网。但某些更缓慢、更高质量的交流,需要一个得以繁荣的地方。
随机一篇博客
评论
登录后参与讨论