面试题答案
一键面试1. 先更新数据库,再删除缓存
- 优点:
- 操作相对简单,符合一般的开发逻辑,先确保数据库数据的准确性,再清理可能存在的旧缓存数据。
- 由于是先更新数据库,能保证数据库的事务完整性,在数据库层面的数据一致性更容易保证。
- 缺点:
- 在高并发场景下,可能出现缓存和数据库数据不一致的情况。例如,线程A更新了数据库,在删除缓存之前,线程B查询数据,此时缓存还未删除,B查询到的是旧数据,然后线程A删除缓存,就出现了数据不一致。
2. 先删除缓存,再更新数据库
- 优点:
- 理论上可以快速让缓存失效,后续的查询操作会促使从数据库加载新数据到缓存,能在一定程度上保证数据的实时性。
- 缺点:
- 同样在高并发场景下存在问题。比如线程A删除缓存后,还没来得及更新数据库,线程B查询发现缓存不存在,从数据库读取旧数据并写入缓存,之后线程A更新数据库,这就导致缓存和数据库数据不一致。
- 若更新数据库操作失败,而缓存已删除,会导致一段时间内数据无法从缓存获取,只能从数据库读取,增加数据库压力。
3. 先更新数据库,再更新缓存
- 优点:
- 直观上能保证数据一致性,只要更新操作都成功,缓存和数据库数据就保持同步。
- 缺点:
- 存在缓存更新的原子性问题。如果更新缓存操作失败,而数据库更新成功,会导致数据不一致。
- 相比先更新数据库再删除缓存,更新缓存的成本更高,尤其是复杂数据结构的缓存更新。
- 在高并发场景下,可能会出现缓存“脏写”问题,比如多个线程同时更新数据库和缓存,由于网络延迟等原因,可能导致缓存数据更新顺序错乱,与数据库不一致。
4. 双写一致性方案(异步更新缓存)
- 优点:
- 利用异步操作减少对业务流程的阻塞,提高系统的响应性能。例如使用消息队列,将缓存更新操作异步化,主线程可以快速返回。
- 可以在消息队列消费端进行一些复杂的逻辑处理,如合并多个更新操作,减少对缓存的无效更新,提高缓存更新效率。
- 缺点:
- 引入消息队列增加了系统复杂度,需要处理消息队列的高可用、消息丢失、重复消费等问题。
- 异步操作存在一定延迟,在延迟期间缓存和数据库数据不一致。如果对数据一致性要求极高,可能不适用。