[转]GroupCache:Go 语言实现的 memcached


memcached作者Brad Fitzpatrick用Go语言重新实现了memcached,新的项目名称为groupcache,现已在Google多个生产环境中投入使用。

对比老版本memcached,groupcache去掉了缓存有效期及缓存回收机制,随之而来的是通过自动备份来均衡负载。

项目地址:https://github.com/golang/groupcache

国内镜像地址:https://code.csdn.net/OS_Mirror/groupcache

对比原始memcached

首先,groupcache与memcached的相似之处:通过key分片,并且通过key来查询响应的peer。

其次,groupcache与memcached的不同之处:

  • 不需要对服务器进行单独的设置,这将大幅度减少部署和配置的工作量。groupcache既是客户端库也是服务器库,并连接到自己的peer上。
  • 具有缓存过滤机制。众所周知,在memcached出现“Sorry,cache miss(缓存丢失)”时,经常会因为不受控制用户数量的请求而导致数据库(或者其它组件)产生“惊群效应(thundering herd)”;groupcache会协调缓存填充,只会将重复调用中的一个放于缓存,而处理结果将发送给所有相同的调用者。
  • 不支持多个版本的值。如果“foo”键对应的值是“bar”,那么键“foo”的值永远都是“bar”。这里既没有缓存的有效期,也没有明确的缓存回收机制,因此同样也没有CAS或者Increment/Decrement。
  • 基于上一点的改变,groupcache就具备了自动备份“超热”项进行多重处理,这就避免了memcached中对某些键值过量访问而造成所在机器CPU或者NIC过载。
  • 当下只支持Go

运行机制

简而言之,groupcache查找一个Get(“foo”)的过程类似下面的情景:

  1. key“foo”的值是否会因为“过热”而储存在本地内存,如果是,就直接使用
  2. key“foo”的值是否会因为peer #5是其拥有者而储存在本地内存,如果是,就直接使用
  3. 首先确定key “fool”是否归属自己N个机器集合的peer中,如果是,就直接加载。如果有其它的调用者介入(通过相同的进程或者是peer的RPC请求,这些请求将会被阻塞,而处理结束后,他们将直接获得相同的结果)。如果不是,将key的所有者RPC到相应的peer。如果RPC失败,那么直接在本地加载(仍然通过备份来应对负载)。

采用情况

groupcache已经在dl.Google.com、Blogger、Google Code、Google Fiber、Google生产监视系统等项目中投入使用。

更多展示:Presentations

Via groupcache & CSDN

感谢 WnouM 投递这篇资讯

资讯来源:CSDN





你可能感兴趣的:([转]GroupCache:Go 语言实现的 memcached)