MST

星途 面试题库

面试题:缓存设计之专家难度:复杂场景下缓存过期策略与自动刷新机制的融合

在一个分布式微服务架构的金融系统中,不同的业务模块对数据一致性、实时性和性能有不同的要求。例如,交易记录模块对数据一致性要求极高,而用户资产统计模块对实时性要求稍低但对性能要求很高。设计一套通用的缓存过期策略与自动刷新机制,能够满足不同业务模块的多样化需求,详细说明该设计的架构、策略选择依据、不同模块如何适配以及可能面临的挑战和应对措施。
36.0万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

架构设计

  1. 缓存层:采用分布式缓存系统,如Redis。利用其丰富的数据结构和高性能读写能力,满足不同业务模块的缓存需求。
  2. 业务模块层:各个业务模块根据自身需求从缓存中读取数据或更新缓存。
  3. 缓存管理模块:负责监控缓存状态,根据过期策略和自动刷新机制对缓存进行管理。

策略选择依据

  1. 交易记录模块
    • 过期策略:采用长时间不过期策略。由于对数据一致性要求极高,交易记录一旦写入,不应因缓存过期而丢失。
    • 自动刷新机制:采用事件驱动的刷新机制。当有新的交易记录写入数据库时,通过消息队列(如Kafka)发送消息,通知缓存管理模块更新对应的缓存数据。
  2. 用户资产统计模块
    • 过期策略:设置较短的过期时间,以保证缓存数据能定期更新。例如,每10分钟过期一次,既能满足对实时性要求稍低的需求,又能在一定程度上提高性能。
    • 自动刷新机制:采用定时任务刷新。每隔一段时间(如5分钟),由缓存管理模块查询数据库中的最新用户资产统计数据,并更新到缓存中。

不同模块适配

  1. 交易记录模块:在写入交易记录到数据库后,立即发送消息到消息队列。缓存管理模块监听消息队列,接收到消息后更新对应的缓存数据。
  2. 用户资产统计模块:在模块启动时,注册定时任务到缓存管理模块。缓存管理模块按照设定的时间间隔执行定时任务,更新缓存数据。

可能面临的挑战和应对措施

  1. 缓存雪崩
    • 挑战:大量缓存同时过期,导致请求全部落到数据库,可能使数据库压力过大甚至崩溃。
    • 应对措施:对不同模块的缓存过期时间设置随机偏移量,避免大量缓存同时过期。例如,用户资产统计模块的缓存过期时间在10分钟的基础上,随机增加1 - 5分钟的偏移量。
  2. 缓存穿透
    • 挑战:查询不存在的数据,每次都穿透到数据库,增加数据库压力。
    • 应对措施:在缓存中设置一个空值缓存,当查询不存在的数据时,先将空值存入缓存,并设置较短的过期时间。下次查询同样的数据时,直接从缓存中获取空值,避免穿透到数据库。
  3. 缓存击穿
    • 挑战:热点数据缓存过期瞬间,大量请求同时访问,导致数据库压力过大。
    • 应对措施:使用互斥锁(如Redis的SETNX命令)。当缓存过期时,只有一个请求能获取到锁并查询数据库更新缓存,其他请求等待,从而避免大量请求同时落到数据库。