面试题答案
一键面试1. 先更新数据库,再更新缓存
- 优点: 逻辑简单,易于理解和实现,在大多数常规场景下能保证数据一致性。
- 缺点:如果在更新数据库成功后,更新缓存失败,会导致数据库和缓存数据不一致。在高并发场景下,可能会出现缓存更新丢失的情况。
- 适用场景: 并发量不高,对一致性要求不是特别苛刻的业务场景,例如一些简单的后台管理系统,数据更新频率较低且并发操作少。
2. 先删除缓存,再更新数据库
- 优点: 相比先更新缓存再更新数据库,减少了缓存与数据库不一致的时间窗口。因为删除缓存操作比更新缓存操作更简单和快速,在一定程度上降低了失败的概率。
- 缺点: 存在短暂的不一致窗口。如果在删除缓存后,更新数据库之前,有读请求进来,会从数据库读取旧数据并写回缓存,导致缓存中数据为旧数据。在高并发场景下,可能导致缓存重建风暴,即大量请求同时读取到旧数据并重建缓存。
- 适用场景: 适用于读多写少,对数据一致性要求在短时间内可接受一定程度不一致的场景,例如新闻资讯类应用,偶尔短暂的旧数据展示对用户体验影响不大。
3. 先更新数据库,再删除缓存
- 优点: 是目前相对较常用的策略,在保证数据一致性方面有较好的平衡。如果更新数据库成功,即使删除缓存失败,后续的读请求也会因为缓存中无数据而从数据库读取新数据并更新缓存,最终数据还是一致的。
- 缺点: 仍然存在短暂的不一致窗口。在高并发场景下,如果更新数据库和删除缓存之间有读请求,会读到旧数据。同时,删除缓存失败可能导致后续读请求需要多次回源数据库,增加数据库压力。
- 适用场景: 广泛应用于各类读写操作较为频繁的场景,尤其是对数据一致性要求相对较高,如电商系统中的商品信息缓存,虽然有短暂不一致窗口,但整体能满足业务需求。
4. 双写模式(更新数据库同时更新缓存)
- 优点: 理论上能最大程度保证数据一致性,因为数据库和缓存同时更新。
- 缺点: 实现复杂,需要处理两个写操作的原子性,否则任何一个操作失败都会导致数据不一致。性能开销大,同时写数据库和缓存会增加响应时间,在高并发下可能成为性能瓶颈。
- 适用场景: 对数据一致性要求极高的场景,如金融系统中的账户余额缓存,哪怕短暂的不一致都可能带来严重后果,此时即使牺牲一定性能也要保证数据绝对一致。