MST
星途 面试题库

面试题:缓存设计之缓存预热策略在复杂高并发场景的极致应用

假设你负责设计一个金融交易系统的后端缓存,该系统面临每秒数万笔交易请求,且对数据一致性和可用性要求极高。请阐述你将如何设计缓存预热策略,不仅要满足高并发交易查询需求,还要应对诸如网络故障、缓存雪崩等极端情况,同时保证交易数据的强一致性。详细说明用到的技术选型、架构设计以及应急处理机制。
21.4万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

技术选型

  1. 缓存数据库:选用 Redis 作为缓存数据库。Redis 具备高性能、支持多种数据结构(如哈希表适合存储交易相关数据)、丰富的原子操作指令(有助于保证数据一致性),并且支持主从复制和集群模式,可提升可用性。
  2. 分布式协调服务:使用 ZooKeeper。它能用于分布式环境下的配置管理、服务发现与注册,在缓存预热及应对极端情况时发挥重要作用,例如监控缓存节点状态、协调预热过程中的数据同步等。

架构设计

  1. 分层缓存架构
    • 一级缓存:在应用服务器本地部署缓存(如 Ehcache),用于存储高频访问且对实时性要求稍低的数据。它能快速响应部分交易查询请求,减轻后端 Redis 缓存压力。
    • 二级缓存:采用 Redis 集群作为主要缓存层,存储关键交易数据。Redis 集群通过分片机制,将数据分布在多个节点上,提升整体缓存容量和读写性能,以应对每秒数万笔交易请求。
  2. 缓存预热流程
    • 数据来源:从数据库中批量读取近期高频交易相关数据,这些数据可根据交易类型、客户等维度进行分类。
    • 预热策略
      • 定时预热:在系统业务低峰期,例如凌晨时段,通过定时任务从数据库读取数据并加载到 Redis 缓存中。利用 Redis 的管道(Pipeline)技术,批量执行写操作,减少网络开销,提高预热效率。
      • 按需预热:当系统启动或缓存中某些数据缺失时,根据实时交易请求,从数据库加载数据并写入缓存。同时记录这些热点数据,为后续定时预热提供参考。
    • 数据同步:利用 ZooKeeper 维护缓存数据版本号。当数据库中的交易数据发生变化时,通过消息队列(如 Kafka)通知相关服务,服务更新 Redis 缓存后,在 ZooKeeper 中更新版本号。其他服务在读取缓存数据时,先对比版本号,若不一致则重新从缓存加载数据,保证数据一致性。

应急处理机制

  1. 网络故障
    • 重试机制:当应用与 Redis 缓存之间出现网络故障时,应用程序设置合理的重试次数和重试间隔。例如,首次失败后等待 100ms 重试,每次重试间隔翻倍,最多重试 3 次。若重试仍失败,则记录日志并返回友好的错误提示给前端。
    • 备用链路:建立备用网络链路,如使用多网卡绑定技术或不同运营商网络,当主网络链路出现故障时,自动切换到备用链路,确保应用与缓存之间的通信畅通。
  2. 缓存雪崩
    • 设置不同过期时间:在缓存预热时,为不同数据设置随机的过期时间,避免大量数据在同一时间过期,分散过期压力。例如,将过期时间设置在 1 - 2 小时内的随机值。
    • 多级缓存兜底:当 Redis 缓存出现雪崩,一级缓存(如 Ehcache)仍可提供部分数据支持,保证部分交易查询能正常响应。同时,启动应急预热机制,优先从数据库加载热点数据到 Redis 缓存,逐步恢复缓存服务。
    • 熔断与降级:当缓存雪崩导致系统负载过高时,启用熔断机制,暂时切断部分非关键业务的缓存访问,优先保障核心交易业务。对于非关键业务,进行降级处理,如返回默认数据或简单提示信息,以保证系统整体可用性。