缓存穿透,缓存击穿,缓存雪崩

226 阅读2分钟

缓存穿透

概念

查询一个缓存中不存在的key,由于缓存未命中,逻辑判断是去查询数据库,但是数据库也无次记录,这将导致每次请求这个不存在的key时,后端服务都要去存储层去查询,一方面是增大了数据库压力,另一方面每次都要去数据库查询,也失去了缓存的意义

风险

如果恶意攻击者利用不存在的数据进行频繁攻击,数据库的瞬时压力会增大,可能会导致系统崩掉

解决办法

可以在处理缓存时,将不存在的key的value值设为null写入缓存,并设置一个短暂过期时间

image.png

缓存雪崩

概念

批量key同一时间过期,导致缓存在某一时刻同时失效,请求全部转发到DB,数据库瞬时压力增大

风险

数据库的瞬时压力会增大,可能会导致系统崩掉

解决办法

可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件

image.png

缓存击穿

概念

缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存

风险

大并发的请求可能会瞬间把后端DB压垮

解决办法

image.png 对于单机程序,甚至可以考虑使用本地锁,性能甚至更好,但是对于分布式应用来说,还是需要使用上述四种方法

备注: 对于缓存击穿和缓存雪崩来说,区别就是缓存击穿针对的一个key,缓存雪崩针对的是批量key