如何保持MySQL和Redis的一致性

如今,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主从备份机制

你可能感兴趣的:(数据库,#,Mysql,#,Redis,数据库,队列,redis,java,mysql)