groupcache是一个缓存系统,开始应用在Google下载站点dl.google.com,后来也使用在Google Blogger和Google Code这些数据更改频率较低的系统中。
groupcache没有update/delete 命令,只有set命令,使用lru存储策略,空间占满时便淘汰最不常使用的缓存,所以适合数据更改频率较低的应用。
groupcache集群使用“一致性哈希“分布节点,单节点出现问题对整体系统影响较小。
一. groupcache 使用
下面创建有三个groupcache节点的集群
"http://127.0.0.1:8001", "http://127.0.0.1:8002", "http://127.0.0.1:8003"
1. 创建本地httppool,并添加对等节点。httppool是一个集群节点选取器,保存所有节点信息,获取对等节点缓存时,通过计算key的“一致性哈希值”与节点的哈希值比较来选取集群中的某个节点
2. 创建一个group(一个group是一个存储模块,类似命名空间,可以创建多个) “image_cache”。NewGroup参数分别是group名字、group大小byte、getter函数(当获取不到key对应的缓存的时候,该函数处理如何获取相应数据,并设置给dest,然后image_cache便会缓存key对应的数据)
3. group查找对应key的缓存,data需要使用sink(一个数据包装结构)包装一下
其他两个节点需修改local_addr 地址,然后3个节点的groupcache集群就设置成功了。
二. groupcache源码分析
groupcache主要分为httppool和group两部分,httppool负责集群管理,group负责缓存管理。
1. httppool的作用就是管理所有节点,并通过http协议使节点之间相互通信,获取存储在其他节点上的缓存
2. group的作用是管理缓存,并通过httppool选取节点,获取其他节点的缓存。
参考
groupcache:https://github.com/golang/groupcache
一致性哈希:http://blog.codinglabs.org/articles/consistent-hashing.html
protobuf:https://developers.google.com/protocol-buffers/docs/overviewgo
protobuf例子:https://godoc.org/github.com/golang/protobuf/proto