缓存数据库双写不一致问题处理
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和缓存就能达到最终的一致性。
以上是关于缓存数据库双写不一致问题处理的主要内容,如果未能解决你的问题,请参考以下文章