面试题答案
一键面试1. 先更新数据库,再更新缓存
- 策略:在对数据进行修改时,首先执行数据库的更新操作,成功后再更新缓存中的对应数据。
- 优点:
- 逻辑简单,易于理解和实现,符合常规的操作顺序思维。
- 缺点(高并发场景):
- 并发写入场景下,可能会出现缓存更新顺序错乱问题。假设线程A和线程B同时更新数据,A先更新数据库,此时B也更新数据库,然后B更新缓存,最后A更新缓存,导致缓存中是旧数据。
2. 先删除缓存,再更新数据库
- 策略:当数据发生变化时,先删除缓存中的数据,然后再执行数据库的更新操作。
- 优点:
- 相对简单,在大部分场景下能解决缓存和数据库不一致问题。
- 避免了先更新缓存带来的缓存更新顺序错乱问题。
- 缺点(高并发场景):
- 存在短暂不一致窗口。比如读操作在删除缓存后、更新数据库前发生,此时会从数据库读取旧数据并写回缓存,导致缓存和数据库不一致。
- 在高并发读写场景下,如果读操作频繁且数据库更新较慢,可能会有大量读请求从数据库读取旧数据并写回缓存,增加数据库压力。
3. 先更新数据库,再删除缓存
- 策略:首先执行数据库的更新操作,成功后删除缓存中的对应数据。
- 优点:
- 大多数场景下能有效保证数据一致性,是目前比较常用的策略。
- 减少了先删除缓存带来的数据库压力问题,因为只有数据库更新成功才会删除缓存。
- 缺点(高并发场景):
- 同样存在短暂不一致窗口。在更新数据库后删除缓存前,如果有读请求,会读到旧缓存数据。
- 缓存删除失败的情况下,如果没有重试机制,会导致缓存长期不一致。
4. 双写一致性方案(补偿机制)
- 策略:
- 先更新数据库,再更新缓存(或删除缓存)。
- 增加一个异步补偿机制,比如使用消息队列。当更新操作完成后,发送一条消息到消息队列,由消息队列消费并再次检查和修正缓存与数据库的一致性。
- 优点:
- 可以最大程度保证数据一致性,通过异步补偿机制可以处理前面几种策略中可能出现的不一致情况。
- 对于高并发场景有较好的适应性,消息队列可以起到削峰填谷的作用,减少数据库和缓存的瞬时压力。
- 缺点:
- 系统复杂度大幅增加,引入消息队列需要考虑消息的可靠投递、重复消费、顺序消费等问题。
- 增加了系统的维护成本,需要额外监控和维护消息队列相关组件。