缓存穿透
缓存穿透:大量请求请求命中率低;一般指查询不存在的数据,缓存层和存储层都不会命中。流程示意图如下:
影响
缓存穿透将导致不存在的数据每次请求都到存储层,失去缓存保护后端的意义。是后端的负载加大,可能造成宕机。
统计指标:
- 总调用数
- 缓存层命中数
- 存储层命中数
如发现大量存储层空命中,即可能出现了缓存穿透。
引起原因
- 自身业务代码或数据出现问题
- 一些恶意攻击、爬虫等造成大量空命中
解决方法
- 缓存空对象:即当存储层不命中,也将空对象存储至缓存层
- 存在的问题:
- 空置做缓存,需要增加更多的内存空间,如果是攻击,内存使用量会更大;一般可设置一个较短的过期时间,让其自动过期。
- 缓存层与存储层时间差,导致数据不一致情况
- 存在的问题:
- 布隆过滤器拦截:在访问缓存层和存储层之前,将存在的 key 用布隆器存储起来,做第一层拦截。
对比
**
解决缓存穿透 | 使用场景 | 维护成本 |
---|---|---|
缓存空对象 | - 数据命中不高 - 数据频繁变化实时性高 |
- 代码维护简单 - 需要过多的缓存空间 - 数据不一致 |
布隆过滤器 | - 数据命中不高 - 数据相对固定,实时性低 |
- 代码维护复杂 - 缓存空间占用少 |