Overview

groupcache是memcached作者Brad Fitzpatrick的另一kv cache项目,并且‘intended as a replacement for memcached in many cases’。与Redis等其他常用cache实现不同,groupcache并不运行在单独的server上,而是作为library和app运行在同一进程中。所以groupcache既是server也是client。

作为server,它会与其他groupcache组成一个Hash Ring。如果一个key的缓存并不在本地,groupcache会将cache请求根据key的hash值(默认CRC32)自动转发到给其他成员并将结果返回给caller。对于caller来说,这一切都是transparent的,groupcache client的用户可以像使用本地cache library一样使用groupcache client。

在API上,groupcache最大的特点是不提供update/delete/TTL等常见操作,其唯一更改cache的方式是refill。比如:

groupcache.Sink
testGroup
NNgroupcache.GroupN-1groupcache.Group

代码概览

groupcache最大的特点就是轻量。整个repo一共3000多行Go代码,而且只依赖于标准库。所以其逻辑非常简单清晰:


groupcacache.Group
groupcacachegroupcahe.HTTPPoolgroupcacache.Group
groupcahe.HTTPPoolgroupcacache.GroupHTTPPoolgroupcache.ProtoGetter
groupcahe.HTTPPoolhttpGetterHTTPPoolhttpGettergroupcahe.HTTPPoolgroupcacache.Groupgroupcacache.GroupHTTPPool

使用注意

HTTPPool.SetHTTPPool.SetHTTPPool.Set

第二,使用groupcahe将使应用变的stateful(至少是semi-stateful)。这在运维上可能会增加难度。原本一个k8s Deployment的问题,现在可能需要一个Operator来解决。而且在进行host maintenance的时候也要额外小心,以防止cluster剧烈resharding。

第三,groupcahe只支持refill。这也便意味着其只能对immutable的value进行缓存。其应用场景有限。

其stateful的主要优势在于上述的refill cache时减少了对DB的读取。其具体价值得参考项目本身。而且因为groupcahe没有membership管理功能,应用需要自己实现一套membership管理。应用层也可以考虑基于自己已有的membership管理功能来做sharding,然后自己内部实现一套简单的cache。