双写兜兜转转,返回了串行化的方式

首先a先更新数据库,按照正常流程来走,紧接着要a线程删除缓存,可是突然后面来了个b线程,并且a线程因为各种业务原因卡住了,导致b线程先完成了,之后a线程才更新缓存。这时突然有其他线程进来读数据,就会读到a的数据,但是按照业务流程来走,应该读到b的数据,此时,就出现了数据错乱的问题。

  • 1.线程a更新数据库
  • 2.线程b更新数据库
  • 3.线程b更新缓存
  • 4.线程a更新缓存
  • 5.其他线程读数据(读错了)

到这里我们会发现,直接更新缓存是有很大的问题的,而且很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值,有可能是联合其他的很多数据结合计算出来的一个值。

而且可能会有一种场景,我们经常在更新数据库后直接更新缓存,但是在此之间并没有缓存被访问的需求,这样我们就做了很多无用功,付出了很多代价。

大家应该对单例模式有所了解,其中有一种懒加载的思想,就是说,在你需要的时候再去加载,用在双写的情况下非常合适,也就有了下面这种先更新数据库,再删除缓存的模式。

当然也有了,其实我们可以每次写入都记录日志,然后修改结束后也记录日志,通过日志状态来判断是否写入成功,

  • 如果没有写入成功后续并且没有新的写入请求,就补写,
  • 否则不做处理。

但是这种情况也会出现不一致的问题,就是如果写数据库程序断了,到下次恢复数据之前这段时间,还会出现数据不一致的情况。

并且如果是频繁写入的情况,很有可能日志机制没有发挥作用,就有新数据写入覆盖,并且日志系统还要占用额外的资源。

我懂了!应该先删除缓存再更新数据库,这样就可以了!
 

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章