github.com/golang/groupcache 存储的是kv结构,同是memcache作者出品.在放弃update/delete 的特性后,换来的是:Cluster 的能力,处理热点的能力。

因为groupcache只能get,不能update和delete,也不能设置过期时间,只能通过lru淘汰最近最少访问的数据;有些数据如果长时间不更改,那么可以用groupcache作为缓存;groupcache已经在dl.Google.com、Blogger、Google Code、Google Fiber、Google生产监视系统等项目中投入使用。groupcache既是服务器,也是客户端,当在本地groupcache缓存中没有查找的数据时,通过一致性哈希,查找到该key所对应的peer服务器,在通过http协议,从该peer服务器上获取所需要的数据;还有一点就是当多个客户端同时访问memcache中不存在的键时,会导致多个客户端从mysql获取数据并同时插入memcache中,而在相同情况下,groupcache只会有一个客户端从mysql获取数据,其他客户端阻塞,直到第一个客户端获取到数据之后,再返回给多个客户端。

下面我们用一个例子看下,如何使用它。

测试下

整个流程如下:

1,初始化groupCache,并指定回源函数。

2,注册peer节点

3,启动cache服务供peer查询

查询过程如下:

1,先从本地的lru cache里查询

2,如果本地查不到,到peer的本地缓存查询,peer的选取采用一致性hash算法

3,如果peer中也没有取到结果则回源查询

4,将回源查询的结果存入本地缓存

5,上述查询过程为了防止击穿,采用了singleflight组件。

总的来说,它是为了保证可用性,放弃了一致性,所以不支持主动设置缓存、缓存过期、和缓存内容的修改。

适合不修改的内容的缓存。