MST

星途 面试题库

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

假设在高并发场景下,分布式缓存中的大量数据同时过期,引发缓存雪崩,导致数据库压力剧增。请详细描述你会采取哪些措施来预防和应对缓存雪崩问题,包括但不限于缓存过期时间的设置策略、缓存架构的优化等方面。
33.0万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

预防措施

  1. 设置随机过期时间
    • 避免大量缓存同时过期。在设置缓存过期时间时,给每个缓存项的过期时间添加一个随机值。例如,原本设置过期时间为60分钟,可以改为55到65分钟之间的随机值。这样可以使缓存过期时间分散,降低同时过期的可能性。
  2. 使用多级缓存架构
    • 一级缓存:使用速度快但容量相对较小的缓存,如本地缓存(如Guava Cache),可以快速响应请求,减少对二级缓存和数据库的访问压力。
    • 二级缓存:采用分布式缓存,如Redis。当一级缓存未命中时,再去二级缓存中查找。如果二级缓存也未命中,才去访问数据库。这样即使二级缓存中的部分数据过期,一级缓存仍可能提供数据,减轻数据库压力。
  3. 缓存预热
    • 在系统上线前,提前将部分热点数据加载到缓存中,并设置合理的过期时间。这样系统启动后,这些数据已经在缓存中,不会因大量请求同时查询未缓存数据而导致数据库压力剧增。可以通过数据初始化脚本或者定时任务来实现缓存预热。
  4. 限流与降级
    • 限流:对进入系统的请求进行限流,例如使用令牌桶算法或漏桶算法。限制单位时间内访问数据库的请求数量,防止因大量请求瞬间涌入而拖垮数据库。
    • 降级:当系统压力过大时,对一些非核心业务进行降级处理,如返回默认数据、空数据或者简单的提示信息,优先保证核心业务的正常运行。

应对措施

  1. 缓存重建策略
    • 异步重建:当缓存过期后,不直接去查询数据库,而是启动一个异步任务去重建缓存。在异步任务重建缓存的过程中,返回旧数据(如果有设置缓存永不过期的备份数据)或者默认数据给客户端,减少对数据库的直接访问压力。例如可以使用消息队列(如Kafka)来触发缓存重建任务,将过期缓存的标识发送到消息队列,由消费者去重建缓存。
    • 双写策略:在更新数据库数据的同时,更新缓存。并且采用延时双删策略,即先删除缓存,再更新数据库,然后延迟一段时间再次删除缓存,以防止在更新数据库和再次删除缓存之间,有新的请求读取到旧的缓存数据。
  2. 监控与报警
    • 监控:通过监控工具(如Prometheus + Grafana)实时监控缓存的命中率、过期数据量、数据库的负载等指标。当缓存命中率急剧下降或者过期数据量达到一定阈值时,及时发现缓存雪崩的迹象。
    • 报警:设置合理的报警规则,一旦监控指标触发报警条件,通过邮件、短信等方式通知运维和开发人员,以便及时采取应对措施。
  3. 数据库优化
    • 读写分离:将数据库的读操作和写操作分离到不同的数据库实例上,减轻主数据库的压力。在缓存雪崩场景下,大量的读请求可以由从数据库来处理。
    • 数据库连接池优化:合理配置数据库连接池的参数,如最大连接数、最小连接数、连接超时时间等,确保数据库能够高效地处理请求,避免因连接资源耗尽而导致系统崩溃。