缓存与数据库数据不一致 解决方法

5 篇文章 0 订阅
4 篇文章 0 订阅

Redis缓存与数据库数据一致性

不管是先写数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况:

  • 1.如果删除了缓存,还没有来得及写数据库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据
  • 2.如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

1. 第一种方案:延时双删策略+缓存超时设置

  • 写库前后都进行删除缓存操作(redis.del(key),并且设定合理的缓存过期时间具体的步骤就是:
  1. 先删除缓存;
  2. 再写数据库;
  3. 休眠一段时间;
  4. 再次删除缓存。
  • 设置缓存过期时间

        所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值,然后再回填缓存。

2. 第二种方案:异步更新缓存(基于订阅binlog的同步机制)

      订阅MySQL binlog增量消费+消息队列+增量数据更新到redis。一旦MySQL产生了更新操作(写入、更新、删除),就把binlog记录相关的消息通过消息队列推送至Redis,Redis则根据binlog中的记录,来对Redis缓存进行更新。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值