面试题答案
一键面试常见策略
- 先更新数据库,再更新缓存
- 操作流程:在数据发生变化时,首先对数据库进行更新操作,成功后再更新缓存中的数据。
- 优点:逻辑相对简单,易于理解和实现。
- 缺点:在高并发场景下,如果先更新数据库成功,还未来得及更新缓存时,其他读请求过来,会读到旧的缓存数据,导致数据不一致。
- 适用场景:并发量不高,对数据一致性要求不是特别严格的场景。
- 先删除缓存,再更新数据库
- 操作流程:当数据发生变化,先删除缓存中的数据,然后再更新数据库。后续读请求发现缓存中没有数据,会从数据库读取并回写缓存。
- 优点:相对简单,在大多数场景下能保证数据一致性。在高并发场景下,只要缓存删除成功,后续读操作会从数据库获取最新数据并更新缓存。
- 缺点:存在缓存击穿问题,如果在删除缓存和更新数据库之间,有大量读请求同时进来,都去查询数据库,可能会对数据库造成较大压力。另外,如果删除缓存成功但更新数据库失败,也可能导致数据不一致。
- 适用场景:适用于读多写少的场景,并且需要采取一些措施(如加互斥锁等)来防止缓存击穿。
- 先更新数据库,再删除缓存
- 操作流程:数据变化时,先更新数据库,更新成功后删除缓存。
- 优点:这是目前应用较为广泛的策略。一般情况下能较好地保证数据一致性,因为数据库的更新操作完成后,删除缓存,后续读请求会获取到最新数据并更新缓存。
- 缺点:同样存在一些极端情况下的数据不一致问题,比如更新数据库成功后,在删除缓存前系统崩溃,或者删除缓存失败等情况。另外,对于写多读少的场景,频繁删除缓存可能造成缓存命中率下降。
- 适用场景:适用于读多写少,对一致性要求较高的场景。可以结合重试机制等手段来尽量避免删除缓存失败等情况导致的数据不一致。
- 双写一致性方案
- 操作流程:在更新数据库的同时,使用异步任务队列或消息队列等机制,异步地再次更新缓存(可以是重试更新缓存或者进行一些一致性校验和修复操作)。
- 优点:通过异步重试等机制,可以在一定程度上提高数据一致性的概率,减少因单次操作失败导致的数据不一致问题。
- 缺点:引入了异步队列等机制,增加了系统的复杂性,需要处理队列的可靠性、消息的顺序性等问题。
- 适用场景:对数据一致性要求极高的金融交易等场景,通过额外的异步处理来进一步保障数据一致性。
- 缓存失效时间设置
- 操作流程:给缓存数据设置一个合理的失效时间,在失效时间内,即使数据库和缓存数据不一致,随着时间推移,缓存失效后会重新从数据库读取最新数据。
- 优点:简单易行,不需要复杂的额外操作。
- 缺点:在缓存失效前,可能存在数据不一致的情况,而且如果失效时间设置不合理,可能导致频繁读取数据库或者长时间数据不一致。
- 适用场景:对数据一致性要求不是非常严格,允许在短时间内存在一定程度的数据不一致的场景。
适用场景总结
- 对一致性要求不高且并发量低:可采用先更新数据库,再更新缓存策略。
- 读多写少场景:优先考虑先删除缓存,再更新数据库或者先更新数据库,再删除缓存策略,同时可结合防止缓存击穿等措施。
- 对一致性要求极高:适合采用双写一致性方案,并配合严格的异常处理和重试机制。
- 可容忍短时间不一致:缓存失效时间设置策略较为合适。