Redis与数据库双写一致性问题
什么是双写一致性问题
所谓的双写一致性是当修改数据库的数据也要同时更新缓存数据,数据库和缓存要保持一致。
因为写和读是并发操作,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。
讨论这个问题的前提是明确业务场景。如果业务一致性要求比较高,需要采用的是一种方案,如果业务允许延迟一致,则又是另一种方案。
业务一致性要求比较高
先删除缓存还是先操作数据库?
两种方式都会有问题。
先删除缓存再操作数据库:
该方案会导致不一致的原因是。同时有一个请求A进行更新操作,另一个请求B进行查询操作。那么会出现如下情形:
(1)、请求A进行写操作,删除缓存
(2)、请求B查询发现缓存不存在
(3)、请求B去数据库查询得到旧值
(4)、请求B将旧值写入缓存
(5)、请求A将新值写入数据库 上述情况就会导致不一致的情形出现。而且,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。
先更新数据库,再删除缓存:
假设这会有两个请求,一个请求A做查询操作,一个请求B做更新操作,那么会有如下情形产生
(1)请求A查询数据库,得一个旧值
(2)请求B将新值写入数据库
(3