MST

星途 面试题库

面试题:深度剖析Redis在MySQL读多写少场景下的缓存穿透、雪崩和击穿及解决方案

在Redis为MySQL读多写少场景提供缓存加速时,缓存穿透、雪崩和击穿是常见且棘手的问题。请深入分析这三个问题产生的原因,针对每个问题详细说明至少两种不同的解决方案,并阐述在不同业务规模和性能要求下,如何选择最合适的方案。
20.8万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

缓存穿透

  1. 产生原因
    • 客户端持续请求一个在数据库和缓存中都不存在的数据,导致请求直接穿透缓存到达数据库,对数据库造成压力。
  2. 解决方案
    • 布隆过滤器
      • 原理:布隆过滤器是一个二进制向量和一系列随机映射函数。当一个元素加入集合时,通过多个哈希函数将其映射到向量中的几个位置,将这些位置设为1。查询时,元素通过相同哈希函数映射,若对应位置不全为1,则元素一定不存在;若全为1,则大概率存在。
      • 优点:能快速判断数据是否存在,占用内存少。
      • 缺点:存在误判率,即可能把不存在的数据判断为存在。
    • 缓存空值
      • 原理:当数据库查询结果为空时,也将空值缓存起来,并设置较短的过期时间。后续相同请求直接从缓存获取空值,避免穿透到数据库。
      • 优点:实现简单。
      • 缺点:可能会浪费一定的缓存空间,且空值过期后仍可能出现穿透。
  3. 方案选择
    • 业务规模小,性能要求不高:缓存空值实现简单,可优先考虑。
    • 业务规模大,性能要求高:布隆过滤器能有效减少数据库压力,即使有误判率,整体性能提升明显,应选择布隆过滤器。

缓存雪崩

  1. 产生原因
    • 大量缓存数据在同一时间过期,导致大量请求同时穿透缓存到达数据库,使数据库负载瞬间过高,甚至崩溃。
  2. 解决方案
    • 设置不同过期时间
      • 原理:对不同的缓存数据设置随机的过期时间,避免大量数据同时过期。
      • 优点:实现简单,能有效分散过期时间。
      • 缺点:可能导致部分缓存数据过期时间过短,影响缓存命中率。
    • 使用二级缓存
      • 原理:一级缓存设置较短过期时间,二级缓存设置较长过期时间。当一级缓存过期,从二级缓存获取数据,同时更新一级缓存。
      • 优点:能在一定程度上保证数据的可用性,减少数据库压力。
      • 缺点:增加了缓存架构的复杂度,需要维护两级缓存。
  3. 方案选择
    • 业务规模较小,性能要求一般:设置不同过期时间简单易行,是较好选择。
    • 业务规模大,性能要求高:使用二级缓存虽复杂,但能更好地应对雪崩问题,可优先考虑。

缓存击穿

  1. 产生原因
    • 一个被高并发访问的热点数据在缓存过期的瞬间,大量请求同时穿透缓存访问数据库,导致数据库压力瞬间增大。
  2. 解决方案
    • 互斥锁
      • 原理:在缓存过期时,只有一个请求能获取到互斥锁,去查询数据库并更新缓存,其他请求等待。当缓存更新后,其他请求再从缓存获取数据。
      • 优点:实现相对简单,能有效防止高并发请求同时访问数据库。
      • 缺点:可能存在线程阻塞,影响系统性能。
    • 热点数据永不过期
      • 原理:对热点数据不设置过期时间,通过后台线程定时更新数据,或在数据发生变化时主动更新缓存。
      • 优点:避免了缓存过期瞬间的高并发问题。
      • 缺点:可能导致数据一致性问题,且后台更新逻辑需处理好。
  3. 方案选择
    • 业务规模小,性能要求不高:互斥锁实现简单,能满足需求。
    • 业务规模大,性能要求高:热点数据永不过期能更好地保证性能,但要处理好数据一致性问题,可优先选择。