0%

redis面试八股文

redis的常见面试问题

什么是缓存击穿

一个访问量比较大的key,缓存过期,导致所有请求直接打到DB上。

解决方案

1. 加锁更新: 就是写缓存逻辑加排它锁,只有一个线程去访问db获取缓存内容写缓存。 
1. 将过期时间组合写到value中,通过异步方式不断更新缓存内容刷新过期时间,防止此类现象。 (线上一般很少使用这种方式) 

什么是缓存穿透

缓存穿透是指:查询缓存和数据库中都不存在的数据。 这样每次请求都直接打到数据库。 就好像缓存不存在

导致问题: 不存在的数据每次请求都要到存储层查询,失去了缓存保护后端存储的意义。

原因:

  1. 业务代码有问题

     2. 恶意攻击,爬虫造成空命中。
    

解决方案:

  1. 缓存空值/默认值

    1. 这种方式是在数据库不命中情况把一个空值,或者默认值保存到缓存,之后再访问这个数据就会从缓存中获取,保护了数据库

    缓存空值会造成的问题:

    1. 空值被缓存,意味这缓存层需要更多的内存空间,有效解决办法: 这类缓存设置一个较短的过期时间,让其自行删除。 
    2. 缓存层和db层数据会有一段时间的不一致,可能对业务有一定影响。 解决方案: 利用消息队列或者其他异步方式清理缓存中的空对象。 
    
  2. 布隆过滤器方案:

    1. 可以在存储和缓存之前加一个布隆过滤器,做一层过滤。 布隆过滤器会保存数据是否存在,如果判断是不不存在直接返回,就不会访问存储

缓存雪崩

在某一时刻 发生大规模的缓存失效情况。 例如缓存服务宕机,大量key在同一时间过期。 这样的后果就是大量请求进来直接打到db上,可能导致整个系统的崩溃。 称为雪崩。

缓存雪崩是三大缓存问题中最严重的

预防和处理:

  • 提高缓存可用性
    1. 集群部署:通过集群提升缓存的可用性
    2. 多级缓存:设置多级缓存。 第一级缓存失效的情况下访问第二级缓存,每一级缓存失效时间都不同。
  • 过期时间调整
    1. 均匀过期: 为了避免大量缓存同一时间过期,可以把不同key的过期时间随机生成,避免过期时间太过集中。
    2. 热点数据永不过期。
  • 熔断降级
    1. 服务熔断: 当缓存服务宕机或者响应超时,为了防止整个系统出现雪崩,暂时停止业务服务访问缓存系统。
    2. 服务降级: 当出现大量缓存失效,而且处于高并发高负荷的情况下,在业务逻辑内部舍弃一些非核心接口和数据的请求。 直接返回一个提前准备好的 fallback(退路) 错误处理信息

Welcome to my other publishing channels