groupcache源码阅读(三)——防止缓存惊群效应
本文最后更新于:2024年7月6日 早上
缓存惊群效应
惊群效应问题有时被称为缓存击穿,穿透或者雪崩效果。从本质上讲,就像是使系统不堪重负的大量请求。
缓存雪崩:缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。缓存雪崩通常因为缓存服务器宕机、缓存的 key 设置了相同的过期时间等引起。
缓存击穿:一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到 DB ,造成瞬时DB请求量大、压力骤增。
缓存穿透:查询一个不存在的数据,因为不存在则不会写到缓存中,所以每次都会去请求 DB,如果瞬间流量过大,穿透到 DB,导致宕机。
singleflight解析
groupcache 中的singleflight
模块就是用来专门解决缓存惊群效应的,话不多说我们来看看源代码的实现逻辑。
Group
1 |
|
Group
是singleflight
的最主要的数据结构,管理不同 key 的请求(call),保证在上一次缓存结果没有关系前,本地不会发送更多的请求。当然也可以理解为,是本地的访问任务调度中心。
call
1 |
|
call是每个key从远端节点获取数据的正在进行中,或已经结束的请求。使用 sync.WaitGroup
锁避免重入。
Do
1 |
|
通过Do方法的调用,就是实现group内多个协程并发的请求的限制,有效的防止了高并发情况下,本出现内多个协程,同时对同一个key想远端节点发起大量不必要的请求。
singleflight总结
现在读完一遍源码,我们再来审视singleflight
这个命名的含义——singleflight(单次航班)——言下之意,针对相同的货物(key缓存数据)运输请求,我们将只发起一次飞行计划(HTTP的远端节点访问)。