MST

星途 面试题库

面试题:缓存设计之高级难度:缓存雪崩场景下的优化策略

假设在高并发系统中发生了缓存雪崩,大量缓存同时过期,数据库瞬间承受巨大压力。请详细描述你会如何从缓存过期时间设置、缓存架构设计、系统容灾等多个方面进行优化,以避免或减轻缓存雪崩带来的影响。
35.5万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存过期时间设置

  1. 随机过期时间
    • 避免所有缓存设置相同的过期时间。对于一批相似的数据,在一个合理的时间区间内设置随机的过期时间。例如,原本所有缓存过期时间为60分钟,可以改为在50 - 70分钟之间随机设置过期时间。这样可以分散缓存过期的时间点,防止大量缓存同时过期。
  2. 定期更新与续约
    • 定期更新:对于一些重要且不经常变化的数据,可以设置一个后台任务,定时(如每30分钟)去更新缓存数据,而不是依赖缓存自然过期。这样在缓存过期前就已经完成数据的更新,保证数据的连贯性。
    • 续约机制:当缓存被访问时,如果距离过期时间较近(如剩余时间小于10%),可以自动延长缓存的过期时间,例如延长当前剩余时间的50% ,从而减少缓存过期的频率。

缓存架构设计

  1. 多级缓存架构
    • 本地缓存:在应用服务器本地使用如Guava Cache等作为一级缓存。对于一些高频访问且数据量较小的数据,直接从本地缓存获取,减少对分布式缓存的压力。本地缓存具有访问速度快的特点,可以快速响应部分请求,降低整体系统的响应时间。
    • 分布式缓存:如Redis作为二级缓存,用于存储大量数据。当本地缓存未命中时,再从分布式缓存获取数据。多级缓存架构可以将请求分散,降低单个缓存层的压力,并且通过本地缓存的快速响应,提升整体系统性能。
  2. 缓存集群与负载均衡
    • 缓存集群:采用Redis Cluster等缓存集群方案,将数据分布在多个节点上。这样不仅可以提高缓存的存储容量,还能通过节点的并行处理能力,提升缓存的读写性能。
    • 负载均衡:使用如Nginx等负载均衡器,将请求均匀分配到各个缓存节点上。避免单个缓存节点因流量过大而出现性能瓶颈,保证缓存系统的稳定性和高可用性。

系统容灾

  1. 数据库连接池优化
    • 合理设置连接池参数:根据系统的并发量和数据库的承载能力,合理设置数据库连接池的最大连接数、最小连接数、最大等待时间等参数。例如,通过性能测试确定系统在高并发下,数据库连接池的最大连接数为200,最小连接数为50,最大等待时间为30秒。这样可以避免因连接数过多耗尽系统资源,或因连接数不足导致请求长时间等待。
    • 连接池监控与动态调整:建立对数据库连接池的监控机制,实时监测连接的使用情况、等待队列长度等指标。根据监控数据动态调整连接池参数,如在流量高峰期适当增加最大连接数,在流量低谷期减少连接数,以提高资源利用率。
  2. 熔断与降级
    • 熔断机制:引入Hystrix等熔断框架,当数据库请求失败率达到一定阈值(如50%)时,触发熔断。熔断后,后续请求不再直接访问数据库,而是快速返回一个预设的默认值或错误提示,防止大量无效请求持续占用数据库资源,避免数据库压力进一步增大。
    • 降级策略:对于一些非核心业务,可以进行降级处理。例如,在缓存雪崩时,关闭某些对数据实时性要求不高的业务功能,如一些统计报表的展示。将系统资源优先保障核心业务的正常运行,提升系统的整体可用性。
  3. 数据预加载与异步加载
    • 数据预加载:在系统启动时,或者在业务低峰期,提前将一些热点数据加载到缓存中。例如,电商系统在凌晨低峰期,将热门商品的信息预加载到缓存,这样在高峰期可以直接从缓存获取数据,减轻数据库压力。
    • 异步加载:对于一些缓存未命中的数据请求,可以采用异步方式从数据库加载数据并更新缓存。例如,使用消息队列(如Kafka)将缓存未命中的请求发送到队列中,由后台线程异步从数据库读取数据,更新缓存后再返回给客户端。这样可以避免同步操作对系统性能的影响,提升系统的并发处理能力。