🌟前言
对于Redis缓存击穿、缓存穿透、缓存雪崩在求职面试中是常问题目。但是看这个字面意思太难理解上述三种现象,而且特别容易混淆。本篇文章就引导思路来让大家彻底理解三种现象以及解决方案。
🌟通俗理解
大家可以这样理解:Key比作一个点。
缓存击穿可以联想到体育运动中的击剑,击中一次代表某个Key失效;(一个点)
缓存雪崩可以联想到雪山中的雪崩景象,一个雪球代表某个key,多个雪球滚落代表多个key失效;(多个点)
缓存穿透可以联想到王者荣耀中的护甲受到真实伤害,假设其中的护甲代表着由密集Key做成的,受到真实伤害代表着你这件护甲根本不存在。(密集点)
🌟缓存击穿
现象:某个热点Key缓存失效,已经过期。
思路引导:
- 设置热点Key永不过期:从缓存过期的角度出发,我们想到了一个解决方案那就是设置热点key用不过期。那如果每个热点key都设置时间用不过期,而redis又是基于内存存储缓存,那就会造成性能的下降;此外,如果后端更新这个热点key的数据,而用户在请求的时就会获取到旧的数据。虽然有其缺点,但是也有它的适用场景,那就是适合静态数据即不经常变动的数据。
- 定时任务更新缓存:针对第一种解决方案的缺点,我们可以在程序中设置一个定时任务,根据热点Key的访问规律来定期更新缓存数据。
- 互斥锁:通过只有一个线程获取到锁来解决缓存击穿。当一个请求从缓存中查找key时,如果获取到null,则会获取锁。获取成功后会从数据库查询数据,并写入缓存。
🌟缓存穿透
现象:热点数据在缓存中根本就不存在。
思路引导:
1.接口层增加数据合理性校验:比如接口地址中传入一个id为-1的商品ID,那肯定数据不存在的。所以从此出发,可以通过对接口参数值增加数据校验,防止别人恶意传参。
2. 设置NULL值:由于是缓存根本不存在,我们可以设置一个空值,来避免缓存穿透的发生。但是,空值太多往往会造成性能的下降。
3. 设置短点的过期时间:过期时间过短是不是会增大缓存击穿的风险呢。
4. 布隆过滤器:通过此过快速检查缓存中是否存在热点KEY。
🌟缓存雪崩
现象:多个热点KEY失效。
思路引导:
- 离散过期时间:多个热点key集体失效,可能是设置了相对集中或者相同过期时间的key,可以将过期时间设置的相对分散一些。
- 设置Key用不过期并定时任务更新缓存:设置Key永不过期并在程序中设置一个定时任务,根据热点Key的访问规律来定期更新缓存数据。
🌟总结
现象 | 缓存击穿 | 缓存穿透 | 缓存雪崩 |
描述 | 某个热点Key缓存失效,已经过期。 | 热点数据在缓存中根本就不存在。 | 多个热点KEY失效。 |
解决方案 | 1.设置热点Key永不过期; 2.定时任务更新缓存; 3.互斥锁。 |
1.接口层增加数据合理性校验; 2.设置NULL值; 3.设置短点的过期时间; 4.布隆过滤器。 |
1.离散过期时间; 2.设置Key用不过期并定时任务更新缓存。 |
🌟写在最后
有关于从思路上理解Redis缓存击穿、缓存穿透、缓存雪崩及解决方案到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。