如何保证数据库与redis缓存数据一致性

Posted 在京奋斗者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何保证数据库与redis缓存数据一致性相关的知识,希望对你有一定的参考价值。

既然要解决这个问题,那么首先要大概了解为啥会出现数据不一致呢?根本原因是我们无法将数据库更新操作与缓存更新操作放在同一个事务内同步成功,同步失败!

下面列举几个常见的操作以及各自的问题

1、先更新数据库,后更新缓存

       

问题:假如有两个请求,请求1先更新数据库,将库存更新为1,这时CPU切换给了请求2,请求2将库存更新为2并且将库存更新为了2,这时CPU又切换到了请求1,这时将库存更新为1,这样最终数据库中库存数量是2,而缓存中库存数量却为1,导致了两者不一致,因此这种操作是无法保证两者一致的。

2、先更新缓存后更新数据库

问题:假如有两个请求,请求1先更新缓存为1,然后这时CPU切换到请求2上了,更新缓存为2,更新数据库库存也为2,然后CPU又切换到了请求1上,这时请求1更新数据库库存为1,最终缓存中库存为2,数据库中库存为1。两者数据不一致。

3、先删除缓存,后更新数据库

问题:假如请求1先删除缓存,这时CPU切换到请求2,请求2从缓存中读取查询库存,发现缓存中不存在,那么就会去读取数据库中的库存,数据库中当前库存是1,那么就会把1加载到缓存中。然后CPU切换到了请求1上,它去更新数据库将库存更新为2,这样最后缓存中值是1,数据库中值是2,两者不一致。

4、先更新数据库,后删除缓存

 问题:假如有3个请求,请求1先更新数据库库存为1,随后就删掉了缓存。CPU切换到请求3,请求3查询数据库,发现数据库中数据不存在,因此就读取数据库中的库存,值为1。这时CPU又切给了请求2,请求2先更新数据库库存为2,随后就再次尝试删除缓存(这时缓存中没值)。这时CPU又切给了请求3,请求3把刚才从数据库中查询出来的库存1加载到缓存中。这就又导致了最终缓存与数据库中的数据不一致。

以上是关于如何保证数据库与redis缓存数据一致性的主要内容,如果未能解决你的问题,请参考以下文章

Redis面试篇 -- 如何保证缓存与数据库的双写一致性?

如何保证数据库与redis缓存数据一致性

如何保证数据库与redis缓存数据一致性

如何保证 Redis 缓存与数据库双写一致性?

分布式系统——并发条件下如何保证缓存与DB数据一致性

REDIS11_缓存和数据库一致性如何保证解决方案提供Canel解决数据一致性问题