MST

星途 面试题库

面试题:缓存设计之复杂业务下双写与延迟策略优化

在一个分布式电商系统中,存在多个服务对商品库存进行读写操作,商品库存数据需要在缓存与数据库保持一致性。此时使用双写和延迟策略,会面临哪些挑战?请提出一套完整的优化方案,并说明方案中各部分的作用及原理。
47.5万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

面临的挑战

  1. 缓存与数据库双写一致性问题:在高并发场景下,写数据库和写缓存的操作很难保证原子性,可能出现数据库写成功但缓存写失败,或者反之的情况,导致数据不一致。
  2. 延迟策略带来的时效性问题:延迟更新缓存可能会在延迟时间段内,业务读取到旧的缓存数据,影响业务准确性。
  3. 缓存击穿问题:在缓存失效的瞬间,大量请求直接访问数据库,可能导致数据库压力过大甚至崩溃。

优化方案

  1. 引入消息队列(MQ)
    • 作用:削峰填谷,解耦写数据库和写缓存的操作,保证数据最终一致性。
    • 原理:当有商品库存更新请求时,先将更新消息发送到MQ。服务从MQ中消费消息,顺序执行数据库更新和缓存更新操作。这样即使某个操作失败,也可以通过MQ的重试机制来保证最终一致性。
  2. 使用分布式锁
    • 作用:在更新库存时,防止并发操作导致数据不一致。
    • 原理:在更新库存前,获取分布式锁。只有获取到锁的服务才能进行库存更新操作,其他服务等待。更新完成后释放锁。例如使用Redis的SETNX命令实现简单的分布式锁。
  3. 缓存失效策略优化
    • 作用:避免缓存同时失效导致缓存击穿。
    • 原理:为缓存设置不同的过期时间,例如在原过期时间基础上增加一个随机值。这样可以分散缓存失效时间,降低同一时间大量缓存失效的概率。
  4. 缓存预热
    • 作用:在系统启动时,将热点商品库存数据提前加载到缓存中,避免系统启动初期大量请求直接访问数据库。
    • 原理:系统启动时,从数据库中查询热点商品库存数据,批量写入缓存。可以通过配置文件指定热点商品,或者通过历史访问记录分析热点商品。
  5. 监控与报警
    • 作用:及时发现缓存与数据库不一致的情况,并通知相关人员处理。
    • 原理:定期(例如每小时)对缓存和数据库中的商品库存数据进行比对,发现不一致时通过邮件、短信等方式通知运维人员。同时记录不一致的数据,方便后续排查问题。