groupcache是go语言开发的缓存库。用于替换memcache的。
当客户端连上groupcache时,能做的只有get获取数据,如果本地有所需要的数据,则直接返回,
如果没有,则通过一致性哈希函数判断这个key所对应的peer,然后通过http从这个peer上获取数据;
如果这个peer上有需要的数据,则通过http回复给之前的那个groupcache;groupcache收到之后,保存在本地hotCache中,并返回给客户端;
如果peer上也没有所需要的数据,则groupcache从数据源(数据库或者文件)获取数据,并将数据保存在本地mainCache,并返回给客户端
- 只能get、remove,不支持update,只能remove后再get
- 过期机制为限制cache队列长度,不能设置过期时间,只能通过内置lru淘汰过期数据;
- 经常变更的数据不适合groupcache作为缓存; 注意一点,groupcache的consistenhash实现只能增加节点,无法减少节点,若要实现该功能,要注意当减少节点时, 如果有相同的虚拟节点映射到同一个位置,则要判断删除的数量。增加不存在问题,因为增加的时候后来的虚拟节点可以替换先设置的虚拟节点,不影响使用。
cd example
go build
./example -addr=:8080 -pool=http://127.0.0.1:8080
# 查询
curl localhost:8080/color?name=green
#00FF00
curl localhost:8080/color?name=red
#FF0000
.
├── byteview.go // 封装了字节切片的多种操作方法
├── consistenthash // 提供了分布式一致性hash的抽象,其本身并没有实现分布式一致性的hash,而是可以以指定的hash完成分布式一致性的key的定位和节点的增加,注意这里没有实现节点删除。
├── groupcache.go // grpc生成的代码,用于远程调用
├── groupcachepb // 提供了上述节点之间其消息序列化和反序列化协议,基于protobuf,在groupcache.proto中定义。
├── http.go // 实现了peers之间的http查询缓存的请求方法和响应服务
├── lru // 实现缓存的置换算法(最近最少使用)
├── peers.go // 抽象了缓存节点,提供了注册、获取节点的机制
├── singleflight // 实现多个同请求的合并,保证“同时”多个同参数的get请求只执行一次操作功能
├── sinks.go // 抽象了数据容器, 可以以不同的方法初始化设置,最终以统一的字节切片读出
└── testpb
- consistenthash(提供一致性哈希算法的支持),
- lru(提供了LRU方式清楚缓存的算法),
- singleflight(保证了多次相同请求只去获取值一次,减少了资源消耗),
- 节点销毁怎么处理?
- 数据更新或者删除? https://github.com/mailgun/groupcache