Redis 高频面试题 2023 最新版
文章目录
- Redis 高频面试题 2023 最新版
- 一、Redis缓存相关
- 1. 什么是缓存穿透?如何解决
- 2. 什么是缓存击穿?如何解决
一、Redis缓存相关
1. 什么是缓存穿透?如何解决
是什么
缓存穿透就是根据某条件查询一个数据,首先进入到redis中进行查询,redis中没有该数据时进入到数据库中查询,但是在数据库中也没有查到该数据,这个时候数据库直接将没有查到数据这一结果返回,而没有将它缓存到redis中,导致每次按照该条件查询都会进入到数据库中查询,这,就是缓存穿透;
穿透过Redis,去数据库中查数据
解决方案一:
缓存空数据,按照某一条件查询的数据为空,将这个结果缓存到redis中,这样下次来查询进入到redis就能够查到该数据;
缺点:可能会出现数据不一致问题,当数据库中的值更新时,redis中的数据可能没有进行更新;
解决方案二:
- 根据某条件查询信息时,先去布隆过滤器中查询,如果布隆过滤器中存在该数据,则往下走进入redis中去查询数据,如果布隆过滤器中没有值则直接返回;
- redis中如果能够查询得到结果,则返回结果,查询不到进入数据库中进行查询;
- 数据库查询到结果并返回,而且会将结果缓存在Redis中一份;
解释说明:
布隆过滤器
- 缓存热点数据时,需要向布隆过滤器添加率数据;
- 布隆过滤器的主要作用:拦截不存在的数据;
布隆过滤器的实现
bitmap(位图): 相当于是以一个(bit)为单位的数组,数组中每个单元只能存储二进制数0或1;
布隆过滤器能够检索一个元素是否存在这个集合中
存储数据到bitmap中:
误判问题
到bitmap中查询某值是否存在,经过三次hash函数计算出结果,发现在bitmap中有存有了值,布隆过滤器便认为已经存储过该值,当你实际上是没存储过的;
误判率: 数组越小误判率越大,数组越大误判率就越小,但是同时带来了更多的内存消耗; 无法避免,可以控制,一般控制在5%左右;
布隆过滤器的两种实现方案:
- Redission
- Guava
2. 什么是缓存击穿?如何解决
是什么
缓存击穿
指的是给某个热点key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求,这些并发请求瞬间把DB给压垮
击穿的是谁?击穿的是
数据库
解决方案一:添加互斥锁(分布式锁)
- 线程1去Redis中查找数据,没有找到,此时线程二也在进行Redis查询数据,也没有找到
- 然后在此处添加互斥锁,这里假设线程1成功获取了互斥锁,然后他会去数据库中查数据并且将查询到的结果写入Redis中,完成这些操作才会释放同步锁;
- 而线程2获取互斥锁失败,会设置它休眠一段时间再去重新读取Redis中的数据,如果还没有在Redis中找到数据,它就会重复执行 查数据、获取锁等操作,直到找到Redis中的数据为止;
此方案的优缺点
:优点是保证了数据的强一致性,缺点是性能较差
方案二:逻辑过期(不设置过期时间)
- 线程1去缓存中进行查询,发现逻辑时间已经过期,它就会去获取互斥锁,并去开启新线程;然后就会将这个过期的数据进行返回;
- 新开启的线程负责查询数据库重建缓存数据,并在写入缓存时重置逻辑过期时间,完成这些操作后才会释放锁;
- 此时线程三如果查询缓存发现数据逻辑时间已过期,会尝试去获取互斥锁,但线程1以拿到互斥锁,因此线程三获取互斥锁失败;但也会返回这个查询到的逻辑时间已过期的内容;
- 线程一、二 完成了换成数据重建时,线程四刚好进来,就能够查询到正常的数据,并正常返回
优缺点:
优点是高可用,性能较优,但是无法保证数据的强一致性(过期数据会被返回);
保证了高可用,性能比较优,单不能保证数据的绝对一致性;