当前位置:   article > 正文

Redis mysql 双写一致性_f$_;&hgxmysql

f$_;&hgxmysql

意思是 当数据库数据更新时,redis中的缓存数据和数据库中的数据怎么保存一致;

 

第一种方案:先更新再删除缓存。

缺点:先更新,其他线程来拿数据会产生脏数据,而且可能会重复阐述缓存

第二种方案: 先删除缓存再更新。

缺点:删除缓存之后,在更新期间如果其他线程要来取数据,发现缓存没了,去数据库取旧值,再更新到缓存里面。这样会产生脏数据,并且产生脏数据之后,之后取得一直是脏数据。

 

两种方案比较 都有很大的缺陷,但是第二种方案可以改进,第一种方案没法改进。

 

第二种方案改进版: 先删除缓存,再更新,更新之后再删除缓存。

采用两次删除缓存的机制,来避免第二种方案产生脏数据之后,之后取得的一直是脏数据的问题。该方法产生的脏数据只能是更新期间的脏数据。

缺点:更新期间还是会产生脏数据;第二次删除可能不成功。

 

二次改进:采用消息队列 把第二次删除key的消息放到消息队列,保证一定能删除。

缺点:还是没有改变,更新期间产生的脏数据.

 

最终方案:

当数据更新的时候,在缓存中保存一个更新的标志位(类似于id),然后开始更新,当更新期间,其他线程过来拿数据,发现该数据处在更新阶段,就加入一个队列等待取数据,设置等待时间,期间队列头不断轮询数据是否更新完毕。如果在等待时间内数据没有更新完毕,就拿缓存数据,如果数据更新完毕,就取新数据。

eg:数据更新完毕之后,更自己去更新缓存,等待的线程直接去拿缓存就ok

具体流程: A线程更新数据时,会在缓存数据上加一个表示位,表示该数据正在更新,B线程过来取值,发现标示位,设置等待时间进入队列等待,不断轮询缓存,看标示位是否取消,如果期间A线程更新完毕,会更新缓存去除标示位,B线程轮询到直接拿缓存;如果没有更新完毕,就拿缓存中的旧值。

 

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

闽ICP备14008679号