从MySQL到Redis的数据一致性问题探索常见的解决方案

145 阅读2分钟

本文介绍了数据一致性问题的产生的原因及解决方案,具体包括MySQL和Redis的数据一致性,MySQL和ES的一致性排查,迁移数据时的如何进行一致性校验。

MySQL和Redis缓存一致性问题

1、产生原因

场景:MySQL的数据缓存到Redis中,需要更改MySQL中的数据 问题:假设A、B、C 三个线程,A线程执行修改MySQL的数据,B线程读取的可能是老数据或者新数据,如何解决读取新旧数据的问题? 解决方案:
(1)最终一致性:延迟双删
原理:先删除缓存,在删除数据库,隔一段时间在删除缓存; 延迟双删的原因:写操作更新数据库的同时,多个读操作查询数据并将就数据重新缓存,此时缓存的数据仍是旧值。
问题:第二次的删除时间如何判断?参考值设置
1、数据库操作的耗时:第二次删除缓存应该在数据库完全更新之后。延迟时间要稍长于数据库更新时间。 2、系统的并发量:如果系统的并发量很高,可能存在大量读操作在缓存删除之后查询,这种情况下延迟时间要适当增加。
参考时间:几十到几百毫秒

(2)强一致性:使用读写锁RReadWriteLock
读的时候可以并发读,遇到写锁进行阻塞;

// 获取 RReadWriteLock 实例 
RReadWriteLock readWriteLock = redisson.getReadWriteLock("myLock");  
// 获取读锁
RLock readLock = readWriteLock.readLock(); 
// 获取写锁
RLock writeLock = readWriteLock.writeLock(); 
2、一致性问题怎么排查

排查方法主要分为两种:
(1)数据全部查出来一个个对比一下
(2)数据查询出来聚合为一个大对象,求出md5值进行比较