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