缓存穿透和缓存击穿是使用缓存系统必须考虑问题中的两个。这里不具体讨论解决方案,主要是想把缓存穿透和缓存击穿说清楚些,避免面试时候出现混淆。
什么情况算是缓存穿透?
个人理解,使用缓存就是为了减小数据库压力,让大部分的读请求都能落到缓存系统上。而只要请求穿过了缓存层,直接打到了数据库,我就把这个现象理解为缓存穿透。
什么情况会引起缓存穿透?
只要缓存失效了,就会出现缓存穿透,然后根据失效缓存数量的多少,划分出缓存击穿和缓存雪崩,比如热点key失效,高并发请求打到数据库,就是缓存击穿现象。比如大量key同时过期,相关的请求全部都被转发到数据库上,就是所谓的缓存雪崩了。还有就是如果一直请求的都是数据库不存在的数据,比如id为-1的商品数据,也会出现缓存击穿,这就算是恶意攻击了。
那缓存击穿又是什么?
热点key失效,高并发请求打到数据库,就是缓存击穿,缓存击穿可以理解成是缓存穿透的一种特殊情况,因为最后的结果也是请求直接打到数据库(为了解决缓存击穿导致的高并发请求冲垮数据库,一般都会加锁,让其他请求排队,等待第一个请求带回数据存入缓存,然后其他请求就直接去缓存里拿,保证数据库的安全可用,不过有时候想想。都是热点key了,说明爆款了,一家公司能有几个爆款,所以建议自信点,直接设置缓存永不过期,然后再想个保证数据库和缓存数据一致性的解决方案)。
总结
个人理解,缓存穿透和缓存击穿是包含关系,缓存击穿是缓存穿透的一种特殊场景。