赞
踩
意思是 当数据库数据更新时,redis中的缓存数据和数据库中的数据怎么保存一致;
第一种方案:先更新再删除缓存。
缺点:先更新,其他线程来拿数据会产生脏数据,而且可能会重复阐述缓存
第二种方案: 先删除缓存再更新。
缺点:删除缓存之后,在更新期间如果其他线程要来取数据,发现缓存没了,去数据库取旧值,再更新到缓存里面。这样会产生脏数据,并且产生脏数据之后,之后取得一直是脏数据。
两种方案比较 都有很大的缺陷,但是第二种方案可以改进,第一种方案没法改进。
第二种方案改进版: 先删除缓存,再更新,更新之后再删除缓存。
采用两次删除缓存的机制,来避免第二种方案产生脏数据之后,之后取得的一直是脏数据的问题。该方法产生的脏数据只能是更新期间的脏数据。
缺点:更新期间还是会产生脏数据;第二次删除可能不成功。
二次改进:采用消息队列 把第二次删除key的消息放到消息队列,保证一定能删除。
缺点:还是没有改变,更新期间产生的脏数据.
最终方案:
当数据更新的时候,在缓存中保存一个更新的标志位(类似于id),然后开始更新,当更新期间,其他线程过来拿数据,发现该数据处在更新阶段,就加入一个队列等待取数据,设置等待时间,期间队列头不断轮询数据是否更新完毕。如果在等待时间内数据没有更新完毕,就拿缓存数据,如果数据更新完毕,就取新数据。
eg:数据更新完毕之后,更自己去更新缓存,等待的线程直接去拿缓存就ok
具体流程: A线程更新数据时,会在缓存数据上加一个表示位,表示该数据正在更新,B线程过来取值,发现标示位,设置等待时间进入队列等待,不断轮询缓存,看标示位是否取消,如果期间A线程更新完毕,会更新缓存去除标示位,B线程轮询到直接拿缓存;如果没有更新完毕,就拿缓存中的旧值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。