面试-Redis 常见问题,后续面试遇到新的在补充
面试-Redis
1.谈谈Redis 缓存穿透,击穿,雪崩及如何避免
- 缓存穿透:是指大量访问请求在访问一个不存在的key,由于key 不存在,就会去查询数据库,数据库中也不存在该数据,无法将数据存储到redis 中,从而导致数据库压力增大。
解决方案:1.将空key 传入缓存中;2.对于这种访问可能由于遭到攻击引起,可以对请求进行身份鉴权、数据合法行校验等 - 缓存击穿:是指大量访问请求在访问同一个key时,key 过期了,导致大量请求去查询数据库,导致数据库压力增大。短时间大量请求可能会导致数据库崩溃。
解决方案:添加互斥锁或分布式锁,让一个线程去查询数据库,其他线程取缓存中的值。 - 缓存雪崩:是指在同一时间下,大量的key 失效或者缓存宕机,导致大量请求都去查询数据库,导致数据库压力增大。
解决方案:1.给每个key 的到期时间增加一个随机数,避免大量key 在同一时间过期;2.加上互斥锁,同一个key 只允许一个线程去查询数据库,其他线程等待查询后直接读取缓存数据库。
2.Redis 缓存与数据库数据不一致如何解决
可以采用新更新数据库后删除缓存的方式解决。(推荐)
理由:当A,B线程同时进入,A线程修改数据后执行删除缓存,B数据直接查询,如果此时A已经修改完成并删除缓存成功,B取缓存时取不到,则去查询数据库得到最新的数据。如果A修改完成,没有删除缓存,B取缓存成功,得到的是旧数据。但是后续A则会将缓存删除,B得到的旧数据也是暂时的(可以接收)。
3. Redis 过期策略和内存淘汰策略
-
Redis的过期策略
我们在set key的时候,可以给它设置一个过期时间,比如expire key 60。指定这key60s后过期。
以下是几种过期策略:1. 定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
2. 惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
3. 定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。
- Redis 内存淘汰策略
- lru:最近最少原则淘汰,该策略包含两种:
allkey:所有的Key都遵循该原则,volatile:只有设置了有效期的key才遵循这个原则- ttl:将所有设置了过期时间的key,淘汰最近将要过期的key
- random: 随机淘汰key,该策略包含两种:
allkey:所有的key都遵循该原则,volatile: 只有设置了有效期的key才遵循这个原则- no-enviction:默认策略,不淘汰key,内存不足就抛异常
4.Reids 持久化
Redis 持久化有两种策略方案,RDB和AOP,RDB是一种全量备份持久化的方案,AOP是一种增量备份的方案,两者配合使用。
AOP可以设置定期增量备份,也可以设置定次增量备份。