MST

星途 面试题库

面试题:缓存设计之复杂场景下的缓存一致性处理

假设你在开发一个高并发的电商系统,商品库存数据同时存在于数据库和缓存中。当库存发生变化时,如何设计缓存一致性方案,确保在高并发读写情况下,库存数据的一致性,同时尽量减少缓存与数据库之间的交互次数?
23.6万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

1. 读写操作原则

  • 读操作:优先从缓存读取数据。如果缓存命中,直接返回数据;若缓存未命中,再从数据库读取,然后将数据写入缓存并返回。
  • 写操作:主要更新数据库,成功后再更新缓存。

2. 具体方案

  • 双写模式

    • 操作步骤:当库存发生变化时,先更新数据库,数据库更新成功后立即更新缓存。例如在订单扣减库存场景,订单生成后,首先在数据库执行库存扣减操作,若成功则同步更新缓存中的库存数据。
    • 优点:逻辑相对简单,在并发量不是极高的情况下能较好保证一致性。
    • 缺点:在高并发场景下,可能出现数据库更新成功但缓存更新失败的情况,或者先更新缓存后更新数据库导致短时间内数据不一致。
  • 失效模式

    • 操作步骤:当库存变化时,先更新数据库,数据库更新成功后删除缓存。下次读取时,缓存未命中,会从数据库读取最新数据并写入缓存。比如商品库存调整,修改数据库库存后,删除对应的缓存记录。
    • 优点:相比双写模式,减少了缓存和数据库不一致的窗口时间,一定程度上降低了并发更新导致的不一致风险。
    • 缺点:删除缓存后,后续的读请求会造成缓存穿透(大量请求同时未命中缓存,都去查询数据库),可以通过布隆过滤器等手段来减轻缓存穿透问题。
  • 读写锁模式

    • 操作步骤:在对库存数据进行读写操作前,获取对应的读写锁。读操作获取读锁,可以并发读取;写操作获取写锁,此时不允许其他读写操作。例如在库存更新时,先获取写锁,成功获取后更新数据库和缓存,完成后释放锁;读库存时获取读锁,读取完成后释放锁。
    • 优点:能有效保证数据一致性,在高并发场景下可以控制读写操作顺序。
    • 缺点:引入锁机制会增加系统复杂度和性能开销,可能导致线程阻塞,影响系统并发处理能力。

3. 辅助措施

  • 重试机制:对于缓存更新失败的情况,采用重试机制。例如设置重试次数和重试间隔,多次尝试更新缓存,确保缓存数据最终一致性。
  • 异步更新:可以将缓存更新操作异步化,通过消息队列(如 Kafka 等)将库存变化消息发送到队列,消费者从队列中获取消息进行缓存更新,减少主业务流程的阻塞时间,提高系统并发性能。