缓存一致性解决方案

一、更新数据库后更新缓存
    data=100,
    1、更新数据库:
    线程A -> 线程B 更新数据data-1,data: 100->99->98
    2、更新缓存
    线程B -> 线程A data: 100->98->99
    3、最总导致 database = 98,cache = 99

二、更新数据库前更新缓存
    data =100
    1、更新缓存
    先线程A -> 后线程B, data: 100 -> 99 -> 98
    2、更新数据库
    先线程B -> 后线程A  data: 100 -> 98 -> 99
   同一!高并发场景下,由于无法保证更新database和cache的顺序一致,可能存在导致数据不一致问题

   所以通常情况下,“更新缓存再更新数据库” 是应该避免使用的一种手段。

三、更新数据库前删除缓存(读写并发时,会导致数据不一致)
    data = 100
    1、先删除缓存 2、再更新数据库

    线程A执行写操作,先删除缓存,

    此时线程B读,由于缓存为空,则读到database=100

    线程A再更新database=99

    线程B再更新cache=100

    最后导致database=99,cache=100

    解决方法:延时删除,线程A更新完数据库后,停留时间N,然后删除缓存,此时缓存为空,数据库数据为最新值
    注意:需要衡量时间N的大小,N太小,导致删除操作在线程B更新cache操纵之前,导致无法删除脏数据,N太大,导致在N期间读取的缓存都是脏数据

四、更新数据库后删除缓存(最佳方案)(缓存失效的前提下,读写并发会导致数据不一致)
    data = 100
    1、先更新数据库 2、再删除缓存

    线程A先写,database = 99,(注:在线程A写期间,再执行读操作,此时database = 99,cache = 100,实际读取到的都是不一致数据)

    线程A再删除缓存

    线程B读,缓存为空,则去读取database = 99,无误!

    注意:
    若缓存失效,

    线程1执行读,无缓存,则读到database = 100

    此时线程2执行写,database 100 -> 99,

    然后线程1更新cache = 100

    最终导致database = 99,cache = 100,数据不一致!

    并发量很大的情况下,缓存失效的可能性不是很大,所以这种情况出现的概率极小。
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值