MST

星途 面试题库

面试题:缓存设计:Redis缓存雪崩应对策略

假设大量的缓存数据在同一时间过期,导致系统瞬间大量请求直接打到数据库,即缓存雪崩问题。阐述在后端开发中,针对Redis的缓存雪崩,有哪些有效的预防和应对策略,并分析每种策略的优缺点。
25.9万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

预防和应对策略及优缺点分析

  1. 设置随机过期时间
    • 策略:在设置缓存过期时间时,不使用固定的过期时间,而是设置一个随机的过期时间范围,例如原本过期时间为60分钟,现在设置为55 - 65分钟之间的随机值。这样可以避免大量缓存同时过期。
    • 优点:实现简单,无需引入额外复杂的机制,能有效分散缓存过期时间,降低缓存雪崩的风险。
    • 缺点:只是降低风险,无法完全杜绝缓存雪崩情况。如果系统流量波动较大,可能仍然无法应对短时间内大量缓存过期的情况。
  2. 使用二级缓存
    • 策略:采用两层缓存结构,如第一层使用Redis,第二层可以使用本地缓存(如Guava Cache)。当请求到达时,先从本地缓存获取数据,如果没有命中再从Redis获取。从Redis获取到数据后,同时放入本地缓存。当Redis中的缓存过期时,由于本地缓存的存在,部分请求仍可从本地缓存获取数据,不会直接打到数据库。
    • 优点:能在一定程度上缓解数据库压力,因为即使Redis缓存过期,本地缓存还能提供部分数据。并且本地缓存读取速度更快,能提升系统整体性能。
    • 缺点:增加了系统复杂度,需要管理两级缓存的一致性,如数据更新时需要同时更新两级缓存。同时本地缓存存在内存限制,不能缓存大量数据。
  3. 缓存过期时间续约
    • 策略:在业务代码中监听缓存过期事件,当某个缓存即将过期时,开启一个异步任务去续约该缓存的过期时间,例如在过期前10分钟进行续约操作。
    • 优点:能保证关键数据的缓存一直有效,极大地降低缓存雪崩的可能性,并且对业务侵入相对较小。
    • 缺点:需要额外的监听和异步任务处理机制,增加了系统的复杂性。如果异步任务处理不当,可能会出现续约失败的情况。同时,续约操作可能会导致Redis的过期时间管理变得复杂。
  4. 使用互斥锁
    • 策略:当缓存过期后,在多个请求尝试读取数据并重建缓存时,只允许一个请求去查询数据库并更新缓存,其他请求等待。可以使用Redis的SETNX(SET if Not eXists)命令实现互斥锁。获取锁的请求去查询数据库并更新缓存,释放锁后,其他等待的请求从缓存中获取数据。
    • 优点:能有效防止大量请求同时查询数据库,避免数据库瞬间压力过大。实现相对简单,基于Redis的基本命令即可完成。
    • 缺点:可能会导致部分请求等待时间过长,影响系统的响应性能。而且如果锁的释放逻辑处理不当,可能会出现死锁问题,导致其他请求一直等待。
  5. 服务熔断与降级
    • 策略:在系统架构层面,引入服务熔断和降级机制。当检测到数据库压力过大,如数据库连接池耗尽、响应时间过长等情况时,触发服务熔断,暂时停止对数据库的请求,直接返回降级数据,如默认值、缓存中的旧数据等。等数据库压力恢复后,再恢复正常请求。
    • 优点:能保证系统在极端情况下的可用性,避免数据库被压垮导致整个系统崩溃。同时可以通过灵活配置降级策略,根据业务场景返回合适的数据。
    • 缺点:可能会返回非最新数据,影响业务准确性。并且需要额外的熔断和降级控制组件,增加系统架构复杂度,配置不当可能导致误熔断或降级不合理的情况。