MST

星途 面试题库

面试题:缓存设计之高级难度:复杂业务场景下的缓存一致性策略

假设你正在开发一个电商系统,涉及商品库存、价格以及订单状态等数据的频繁读写操作。请详细描述如何设计缓存以确保这些关键数据的一致性,同时要考虑高并发情况下系统的性能和稳定性,说说你设计的缓存更新策略和失效机制。
29.1万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存设计思路

  1. 数据分类缓存
    • 商品库存:使用分布式缓存(如Redis),以商品ID作为键,库存数量作为值。对于高销量商品可设置单独的缓存区域,提高访问效率。
    • 商品价格:同样以商品ID为键,价格信息为值存储在缓存中。可与库存缓存放在同一缓存系统,但设置不同的命名空间以便管理。
    • 订单状态:以订单ID为键,订单状态为值缓存。订单状态相对库存和价格变化频率较低,可设置较长的缓存时间。
  2. 缓存架构 采用多级缓存架构,如本地缓存(如Guava Cache)结合分布式缓存。本地缓存用于处理部分高频读请求,减少对分布式缓存的压力,分布式缓存用于保证数据的一致性和共享性。

缓存更新策略

  1. 读写锁策略
    • 在更新数据时,先获取写锁,阻止其他读操作。更新数据库后,同步更新缓存,然后释放写锁。读操作时获取读锁,多个读操作可同时进行,但写操作进行时,读操作需等待写锁释放。
  2. 异步更新策略 对于非强一致性要求的数据更新,采用异步更新缓存的方式。例如,在订单状态更新后,将更新缓存的任务放入消息队列(如Kafka),由专门的消费者从队列中取出任务并更新缓存。这样可减少对业务流程的阻塞,提高系统响应速度。
  3. 先更新数据库,再更新缓存 在更新数据时,先确保数据库更新成功,然后立即更新缓存。为防止更新缓存失败,可记录失败日志并进行重试机制,或者采用补偿机制,如通过定时任务检查数据库和缓存的一致性并进行修复。

缓存失效机制

  1. 设置过期时间
    • 为缓存数据设置合理的过期时间。对于商品库存,由于变化频繁,过期时间可设置较短,如几分钟;商品价格过期时间可稍长,如几小时;订单状态过期时间可根据业务需求设置为一天或更长。
  2. 主动失效 当数据库数据发生变化时,主动使相关缓存数据失效。例如,商品库存更新后,立即删除对应商品ID的缓存。可通过数据库的触发器或应用程序主动调用缓存删除接口来实现。
  3. 缓存淘汰策略
    • 在缓存空间不足时,采用合适的淘汰策略,如LRU(最近最少使用)。Redis默认支持多种淘汰策略,可根据实际情况选择,确保重要数据不会被过早淘汰。