单纯记笔记而已
缓存穿透
读请求的数据不存在,因此每次发送都会数据库查询,数据库null,所以下次依旧会打到数据库
重点是: 数据根本不存在
- 使用singlefilight缓解问题
- 知道没有数据,缓存未命中直接返回
- 缓存里面有全量数据,未命中直接返回
- 布隆过滤器,bit array等结构,未命中在问一次
- 缓存没有,不查询数据库返回默认值
- 限流器
缓存击穿
缓存中没有,数据库中存在
非常高的请求,都没有命中,一瞬间都去数据库中查询
- 使用singlefilight缓解问题
- 缓存未命中,使用默认值
- 在回查数据的时候,加上限流器
缓存雪崩
同一时间,大量的key过期,查询都要查询数据库
都是大量的请求落到了数据库上
- 在设置过期时间的时候增加一个随机变量的时间
所以要在缓存出现问题的时候,这些请求不放在数据库上?
singleflight
在有多个goroutine请求同一个key对应的数据时,只允许一个过去,其他都在原地等待结果
布隆过滤器
不存在key1 去询问布隆过滤器,
- 如果有则查询数据库-可能会假阳性
- 如果不存在就不查询