缓存数据库双写不一致问题处理

Posted 水田如雅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓存数据库双写不一致问题处理相关的知识,希望对你有一定的参考价值。

我们的数据库操作中,一般会封装同步修改缓存的写法,但是这是一个两步操作,有可能带来缓存数据库数据不一致的问题。

使用redisson提供的分布式锁解决

参考:基于redis的分布式锁

在我们之前加锁的逻辑中,对于读写的一段逻辑进行加锁,但是在高并发的场景中,有可能出现同一时刻,锁竞争过多,有可能有的线程会经历过长时间的等待。

解决加锁的这种问题,回顾下我们的java提供的一些线程安全的类,可以为我们提供如下解决思路:

  • 数据分段
    将数据通过不同的一个组值,分成多段进行加锁,减少竞争发生时候,等待的线程数。
  • 使用读写锁
    这个比较适合我们读多写少的情况,让大部分的读操作顺利进行。

redisson读写锁的使用

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
// 最常见的使用方法
rwlock.readLock().lock();
// 或
rwlock.writeLock().lock();

读写锁使用

canal

对于读多写多的场景,我们可以达到最终一致性就行。
使用canal来对缓存进行更新。例如,如果有大量的请求发送到mysql的话,mysql查询速度慢,QPS上不去,光查mysql可能会瘫痪,那就可以在前面加个缓存,这个缓存有2个主要的问题。一是缓存没有怎么办,二是数据不一致怎么办,这里可能出现库和缓存数据不一致。

对于第一个问题查缓存没有就查mysql,mysql再往缓存中写一份。

对于第二个问题,如果数据库修改了,那就采用异步的方式进行修改,启动一个canal服务,监控mysql,只要一有变化就同步缓存,这样mysql和缓存就能达到最终的一致性。

以上是关于缓存数据库双写不一致问题处理的主要内容,如果未能解决你的问题,请参考以下文章

缓存数据库双写不一致问题处理

高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计

Redis什么是缓存与数据库双写不一致?怎么解决?

高并发场景下缓存+数据库双写不一致问题分析与解决方案设计

高并发场景下缓存+数据库双写不一致问题分析与解决方案设计

redis缓存+数据库双写不一致问题分析与解决方案