缓存一致性问题
缓存一致性问题 一.场景 二.问题 三.定义 四.分析 1.顺序异常分析 1.1 先A后B 1.2 先B后A 1.3小结 2.方案分析 2.1先A后B 2.2先B后A 1.3小结 1.4方案改进 五.总结 一.场景 项目中为了对dao(data access object)层数据做缓存,设计了一层das(data access service),在das上采用了aop的方式作统一缓存处理。这里做的是缓存删除操作。 二.问题 数据库和缓存的一致性问题。 三.定义 A: 删除缓存 B: 提交数据库事务 C: 读取缓存(如果缓存数据为空,会从数据库读取旧数据) A-B: A和B同步 A–B: A和B异步 四.分析 1.顺序异常分析 1.1 先A后B 注意:删除缓存的操作在数据库事务中执行的情况也属于先A后B (1)A失败了,B不会执行,不影响一致性。 (2)A成功了,B失败了。因为是删除缓存操作(读请求会从数据库读取旧数据),所以不影响一致性。 (3)先A,后B,存在时间间隙,如果在这段间隙中有其它读请求C,那么就会出现数据不一致。 1.2 先B后A (1)B失败,A不会执行,不影响一致性。 (2)B成功,A失败,会出现数据不一致。 1.3小结 从上面分析可以发现,两种顺序的执行都会存在导致数据不一致的问题。 2.方案分析 2.1先A后B 解决问题(3) (1)阻塞加锁的方式, A-B