宝石汇网站,seo网络推广费用,门户网站的推广方案,网页制作成品JAVA面试总结-Redis篇章#xff08;四#xff09;——双写一致性 问#xff1a;redis 做为缓存#xff0c;mysql的数据如何与redis进行同步呢#xff1f;第一种情况#xff0c;如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存#xff0c;再修改数据库四——双写一致性 问redis 做为缓存mysql的数据如何与redis进行同步呢第一种情况如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存再修改数据库还是先修改数据库再删除缓存呢以下有两种情况1.先删除缓存再操作数据库正常情况异常情况 2.先更新数据库再操作缓存正常情况异常情况 解决办法 采用延迟双删 问为什么要删除两次缓存由以上可知先删除缓存再修改数据库会导致有脏数据产生采用延时再进行删除缓存可以避免这种问题产生。问为什么要删除两次缓存由以上可知先删除缓存再修改数据库会导致有脏数据产生采用延时再进行删除缓存可以避免这种问题产生。问为什么要延时删除我们的数据库一般都有主从节点我们需要延迟一会儿把主节点数据延迟到从节点但是延时也可能会出现问题但是具体延时多久需要自己去确定而且这种一样会出现脏数据问题。问有没有其他方案保持数据强一致采用分布式锁采用锁可以保证数据强一致性但是性能会降低具体代码实现读写锁读锁排它锁写锁只有要求强一致的情况下才会使用锁 第二种情况如果你的项目能够允许数据的短暂不一致采用以下逻辑异步通知1 使用MQ2 基于Canal的异步通知 问redis 做为缓存mysql的数据如何与redis进行同步呢
第一种情况如果你的项目一致性要求高的话 采用以下逻辑 我们应该先删除缓存再修改数据库还是先修改数据库再删除缓存呢以下有两种情况
1.先删除缓存再操作数据库
正常情况 一开始数据库和缓存中都是10先删除缓存更新数据库为20之后线程2再查询缓存未命中去查询数据库查到则写入缓存
异常情况 一开始数据库和缓存中都是10先删除缓存此时刚好有一个线程来进行查询缓存中没有数据去查询数据库此时数据库未更新查询到的是旧数据再写入缓存的也是旧数据最后更新数据库为20此时导致缓存和数据库内容不一致
2.先更新数据库再操作缓存
正常情况 一开始数据库和缓存中都是10先更新数据库再删除缓存之后来了一个线程来进行查询缓存中没有就去查询数据库之后写入缓存数据是一致的
异常情况 一开始数据库和缓存中都是10如果有个线程在修改数据库之前进行查询此时数据库未更新查询到的是10之后进行更新数据库再删除缓存然后线程1会把刚刚查到的旧数据写入缓存导致数据不一致。
解决办法 采用延迟双删
问为什么要删除两次缓存
由以上可知先删除缓存再修改数据库会导致有脏数据产生采用延时再进行删除缓存可以避免这种问题产生。
问为什么要删除两次缓存
由以上可知先删除缓存再修改数据库会导致有脏数据产生采用延时再进行删除缓存可以避免这种问题产生。
问为什么要延时删除 我们的数据库一般都有主从节点我们需要延迟一会儿把主节点数据延迟到从节点但是延时也可能会出现问题但是具体延时多久需要自己去确定而且这种一样会出现脏数据问题。
问有没有其他方案保持数据强一致
采用分布式锁 采用锁可以保证数据强一致性但是性能会降低 具体代码实现
读写锁读锁 排它锁写锁 只有要求强一致的情况下才会使用锁
第二种情况如果你的项目能够允许数据的短暂不一致采用以下逻辑
异步通知
1 使用MQ 2 基于Canal的异步通知 这种方法代码侵入较小