当前位置:   article > 正文

如何保证Redis缓存和数据库的双写一致性?_如何保证redis中的数据和数据库中的完全一致

如何保证redis中的数据和数据库中的完全一致

在数据库+缓存模式下,当数据库中的数据需要更新时,缓存里的数据怎么处理?如何保证缓存和数据库中数据的一致性?常用的解决方案有两种(其他渣渣的方案这里不讨论):

1、先删除缓存,再更新数据库;

2、先更新数据库,再删除缓存;

下面我们就来看一下这两种方案,看看它们是怎么保证数据一致性的?

一、先删除缓存,再更新数据库

理想的流程是这样的:先删除缓存,再更新数据库,更新完数据库后,当有请求进来的时候发现缓存中没有数据,于是去查数据库,读取到更新后的新数据放回缓存再返回。这只是理想化的流程,如果只是简单的这样做,我们看看会存在什么问题呢?

在高并发场景下,假设有两个线程,线程A先删除缓存,再去更新数据库,在线程A删除缓存成功但更新数据库还未提交的时候,进来了一个线程B读取数据,发现缓存中没有数据,于是去读数据库,这时B读到的是旧数据,然后再将这个旧数据放回缓存,等A更新数据库完成以后,数据库和缓存中的数据就是不一致的。如果该缓存还没有设置过期时间,那这个数据将一直脏下去。

这个问题可以用"延时双删策略"来解决,A线程先删除缓存,再更新数据库,数据库更新完成后休眠200ms,再次删除缓存,这样做的目的就是保证中间产生的脏数据最后被再次删除。但这个200ms要根据自己的业务情况来确定。

还有一个问题,在延时双删策略第二次删除缓存的时候删除失败怎么办?这种情况可以提供一个"重试保障机制",如果删除失败࿰

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/727831
推荐阅读
相关标签
  

闽ICP备14008679号