MST

星途 面试题库

面试题:缓存设计之专家难度:复杂业务场景下优化缓存命中率的综合策略

假设存在一个电商系统,商品数据包含基本信息、库存、价格以及促销活动等多种属性,且不同用户角色(普通用户、会员用户、管理员)对数据的访问权限和频率不同。请设计一套完整的缓存方案,详细说明如何根据业务逻辑和用户行为,运用多级缓存、缓存预热、动态缓存调整等技术手段来最大化缓存命中率,并阐述该方案在应对突发流量和数据变化时的弹性与可靠性。
18.2万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存方案设计

  1. 多级缓存架构

    • 浏览器缓存:对于不经常变化的商品基本信息(如商品名称、描述等),可设置较长的缓存时间,在浏览器端进行缓存。通过设置合适的 HTTP 缓存头(如 Cache - ControlExpires),减少用户重复请求相同数据,直接从浏览器本地获取,提升加载速度。
    • CDN 缓存:分布在网络边缘的 CDN 节点缓存静态资源(如商品图片)以及一些不敏感且变化频率低的商品信息。当用户请求时,优先从距离用户最近的 CDN 节点获取数据,减轻源服务器压力。例如,新上架商品的图片,在源服务器上传后,可主动推送至 CDN 节点进行缓存预热。
    • 应用层缓存
      • 本地缓存:在应用服务器本地使用如 Ehcache 等缓存框架,缓存经常访问且变化频率较低的数据。比如,热门商品的基本信息和价格,由于这些数据在短时间内不会频繁变动,可缓存到本地,减少对分布式缓存的访问压力。设置合理的过期时间和缓存淘汰策略(如 LRU - 最近最少使用)。
      • 分布式缓存:采用 Redis 作为分布式缓存,存储商品的各种属性数据,包括库存、促销活动等相对实时性要求较高的数据。对于不同用户角色的数据访问权限,可通过 Redis 的数据结构(如哈希表)分别存储不同角色可见的数据部分。例如,会员用户专属的促销活动数据存储在特定的哈希表字段中,只有会员用户请求时能获取。
  2. 缓存预热

    • 初始化缓存:在系统启动时,通过批量查询数据库,将热门商品的各类数据预先加载到各级缓存中。例如,查询销量排名前 100 的商品基本信息、价格、库存等,分别写入本地缓存和分布式缓存,确保系统上线后用户首次访问就能命中缓存。
    • 定时任务预热:利用定时任务,在业务低峰期,对即将到来的热门活动商品或即将上架的热门商品进行缓存预热。例如,在某个大型促销活动开始前几小时,将活动商品数据提前加载到缓存中,避免活动开始时大量缓存未命中导致的性能问题。
  3. 动态缓存调整

    • 基于用户行为:分析用户的浏览历史、购买记录等行为数据,动态调整缓存策略。对于经常访问的商品,适当延长其在各级缓存中的过期时间;对于长时间未被访问的商品,缩短过期时间或提前淘汰。例如,若某个商品近期被频繁搜索和浏览,将其在本地缓存和分布式缓存中的过期时间延长 1 - 2 小时。
    • 基于数据变化:当商品数据发生变化(如库存更新、价格调整、促销活动开始/结束)时,不仅要更新数据库,还要及时同步更新各级缓存。对于分布式缓存,采用发布 - 订阅模式,当数据变化时,发布消息通知相关缓存节点进行更新。对于本地缓存,可通过缓存一致性协议(如 JCache 规范中的一些机制)进行更新。

应对突发流量和数据变化的弹性与可靠性

  1. 应对突发流量

    • 缓存扩容:在预测到可能出现突发流量(如大型促销活动)时,提前增加分布式缓存的节点数量,通过水平扩展来提高缓存的处理能力。例如,使用 Redis Cluster 模式,动态添加节点,增加缓存容量和读写性能。
    • 降级策略:当缓存服务出现性能瓶颈或部分缓存不可用时,启用降级策略。对于非关键数据,可直接返回默认值或提示信息,优先保证核心业务功能(如商品基本信息展示、下单等)的正常运行。例如,若促销活动缓存不可用,可暂时不展示活动信息,但商品价格和库存等关键数据仍正常获取。
  2. 应对数据变化

    • 数据校验:在缓存更新后,定期对缓存数据和数据库数据进行一致性校验。可通过定时任务,抽取部分缓存数据与数据库进行比对,若发现不一致,及时更新缓存数据,确保数据的准确性。
    • 备份与恢复:对分布式缓存中的关键数据进行定期备份,如使用 Redis 的 RDB 或 AOF 持久化机制。当缓存数据因意外丢失或损坏时,能够快速从备份中恢复数据,保证系统的正常运行。