缓存由于高并发高性能,已经被广泛的应用。在读取缓存方面做法一致。流程如下:
1.先更新数据库,再更新缓存
2.先更新数据库,再删除缓存。
这套方案,基本不推荐使用。
原因一:(线程安全角度)同时请求A和请求B进行更新操作,会出现。
由于网络原因出现A更新缓存比B慢,这就导致了脏数据,因此不考虑。
原因二:(业务场景)
总结:不建议使用该种 解决方案。
方案存在的问题?
假设有两个请求,一个请求A做查询操作,一个请求B做更新操作。会有如下情况发生:
如上情况,会发生脏数据。
在数据库做读写分离的情况下,如果出现网络延迟,写库同步读库的时候,另外一个线程读取读库旧数据,就会对发生脏数据。
如何解决?
采用延时双删模式:
延迟1秒会造成整体吞吐量降低,可以采用异步方式处理。
如果第二次删除,删除失败怎么办?
提供重试机制
消息队列异步补偿机制:
如果觉得如上方案对代码的侵入性太大,可以代用如下方案。
订阅mysql的binlog日志:
订阅mysql的binlog程序有现成的中间件canal。
参考:https://zhuanlan.zhihu.com/p/59167071
原文:https://www.cnblogs.com/wingfirefly/p/14419728.html