MST
星途 面试题库

面试题:缓存设计:缓存与列式存储数据库一致性保证策略

在缓存系统与列式存储数据库协同场景中,数据的一致性是关键问题。当对数据库进行更新操作后,需要同步更新缓存以确保一致性。请详细阐述你会采用哪些策略来保证缓存与数据库的一致性,并且分析每种策略在高并发场景下的优缺点。
48.5万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

1. 先更新数据库,再更新缓存

  • 策略:在对数据进行修改时,首先执行数据库的更新操作,成功后再更新缓存中的对应数据。
  • 优点
    • 逻辑简单,易于理解和实现,符合常规的操作顺序思维。
  • 缺点(高并发场景)
    • 并发写入场景下,可能会出现缓存更新顺序错乱问题。假设线程A和线程B同时更新数据,A先更新数据库,此时B也更新数据库,然后B更新缓存,最后A更新缓存,导致缓存中是旧数据。

2. 先删除缓存,再更新数据库

  • 策略:当数据发生变化时,先删除缓存中的数据,然后再执行数据库的更新操作。
  • 优点
    • 相对简单,在大部分场景下能解决缓存和数据库不一致问题。
    • 避免了先更新缓存带来的缓存更新顺序错乱问题。
  • 缺点(高并发场景)
    • 存在短暂不一致窗口。比如读操作在删除缓存后、更新数据库前发生,此时会从数据库读取旧数据并写回缓存,导致缓存和数据库不一致。
    • 在高并发读写场景下,如果读操作频繁且数据库更新较慢,可能会有大量读请求从数据库读取旧数据并写回缓存,增加数据库压力。

3. 先更新数据库,再删除缓存

  • 策略:首先执行数据库的更新操作,成功后删除缓存中的对应数据。
  • 优点
    • 大多数场景下能有效保证数据一致性,是目前比较常用的策略。
    • 减少了先删除缓存带来的数据库压力问题,因为只有数据库更新成功才会删除缓存。
  • 缺点(高并发场景)
    • 同样存在短暂不一致窗口。在更新数据库后删除缓存前,如果有读请求,会读到旧缓存数据。
    • 缓存删除失败的情况下,如果没有重试机制,会导致缓存长期不一致。

4. 双写一致性方案(补偿机制)

  • 策略
    • 先更新数据库,再更新缓存(或删除缓存)。
    • 增加一个异步补偿机制,比如使用消息队列。当更新操作完成后,发送一条消息到消息队列,由消息队列消费并再次检查和修正缓存与数据库的一致性。
  • 优点
    • 可以最大程度保证数据一致性,通过异步补偿机制可以处理前面几种策略中可能出现的不一致情况。
    • 对于高并发场景有较好的适应性,消息队列可以起到削峰填谷的作用,减少数据库和缓存的瞬时压力。
  • 缺点
    • 系统复杂度大幅增加,引入消息队列需要考虑消息的可靠投递、重复消费、顺序消费等问题。
    • 增加了系统的维护成本,需要额外监控和维护消息队列相关组件。