面试-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可以设置定期增量备份,也可以设置定次增量备份。

你可能感兴趣的:(redis,面试,数据库)