MST

星途 面试题库

面试题:复杂场景下缓存设计的失效策略融合

在一个具有多级缓存架构(如浏览器缓存、CDN缓存、应用服务器本地缓存、分布式缓存)的大型互联网系统中,涉及多种类型数据(如用户个性化配置、静态资源、动态业务数据)。请设计一套综合运用时间驱动和事件驱动缓存失效策略的方案,以优化系统性能、保证数据一致性,并详细说明设计思路和可能面临的挑战及解决方案。
22.7万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 时间驱动策略
    • 用户个性化配置:由于此类数据更新频率相对较低,但对一致性要求较高。可以设置一个较长的缓存时间,例如24小时。在缓存时间到期后,从数据源重新获取数据并更新缓存。
    • 静态资源:如图片、CSS、JS文件等,这些资源变动极少。可以设置一个非常长的缓存时间,比如一年。通过版本控制机制,当资源内容发生变化时,更新资源的版本号,使客户端能够获取到新的资源。
    • 动态业务数据:这类数据更新频率较高,缓存时间设置相对较短,例如几分钟。根据业务场景的不同,可以调整缓存时间,以平衡性能和数据一致性。
  2. 事件驱动策略
    • 用户个性化配置:当用户在系统中修改了自己的配置信息时,通过消息队列(如Kafka)发送一条配置更新的消息。各级缓存监听到该消息后,立即失效对应的缓存数据,下次请求时重新从数据源获取最新数据。
    • 静态资源:当静态资源更新时,同样通过消息队列发送更新消息。CDN和浏览器缓存可以通过HTTP头信息(如ETag、Last - Modified)来判断资源是否已更新,若已更新则重新获取资源。应用服务器本地缓存和分布式缓存则直接失效相关缓存。
    • 动态业务数据:在业务数据发生变化(如订单状态更新、库存变化等)时,通过消息队列发布事件。各级缓存接收到事件后,失效对应的缓存数据。

可能面临的挑战及解决方案

  1. 缓存雪崩
    • 挑战:如果大量缓存同时过期(时间驱动策略下),可能导致瞬间大量请求直接打到数据源,使数据源负载过高甚至崩溃。
    • 解决方案:为缓存设置随机的过期时间,避免所有缓存同时过期。例如,将原本设置为10分钟过期的缓存,在9 - 11分钟之间随机设置过期时间。
  2. 缓存穿透
    • 挑战:恶意请求访问不存在的数据,每次请求都绕过缓存直接访问数据源,可能导致数据源压力过大。
    • 解决方案:使用布隆过滤器,在缓存之前对请求的数据进行过滤。如果布隆过滤器判断数据不存在,则直接返回,不再访问数据源。同时,将不存在的数据也缓存起来,设置较短的过期时间,避免重复查询数据源。
  3. 消息队列可靠性
    • 挑战:事件驱动策略依赖消息队列,如果消息队列出现故障,可能导致缓存无法及时失效,造成数据不一致。
    • 解决方案:采用高可用的消息队列架构,如Kafka的多副本机制。同时,对于重要的缓存失效消息,可以采用消息重试机制,确保消息能够成功发送和被处理。
  4. 缓存一致性问题
    • 挑战:在高并发场景下,可能出现缓存更新不及时导致的数据不一致问题。
    • 解决方案:采用读写锁机制,在更新缓存时加写锁,保证同一时间只有一个线程可以更新缓存。读取数据时加读锁,允许多个线程同时读取。此外,可以通过分布式事务来保证缓存和数据源的数据一致性。