redis面试篇-01一文搞懂雪崩、穿透、击穿、预热
你知道什么是缓存雪崩吗?你知道什么是缓存穿透吗?你知道redis的持久化机制是什么吗?redis作为缓存数据库在项目中大量使用,在面试时,被问到的几率也非常高频。今天,我就带大家从这几个问题出发,了解下redis。
1.什么是缓存雪崩?
日常开发中,为了节省内存空间,redis的key值会设置过期时间。一旦大量的redis缓存过期,所有的请求全部怼到数据库(mysql默认最大连接数,看版本),就会把数据库搞挂掉(如下图所示),这就是缓存雪崩。

怎么解决缓存雪崩呢?
1.设置热点数据永不过期
2.数据访问加互斥锁,每次只允许一个用户访问

3.缓存降级策略,比如:redis缓存失效,还有本地缓存,本地缓存之后才是mysql
4.缓存失效时间分散化,防止集中失效:
将缓存的key值先罗列到纸上,然后对key值时间进行规划,分散开来
将缓存的key值失效时间,加上一个随机数,进行分散。
2.什么是缓存穿透?
如果一个key值,它在redis与数据库都不存在时,如果一个黑客利用这个key值,进行高并发访问,就会搞垮数据库,称为缓存穿透。

1.当这个key值不存在时,先临时将null或者空字符写入到redis中,过期时间设置的短一些,几分钟以内。
2.将数据库所有的结果放到布隆过滤器里,布隆过滤器结果只存0与1,当0时,代表数据库没有数据。直接拒绝查询。
3.什么是缓存击穿?
当一个key值过期时,请求激增,大量的请求把数据库搞垮。
怎么解决缓存击穿?
1.热点数据设置永不过期
2.从数据库读取key值并更新到缓存使用排它锁,同一时间只允许一个线程操作。其他线程进入睡眠状态,被唤醒获取到锁后,先检测缓存是否有数据,有数据直接返回。
4.什么是缓存预热
就是系统上线后手动去加载数据到缓存中,避免等客户请求时,再去加载数据
解决办法:
1.写个缓存刷新页面,手工操作
2.定时任务去刷新缓存
3.数据量不大的情况可以在系统启动时,直接加载
5.缓存淘汰策略有哪些
redis缓存淘汰策略可以分为如下:
1.定时清理过期的缓存
2.用户请求过来时,判断缓存是否过期,过期就从源数据取数据并更新缓存