去年年中的时候,我曾经心态来潮想要写一个 memcached 客户端,但是很遗憾没有写完,算是半途而废了,现在来回顾记录一下。

缘起

去年看到 Redis 客户端 Medis 的作者写的一篇博客 写一个开源的 macOS 程序可以赚多少钱?,
Medis我一直都是知道的,受到启发,觉自己也可以写一个,因为从技术上看似乎没有什么难度(naive:)),基于 Electron 封装客户端,再加上现在流行的前端框架,和丰富的组件库,应该能够快速做出原型出来。

但根据我的了解,市面上已经有不少的 Redis 客户端了,有开源的,也有付费的,我再去写一个,也不一定有人家做得好。
我就想,能不能写一个 Memcached 客户端,一来市面上似乎没有什么成型的Memcached客户端,二是Memcached 和 Redis 类似,而且比Redis更简单,而且我也有过 Memcache的使用经验,还算熟悉。
但是也有一个问题,Memcached 已经没什么人用了,开发一个客户端会有人用吗?
为此,我还在V2EX发了一贴,[调研] 你是否需要一个 memcached 客户端

开干

主要也是想认真学一学 Electron, 再好好用一下 Vue。 和其他很多程序员一样,有点【为了技术而技术意思】,吭哧吭哧就开始着手编码了。
一边看 Electron 的资料,一边写代码,界面上则使用 Vue + ElementUI。 没多久,一个雏形就出来了。

这里截图一张,首页:
memcli

从一开始进入首页,创建链接,到读取值,设置值都跑通了。

问题

但接下来很快碰到一个问题:Memcached 拿不到所有的 key。不像 Redis 一样,有 keys * 这样的命令,能拿到所有的key。
通常来说,要获取Memeched里面的所有key, 先用 stat items来获取每个slab的信息, 再通过stat cachedump $slabid 这样的形式来查看每个 slab 里面存储的 key。
但是由于LRU算法的原因,这里拿到的key,其实不全,网上又有说法使用 lru_crawler metadump $slabid 这样的形式来获取。(因为时间有点久,再加上对这块协议不熟悉,不确保对这段描述是否正确)

这时候我又发现,我所使用的Memecached驱动是不支持lru_crawler metadump $slabid这样的操作的,而且能找到的Memcached客户端无一例外都不支持,而且大多是好多年不更新了。
好不容易找到个国外老哥还在更新的库,于是想问问能不能支持这个操作,或者给我一点指示我来实现也可以,发了个 issue ,很可惜没有得到回复。

到了这时我又想,要不我来撸个Memcached驱动? 和许多程序员有了想法,先注册域名类似,我就开了新的仓库 memcli-driver
但是驱动也不是随便就写的,首先得懂协议啊。

于是,我的注意力又转到了 Memcached 通信协议上,网上关于协议的中文文档已经有点过时了,好在还有一点英语基础,又开始啃 Memcached 通信协议。Memcached 的协议又分为基于文本和二进制两种,简单了解了两者之后,就开始看基于文本的通信协议了。

放弃

众所周知协议是枯燥的,没有写代码这么有成就感,还没啃明白,热情就一点点消散了。后面由于工作也忙,就搁置了。直到现在,已经没有想要再捡起来完善的冲动了……

或许现在人们确实不需要一个 Memcached 客户端了吧,我这样想。