如何保证redis和数据库的数据一致?

如何保证redis 和数据库的数据一致?

当我们对数据修改的时候,到底是先删缓存还是先写数据库

1.如果先删缓存,在写数据库:在高并发情况下,当第一个线程删除了缓存,还没来得及写数据库,第二个线程来读数据,发现缓存中的数据为空,那就回去读数据库中的数据(旧值,脏数据)读完之后,就把读到的结果写入缓存(此时,第一个线程已经将新的值写到缓存里面了),这样缓存中的值就会被覆盖为修改前的脏数据。

解决方案:

  • 先操作缓存,但不删除缓存,将缓存修改成一个特殊值(-999)。客户端读缓存是,发现是默认值,就休眠一小会,再查一次redis。(特殊值可能对业务有侵入;休眠时间可能多次重复,对性能有影响)
  • 延时双删:先删除缓存,然后再写数据库,休眠一小会儿,再次删除缓存。(如果数据写操作频繁,同样还是会有脏数据的问题。)

总结:在这种方式下,通常写操作不能太频繁。

2.先写数据库,再删缓存:如果数据库写完之后,缓存删除失败,数据就会不一致。

解决方案:

  • 给缓存设置一个过期时间。(过期时间内,缓存数据不会更新)
  • 使用MQ ,利用MQ的重试机制,保证原子操作。(重试时间内,缓存数据不会更新)
  • 将热点数据缓存设置为永不过期,在value中写入一个逻辑上的过期时间,单独起一个后台线程,扫描这些key,对逻辑上过期的缓存,进行删除。

总结:始终只能保证一定时间内的最终一致性。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值