缓存穿透
概念
查询一个缓存中不存在的key,由于缓存未命中,逻辑判断是去查询数据库,但是数据库也无次记录,这将导致每次请求这个不存在的key时,后端服务都要去存储层去查询,一方面是增大了数据库压力,另一方面每次都要去数据库查询,也失去了缓存的意义
风险
如果恶意攻击者利用不存在的数据进行频繁攻击,数据库的瞬时压力会增大,可能会导致系统崩掉
解决办法
可以在处理缓存时,将不存在的key的value值设为null写入缓存,并设置一个短暂过期时间
缓存雪崩
概念
批量key同一时间过期,导致缓存在某一时刻同时失效,请求全部转发到DB,数据库瞬时压力增大
风险
数据库的瞬时压力会增大,可能会导致系统崩掉
解决办法
可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件
缓存击穿
概念
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存
风险
大并发的请求可能会瞬间把后端DB压垮
解决办法
对于单机程序,甚至可以考虑使用本地锁,性能甚至更好,但是对于分布式应用来说,还是需要使用上述四种方法
备注: 对于缓存击穿和缓存雪崩来说,区别就是缓存击穿针对的一个key,缓存雪崩针对的是批量key