赞
踩
在数据库+缓存模式下,当数据库中的数据需要更新时,缓存里的数据怎么处理?如何保证缓存和数据库中数据的一致性?常用的解决方案有两种(其他渣渣的方案这里不讨论):
1、先删除缓存,再更新数据库;
2、先更新数据库,再删除缓存;
下面我们就来看一下这两种方案,看看它们是怎么保证数据一致性的?
理想的流程是这样的:先删除缓存,再更新数据库,更新完数据库后,当有请求进来的时候发现缓存中没有数据,于是去查数据库,读取到更新后的新数据放回缓存再返回。这只是理想化的流程,如果只是简单的这样做,我们看看会存在什么问题呢?
在高并发场景下,假设有两个线程,线程A先删除缓存,再去更新数据库,在线程A删除缓存成功但更新数据库还未提交的时候,进来了一个线程B读取数据,发现缓存中没有数据,于是去读数据库,这时B读到的是旧数据,然后再将这个旧数据放回缓存,等A更新数据库完成以后,数据库和缓存中的数据就是不一致的。如果该缓存还没有设置过期时间,那这个数据将一直脏下去。
这个问题可以用"延时双删策略"来解决,A线程先删除缓存,再更新数据库,数据库更新完成后休眠200ms,再次删除缓存,这样做的目的就是保证中间产生的脏数据最后被再次删除。但这个200ms要根据自己的业务情况来确定。
还有一个问题,在延时双删策略第二次删除缓存的时候删除失败怎么办?这种情况可以提供一个"重试保障机制",如果删除失败
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。