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语言, 分布式缓存, 去中心化, 日志审计, 程序破解, 缓存填充, 缓存库