数据库与redis缓存一致性问题

数据库与redis缓存一致性问题

先更新了缓存,然后数据库也更新了,但是数据库更新失败了,回滚之后就会出现缓存不一致的情况。

或者两个线程更新同一个数据的时候,但是时序不一样,可能存在缓存不一致的问题。

避免这种情况就是删除缓存;

1、后删缓存策略

但是后删缓存仍然存在缓存不一致的情况,当A请求做查询操作,B请求做更新操作,

  • A先读取,但是缓存刚好失效,读取到数据库旧值,

  • B将新值写入到数据库,B将缓存删除

  • 此时A将旧值更新到缓存中,此时某些读取改数据的线程就可能读取到旧值

  • 然后B在将数据更新到缓存,

在A更新缓存和B更新缓存之间,可能会存在有一些线程读取到旧值(脏数据)。

2、延时双删

  • 先删除缓存
  • 再更新数据库
  • 延迟200ms
  • 再删除缓存

3、binglog同步

但是!删除缓存可能会失败,那就把失败的key写进消息队列中,重新从消息队列获取数据,再次删除缓存。

  1. 更新数据库数据
  2. 数据库会将操作信息写入binlog日志当中
  3. 订阅程序提取出所需要的数据以及key
  4. 另起一段非业务代码,获得该信息
  5. 尝试删除缓存操作,发现删除失败
  6. 将这些信息发送至消息队列
  7. 重新从消息队列中获得该数据,重试操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值