如何保持MySQL和Redis的一致性

2 篇文章 0 订阅
2 篇文章 0 订阅

如今,Mysql+ Redis已经成为了一种常用的数据库架构方式,但由于种种原因,总会导致Redis和Mysql之间出现一系列的数据不一致的问题。

例如,一个事务首先写入了Mysql,但还未写入Redis,这是用户访问Redis,就会造成数据不一致。

为了解决这种问题,本文总结了两个方法,尽可能的去达到MySql和Redis之间的数据一致性。

1. 保持数据最终一致性

针对一些对数据一致性要求不是特别高的情况下,像排行榜、近期回复数据。DB更新后,Redis不立即更新,等待键值自然过期,然后去DB里取的同时set redis。或者在DB更新时,马上删掉Redis key,都可以保证数据的最终一致性。

2. 保持数据强一致性

而针对一些我们对数据一致性要求比较高的数据,并且处于高并发情况下的一些数据,我们需要保证它们的强一致性,主要有两种做法:
删除redis key
这种方法是,每当一个数据库更新操作时,我们需要直接把redis的key删除,然后去更新Mysql数据库。并且在休眠500ms(根据具体业务确定)后,再次删除Redis key。这样是为了避免在写未完成的这段时间内,有并发读操作读了mysql中的脏数据,写入了redis中,造成了redis中的一个脏数据。所以我们要给再次删除一遍redis中的key。

基于订阅binlog的异步更新缓存
当MySql做出修改删除变更时,会在binlog日志中记录。我们可以使用一些消息队列做一个订阅(例如阿里发布的开源框架canal,提供了一种发布/订阅模式的同步机制)。通过消息队列我们对mysql的binlog进行订阅,这样一旦mysql中产生了增删改等操作,我们就可以把binlog相关的消息推送给redis,redis再根据binlog中的记录,对Redis进行更新。(类似Mysql主从备份机制

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值