数据库和缓存如何保证数据的一致性
我们使用缓存的时候,如果更新数据库的数据,那么也需要同时更新redis中的缓存数据,以保证双方数据的一致性。
具体方法如下:
-
通常方法:
先更新MySQL(以MySQL为例),再更新redis(以redis为例),倒是存在风险,如果更新redis失败,MySQL无从得知,最终可能仍然导致不一致。 -
先删除redis缓存数据,再更新MySQL,再次查询的时候将数据添加到缓存中。
这种方案解决1方案的问题,但是在高并发下性能比较低,而且仍然会出现数据不一致的问题,比如线程1删除了redis的数据,正在更新MySQL,此时另外一个查询再查询,那么会吧MySQL中老数据又查到redis中。 -
延时双删。
步骤是:先删除redis缓存数据,再更新MySQL,延时几百毫秒再删除redis缓存数据,这样就算在更新MySQL时,其他线程读了MySQL,把老数据读取到redis中,那么也会删除掉,从而把数据保持一致。