数据一致性问题
写作背景:看了些视频,网上也看了很多篇文章,感觉写得都很片面,不是很全,所以我整体总结了一些,我不喜欢重复造轮子,对于网上很多篇复制机类型的文章(很多文章所有字体相同)且很多不正确严重误导他人,我很是抨击这样的行为,这样是严重浪费了别人宝贵的生命时间去学习!当然我也不能保证我这篇文章就写得全部正确,或者很全面,但是我尽了我最大的努力去思考,并在我的知识范围内作出最优解答,我不会随手不思考就复制别人文章然后误导别人这种行为,对于这种行为我也是严重抨击。对于我的这篇文章,如果有写得不对的地方也麻烦各位网友及时指正,也很希望各位给我纠纠错,学文章的目的也只在于互相学习,互相进步!
此篇文章主要是站在redis+mysql的角度考虑数据一致性,当然其它牵扯缓存与db的数据一致性问题,也可以得到借鉴,因为原理和问题都相同
对于redis与数据库的数据如何达到数据一致性,我们平常都会采用如下的处理方案,但是这几种方案在极端情况下其实都是有问题的,下面我们就看看我们平常书写的几种方案中所存在的问题:
1、先更新数据库,再更新缓存:
问题1:如果先更新数据库,然后再去更新缓存失败时,则将导致数据库是新数据,而缓存的数据还是老数据,出现了数据不一致性的问题
解决:事务,更新缓存失败则数据库也失败,达到数据一致性
问题2:线程A先更新数据库,然后再更新缓存,这个时候线程B也更新数据库,由于网络延迟,线程B在线程A之前更新缓存,线程A最后更新缓存,则缓存中的结果和数据库的结果不一致
解决:互斥锁/队列+事务