缓存穿透、击穿、雪崩

缓存穿透

1
2
3
key对应的数据在数据源中并不存在,每次针对此key的请求从缓存中获取不到,请求都会压到数据源,从而可能压垮数据源。

比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

image-20220116205919743

解决方案

1
2
3
4
1.对空值缓存
2.设置白名单
3.采用布隆过滤器
4.进行实时监控

缓存击穿

1
key对应的数据存在,但在redis中过期,此时又有大量的并发请求,而这些请求发现缓存过期又会从DB中加载并设到缓存,这个时候可能会把DB压垮

image-20220116210315495

解决方案

1
2
3
1. 预先设置热门数据
2. 调整时长
3. 使用同步锁,在缓存失效并且面对大量请求时,只让一个请求去数据库请求数据并设到缓存中,其他请求等待这个请求缓存后的结果。

image-20220116210530279

缓存雪崩

1
在缓存击穿的基础上有更多的key值过期

image-20220116210639894

解决方案

1
2
3
1.多级缓存架构 nginx缓存+redis缓存+其他缓存
2.使用锁或队列,让请求在可承受范围内访问DB,并设到缓存中方便其他请求使用
3.将缓存失效时间分散开

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!