golang/groupcache
GitHub: golang/groupcache
groupcache 是一个 Go 语言分布式缓存与缓存填充库,通过内嵌式部署和去惊群机制替代 memcached。
Stars: 13341 | Forks: 1392
# groupcache
## 摘要
groupcache 是一个分布式缓存和缓存填充库,在许多情况下旨在替代 memcached 节点池。
有关 API 文档和示例,请访问 http://godoc.org/github.com/golang/groupcache
## 与 memcached 的比较
### **与 memcached 类似**,groupcache:
* 通过 key 进行分片,以选择哪个 peer 负责该 key
### **与 memcached 不同**,groupcache:
* 不需要运行单独的一组服务器,从而大幅
减少了部署/配置的痛苦。groupcache 既是客户端
库,也是服务器。它连接到自己的 peer,形成
一个分布式缓存。
* 自带缓存填充机制。memcached 只会返回
“抱歉,缓存未命中”,这通常会导致数量不受限的客户端
对数据库(或其他系统)发起
惊群效应式的负载请求(这已经引发过几次
严重的故障),而 groupcache 则会协调
缓存填充过程,使得在整个复制的进程集中,只有一个进程中的
一次加载操作负责填充缓存,
然后将加载的值多路复用分发给所有调用者。
* 不支持带版本的值。如果 key "foo" 的值是 "bar",
那么 key "foo" 必须始终是 "bar"。
它既没有缓存过期
时间,也没有显式的缓存淘汰机制。因此,它也没有 CAS,
也没有 Increment/Decrement。这也意味着 groupcache....
* ... 支持将超级热门的项目自动镜像到多个
进程。这可以防止 memcached 的热点效应,即某台机器的
CPU 和/或网卡(NIC)因极其受欢迎的 key/value 而过载。
* 目前仅支持 Go。我
(bradfitz@)不太可能将代码移植到任何其他语言。
## 加载过程
简而言之,groupcache 执行 **Get("foo")** 查找的过程如下:
(在运行相同代码的 N 台机器组成的集群中的第 5 台机器上)
1. "foo" 的值是否因为极其热门而存在于本地内存中?如果是,则使用它。
2. "foo" 的值是否因为 peer #5(当前
peer)是它的所有者而存在于本地内存中?如果是,则使用它。
3. 在我的 N 个 peer 集合中,我是否是 key
"foo" 的所有者?(例如,它的一致性哈希值是否为 5?)如果是,则加载它。如果
其他调用者介入,无论是通过相同的进程还是来自 peer 的 RPC 请求,它们都会阻塞并等待加载完成,然后获得
相同的答案。如果不是,则向作为所有者的 peer 发起 RPC 请求并获取
答案。如果 RPC 失败,只需在本地加载它(依然带有
本地重复请求抑制机制)。
## 用户
groupcache 已被 dl.google.com(其首个用户)投入生产使用,
此外还包括 Blogger 的部分功能、Google Code 的部分功能、Google Fiber 的部分
功能、Google 生产监控系统的部分
功能等。
## 演讲
请参见 http://talks.golang.org/2013/oscon-dl.slide
## 帮助
请使用 golang-nuts 邮件列表进行任何讨论或提问。
标签:EVTX分析, Go语言, 分布式缓存, 去中心化, 日志审计, 程序破解, 缓存填充, 缓存库