面试系列Redis:缓存穿透、击穿、雪崩的解决方案

问题1:缓存穿透

缓存穿透是指缓存和数据库上都没有的数据,导致所有请求都落到数据库上,造成数据库短时间内承受大量的请求而导致宕机

解决:

  1. 使用布隆过滤器:将查询的参数都存储到一个 bitmap 中,在查询缓存前,如果 bitmap 存在则进行底层缓存的数据查询,如果不存在则进行拦截,不再进行缓存的数据查询
  2. 缓存空对象:如果数据库查询的为空,则依然把这个数据缓存并设置过期时间,当多次访问的时候可以直接返回结果,避免造成多次访问数据库,但要保证当数据库有数据时及时更新缓存。

问题2:缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),就会导致所有请求都落到数据库上,造成数据库段时间内承受大量的请求而宕机

解决:

  1. 设置热点数据永不过期
  2. 可以使用互斥锁更新,保证同一进程中针对同一个数据不会并发请求到 DB,减小DB的压力
  3. 使用随机退避方式,失效时随机 sleep 一个很短的时间,再次查询,如果失败再执行更新

问题3:缓存雪崩

缓存雪崩是指大量缓存同一时间内大面积失效,后面的请求都会落到数据库上,造成数据库段时间无法承受大量的请求而宕掉

解决:

  1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个Key只允许一个线程查询和写缓存,其他线程等待
  2. 通过缓存 reload 机制,预先去更新缓存,在即将发生高并发访问前手动触发加载缓存
  3. 对于不同的key设置不同的过期时间,让缓存失效的时间点尽量均匀,比如我们可以在原有的失效时间基础上增加一个随机值,比如1~5分钟随机,这样每一个缓存的过期时间的重复率就会降低。
  4. 设置二级缓存,或者双缓存策略。

你可能感兴趣的:(技术面试,redis)