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