MST

星途 面试题库

面试题:缓存设计之高级难度:复杂业务下的缓存更新策略选择

假设你正在开发一个电商系统,其中商品详情页面涉及商品基本信息、库存信息、促销信息等多种数据。不同数据的更新频率和一致性要求不同,在这种复杂业务场景下,你会如何选择和组合缓存更新策略,以保证系统性能和数据一致性?请详细阐述设计思路。
33.0万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 分析数据特性
    • 商品基本信息:更新频率相对较低,一致性要求较高。比如商品名称、描述等信息,一般不会频繁修改,但一旦修改需要及时让用户看到。
    • 库存信息:更新频率高,一致性要求极高。库存数量实时变化,必须准确反映当前可售数量,否则可能导致超卖等问题。
    • 促销信息:更新频率适中,一致性要求较高。促销活动有开始和结束时间,且可能会中途调整规则,需要及时展示给用户。
  2. 选择缓存更新策略
    • 商品基本信息
      • 采用写后失效策略:当商品基本信息更新时,在数据库更新成功后,立即失效相关的缓存数据。下次用户请求商品详情时,缓存中没有数据,会从数据库读取并重新填充缓存。这种策略实现简单,能保证数据最终一致性,对于更新频率不高的商品基本信息较为适用。例如,商品描述修改后,在数据库完成修改,同时删除缓存中该商品详情的基本信息部分缓存。
    • 库存信息
      • 采用读写锁结合的策略:在读取库存信息时,加读锁,允许多个读操作并发进行,以提高系统性能。在更新库存时,加写锁,确保只有一个写操作能进行,保证数据一致性。同时,使用双缓存机制,一份缓存用于实时显示,另一份缓存用于后台异步更新。例如,当有库存扣减操作时,先在实时显示的缓存中扣减,同时将库存更新操作放入队列,后台异步更新数据库和另一份缓存,保证最终一致性。
      • 也可以采用写时更新策略:每次库存更新时,先更新数据库,再立即更新缓存。这种方式虽然能保证最高的一致性,但对系统性能有一定影响,因为每次写操作都要同时更新数据库和缓存。可以结合批量操作来减少这种影响,比如将多个库存更新操作批量处理,减少数据库和缓存的更新次数。
    • 促销信息
      • 采用定时更新与事件驱动相结合的策略:定时任务定期检查促销信息是否有变化,比如每小时检查一次。同时,当促销活动有重要状态变更(如开始、结束、规则修改等)时,通过事件驱动机制立即更新缓存。例如,促销活动开始前几分钟,通过事件驱动提前更新缓存,保证活动开始时用户能看到正确的促销信息。在两次事件驱动之间,通过定时任务保证数据的一致性。
  3. 缓存架构设计
    • 使用分布式缓存:如Redis,利用其高性能、分布式特性来存储商品详情的各类缓存数据。可以根据商品ID进行缓存分片,提高缓存的读写效率和扩展性。
    • 设置合理的缓存过期时间:对于商品基本信息,可以设置较长的过期时间,如一天。库存信息过期时间较短,如几分钟,结合双缓存机制保证实时性。促销信息根据活动周期设置过期时间,在活动临近开始或结束时适当缩短过期时间,增加更新频率。
  4. 监控与补偿机制
    • 监控缓存状态:实时监控缓存的命中率、更新频率等指标,通过监控数据及时发现缓存异常,如缓存失效不及时导致数据不一致等问题。
    • 建立补偿机制:如果发现缓存数据与数据库不一致,通过后台任务进行数据修复。例如,定期对比数据库和缓存中的库存数据,不一致时从数据库同步数据到缓存。