Redis 高频面试题 2023 最新版

Redis 高频面试题 2023 最新版

文章目录

  • Redis 高频面试题 2023 最新版
  • 一、Redis缓存相关
    • 1. 什么是缓存`穿透`?如何解决
    • 2. 什么是缓存`击穿`?如何解决
    • 3. 什么是缓存`雪崩`?如何解决


一、Redis缓存相关

1. 什么是缓存穿透?如何解决

是什么
缓存穿透就是根据某条件查询一个数据,首先进入到redis中进行查询,redis中没有该数据时进入到数据库中查询,但是在数据库中也没有查到该数据,这个时候数据库直接将没有查到数据这一结果返回,而没有将它缓存到redis中,导致每次按照该条件查询都会进入到数据库中查询,这,就是缓存穿透;

穿透过Redis,去数据库中查数据

Redis 高频面试题 2023 最新版_第1张图片
解决方案一:
缓存空数据,按照某一条件查询的数据为空,将这个结果缓存到redis中,这样下次来查询进入到redis就能够查到该数据;
缺点:可能会出现数据不一致问题,当数据库中的值更新时,redis中的数据可能没有进行更新;

解决方案二:

  1. 根据某条件查询信息时,先去布隆过滤器中查询,如果布隆过滤器中存在该数据,则往下走进入redis中去查询数据,如果布隆过滤器中没有值则直接返回;
  2. redis中如果能够查询得到结果,则返回结果,查询不到进入数据库中进行查询;
  3. 数据库查询到结果并返回,而且会将结果缓存在Redis中一份;

Redis 高频面试题 2023 最新版_第2张图片


解释说明:

布隆过滤器

  • 缓存热点数据时,需要向布隆过滤器添加率数据;
  • 布隆过滤器的主要作用:拦截不存在的数据;

布隆过滤器的实现

bitmap(位图): 相当于是以一个(bit)为单位的数组,数组中每个单元只能存储二进制数0或1;
布隆过滤器能够检索一个元素是否存在这个集合中

存储数据到bitmap中:
Redis 高频面试题 2023 最新版_第3张图片

误判问题
到bitmap中查询某值是否存在,经过三次hash函数计算出结果,发现在bitmap中有存有了值,布隆过滤器便认为已经存储过该值,当你实际上是没存储过的;

Redis 高频面试题 2023 最新版_第4张图片

误判率: 数组越小误判率越大,数组越大误判率就越小,但是同时带来了更多的内存消耗; 无法避免,可以控制,一般控制在5%左右;

布隆过滤器的两种实现方案:

  • Redission
  • Guava

2. 什么是缓存击穿?如何解决

是什么
缓存击穿指的是给某个热点key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求,这些并发请求瞬间把DB给压垮

击穿的是谁?击穿的是数据库

Redis 高频面试题 2023 最新版_第5张图片

解决方案一:添加互斥锁(分布式锁)

  1. 线程1去Redis中查找数据,没有找到,此时线程二也在进行Redis查询数据,也没有找到
  2. 然后在此处添加互斥锁,这里假设线程1成功获取了互斥锁,然后他会去数据库中查数据并且将查询到的结果写入Redis中,完成这些操作才会释放同步锁;
  3. 而线程2获取互斥锁失败,会设置它休眠一段时间再去重新读取Redis中的数据,如果还没有在Redis中找到数据,它就会重复执行 查数据、获取锁等操作,直到找到Redis中的数据为止;

此方案的优缺点:优点是保证了数据的强一致性,缺点是性能较差

Redis 高频面试题 2023 最新版_第6张图片

方案二:逻辑过期(不设置过期时间)

  1. 线程1去缓存中进行查询,发现逻辑时间已经过期,它就会去获取互斥锁,并去开启新线程;然后就会将这个过期的数据进行返回;
  2. 新开启的线程负责查询数据库重建缓存数据,并在写入缓存时重置逻辑过期时间,完成这些操作后才会释放锁;
  3. 此时线程三如果查询缓存发现数据逻辑时间已过期,会尝试去获取互斥锁,但线程1以拿到互斥锁,因此线程三获取互斥锁失败;但也会返回这个查询到的逻辑时间已过期的内容;
  4. 线程一、二 完成了换成数据重建时,线程四刚好进来,就能够查询到正常的数据,并正常返回

优缺点: 优点是高可用,性能较优,但是无法保证数据的强一致性(过期数据会被返回);

Redis 高频面试题 2023 最新版_第7张图片
保证了高可用,性能比较优,单不能保证数据的绝对一致性;

3. 什么是缓存雪崩?如何解决

缓存雪崩指的是在同一时间段内大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,给数据库带来巨大的压力
Redis 高频面试题 2023 最新版_第8张图片

可能的原因:给key设置了相同的过期时间

解决方案:

  • 给不同的key的过期时间设置随机值
  • 利用Redis集群提高服务的可用性哨兵模式,集群模式
  • 给缓存业务添加降级限流策略 (可以借助nginx、spring cloud gateway完成,并且降级可作为系统的保底策略,适用于击穿、穿透、雪崩
  • 给业务添加多级缓存(结合Guava与Caffeine)

你可能感兴趣的:(面试题汇总,redis,数据库,缓存)