groupcache中load方法解析

新小组使用go开发服务,所以找了好久可以用于学习的开源项目。发现memcache的作者也是golang的作者之一,开源了一个叫groupcache的项目。

groupcache在存储集群上层构建缓存。当前主要适用于搭建文件下载类的服务。

groupcache.go中有个load方法,看了好长时间,也难以理解。下面就针对这个方法做些解释。

当内存(也就是缓存)中没有找到key的value时(miss cache),会去peer或者存储集群加载文件。也就是load方法的主要内容。

load方法中有一段作者写的注释如下:

Check the cache again because singleflight can only dedup calls
that overlap concurrently. It's possible for 2 concurrent
requests to miss the cache, resulting in 2 load() calls. An
unfortunate goroutine scheduling would result in this callback
being run twice, serially. If we don't check the cache again,
cache.nbytes would be incremented below even though there will
be only one entry for this key.

这段的意思是,singleflight.go中的Do方法是线程安全的,当并发请求进入Do的时候,支持只有一个goroutine去执行fn(实际去peer或者存储集群加载内容)方法。

但是对于load方法中的Do的调用,并没有线程安全的处理,所以当a、b两个goroutine,都因为miss cache,进入到load方法时,有以下情况:

  • 并发访问Do,Do能妥善处理
  • a访问Do,并返回;b也可以访问Do,所以作者在fn中加入了判断是否已经cache的逻辑

附上相关的学习资料
作者优化dl.google.com时的ppt
其他读者关于groupcache的理解
使用groupcache的例子

groupcache中load方法解析
Share this