跳至主要內容

数据一致性问题

mozzie大约 2 分钟RedisRedis

常用方案

方案特点
先更新数据库,再更新缓存优点
1. 一致性更强:如果数据库更新成功,而缓存更新失败,可以通过重试机制解决,或者直接让缓存过期,保证了最终一致性。
2. 减少数据不一致的窗口期:因为更新缓存的操作通常比更新数据库快得多,所以更新完数据库后马上更新缓存,可以尽快保持它们之间的一致性。

缺点
1. 更新窗口期中的读操作可能导致脏读:如果在更新数据库后、更新缓存前有新的读请求,这时会读到旧的缓存数据。
先更新缓存,再更新数据库优点
1. 减少了脏读的可能:因为缓存是最先被更新的,读请求总是能读到最新的数据。

缺点
1. 一致性问题更为复杂:如果缓存更新成功,但是数据库更新失败,这会导致缓存和数据库之间出现长期的不一致状态,解决这种不一致状态需要额外的回滚操作,增加了系统的复杂性。
2. 需要处理回滚操作:如上所述,更新缓存成功而数据库更新失败时,需要有一套策略来回滚已经更新的缓存,确保数据一致性。
先删缓存,再更新数据库这种策略是指在更新数据之前,首先删除缓存中的数据,然后再更新数据库。
优点
1. 简单直接,逻辑清晰。

缺点
1. 可能导致窗口期一致性问题。在删除成功和数据库更新期间,如果有读操作发生,将会读取到旧的数据并且可能回填到缓存中,导致数据库与缓存数据不一致。
延时双删策略延时双删涉及三个步骤:先删除缓存、更新数据库,然后过一段时间后再次删除缓存。
优点
1. 相对于“先删缓存,再更新数据库”策略,这种方法可以减少由于缓存窗口期造成的不一致概率。延迟第二次删除可以覆盖到那些在数据库更新过程中请求旧缓存的读操作,从而阻止这些操作将旧数据回填到缓存。

缺点
1. 增加了系统的复杂度,需要合适的机制来定时执行第二次删除操作。
2. 第二次删除的延迟时间不易确定,太短可能无效,太长则可能导致长时间的数据不一致。
贡献者: du