redis与mysql双写一致性(代码片段)

冬日寻雾记 冬日寻雾记     2023-03-18     648

关键词:

双写一致性时为了保证Redis缓存与MySQL数据库中的数据一样

我们对Redis中没有的数据,MySQL怎么回写呢?

我们用 双检加锁策略

这样只要第一个请求发过来,后面的请求就不会发送到MySQL,直接从Redis中获取缓存数据就可以了。

 

为了保证这种一致性,有三种方案

  • 1. 先更新数据库,再更新缓存
  • 2. 先删除缓存,再更新数据库
  • 3. 先更新数据库,再删除缓存

(1)先更新数据库,再更新缓存

原因一(线程安全角度) 同时有请求A和请求B进行更新操作,那么会出现

  • (1)线程A更新了数据库
  • (2)线程B更新了数据库
  • (3)线程B更新了缓存
  • (4)线程A更新了缓存

2)先删缓存,再更新数据库

该方案会导致不一致的原因是。同时有一个请求A进行更新操作,另一个请求B进行查询操作。那么会出现如下情形:

  • (1)请求A进行写操作,删除缓存
  • (2)请求B查询发现缓存不存在
  • (3)请求B去数据库查询得到旧值
  • (4)请求B将旧值写入缓存
  • (5)请求A将新值写入数据库 上述情况就会导致不一致的情形出现。而且,如果不采用给缓存设置过期时间策略,该数据永远都是脏数据。

那么,如何解决呢?采用延时双删策略 伪代码如下

public void write(String key,Object data)
        redis.delKey(key);
        db.updateData(data);
        Thread.sleep(1000);
        redis.delKey(key);
    

这种方法会有什么问题呢?

第二次删除失败,就会出现如下情形。还是有两个请求,一个请求A进行更新操作,另一个请求B进行查询操作,为了方便,假设是单库:

  • (1)请求A进行写操作,删除缓存
  • (2)请求B查询发现缓存不存在
  • (3)请求B去数据库查询得到旧值
  • (4)请求B将旧值写入缓存
  • (5)请求A将新值写入数据库
  • (6)请求A试图去删除请求B写入对缓存值,结果失败了。

 

(3)先更新数据库,再删缓存

 

那么怎么知道mysql有更新呢?

我们可以用canal

 

redis与mysql双写一致性(代码片段)

双写一致性时为了保证Redis缓存与MySQL数据库中的数据一样我们对Redis中没有的数据,MySQL怎么回写呢?我们用双检加锁策略这样只要第一个请求发过来,后面的请求就不会发送到MySQL,直接从Redis中获取缓存数据就可以了。 为... 查看详情

美团二面:redis与mysql双写一致性如何保证?

...,有位好朋友去美团面试。他说,被问到Redis与MySQL双写一致性如何保证?这道题其实就是在问缓存和数据库在双写场景下,一致性是如何保证的?本文将跟大家一起来探讨如何回答这个问题。公众号:捡田螺的小男孩谈谈一致... 查看详情

redis什么是缓存与数据库双写不一致?怎么解决?(代码片段)

什么是缓存与数据库双写不一致?怎么解决?1.热点缓存重建1.1什么是热点缓存重建1.2基于DCL(doublechecklock)双重检测锁解决热点缓存并发重建问题1.3分布式锁解决热点缓存并发重建问题2.缓存与数据库双写不一致2.1CacheAsideP... 查看详情

redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?(代码片段)

...先更新数据库,然后删除缓存。这是我们常用的双写一致性的处理方法,但也正是这样的方式出现了问题。下面我们来详细讲解1.先更新数据库,再删除缓存为什么有问题?首先原来的方法,大概是这样的࿰... 查看详情

redis7高级之缓存双写一致性之更新策略探讨(代码片段)

1.缓存双写一致性如果redis中有数据需要和数据库中的值相同如果redis中无数据数据库中的值是最新值,且准备回写redis缓存按照操作分只读缓存读写缓存同步直写策略写数据库后也同步写redis缓存,缓存中的数据和数据中... 查看详情

java面试常被问到这道题:如何保证缓存与数据库的双写一致性?(代码片段)

面试原题:如何保证缓存与数据库的双写一致性?面试官心理分析你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?面试题剖析一般来说,如... 查看详情

java面试常被问到这道题:如何保证缓存与数据库的双写一致性?(代码片段)

面试原题:如何保证缓存与数据库的双写一致性?面试官心理分析你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?面试题剖析一般来说,如... 查看详情

canal解决redis与mysql缓存一致性问题(代码片段)

目录1缓存一致性2缓存一致性解决方案3Canal介绍3.1Canal应用场景3.2MySQL主从复制原理3.3Canal工作原理3.4Canal配置5同步更新Redis缓存1缓存一致性用户每次抢完红包,要查看自己抢红包记录,此时需要查询数据库表money_log,如果... 查看详情

如何保证数据库和缓存双写一致性?(代码片段)

...大家见面了。前言数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率非常... 查看详情

如何保证redis缓存与数据库的一致性?(代码片段)

目录1、四种同步策略:2、更新缓存还是删除缓存2.1更新缓存2.2删除缓存3、先操作数据库还是缓存3.1先删除缓存再更新数据库3.2先更新数据库再删除缓存4、延时双删4.1采用读写分离的架构怎么办?5、利用消息队列进行删... 查看详情

高并发下如何保证数据库和缓存双写一致性?(代码片段)

前言数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。我很负责的告诉你,该问题无论在面试,还是工作中遇到... 查看详情

docker安装canalmysql进行简单测试与实现redis和mysql缓存一致性(代码片段)

一、简介canal[kənæl],译意为水道/管道/沟渠,主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费。早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务trigger获取增... 查看详情

redis缓存一致性(代码片段)

文章目录缓存一致性读缓存**双检加锁**策略写缓存保障最终数据一致性解决方案先更新数据库,再更新缓存案例演示1->更新缓存异常案例演示2->并发导致先更新缓存,再更新数据库案例演示->并发导致先删除缓存&#... 查看详情

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

...我们在Redis的实际使用过程中,难免会遇到缓存与数据库双写时数据不一致的问题,这也是我们必须要考虑的问题。如果还有同学不了解这个问题,可以搬小板凳来听听啦。一、数据库+缓存双写不一致问题引入要讲数据库+缓存... 查看详情

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

...我们在Redis的实际使用过程中,难免会遇到缓存与数据库双写时数据不一致的问题,这也是我们必须要考虑的问题。如果还有同学不了解这个问题,可以搬小板凳来听听啦。一、数据库+缓存双写不一致问题引入要讲数据库+缓存... 查看详情

什么是/使用缓存(cache),缓存更新策略数据库缓存不一致解决方案及实现缓存与数据库双写一致(代码片段)

(目录)实现这个方案:商户查询缓存商户查询缓存1.什么是缓存(Cache)?前言:什么是缓存?举个例子:例如:例1:StaticfinalConcurrentHashMap<K,V>map=newConcurrentHashMap<>();例2:staticfinalCache<K,V>USER_CACHE=CacheBuilder.newBuilder().b 查看详情

秒杀系统实战|缓存与数据库双写问题的争议(代码片段)

...存热点数据」的问题,进一步延伸到数据库和缓存的双写一致性问题,并且给出了实现代码。前文回顾和文章规划零基础上手秒杀系统(一):防止超卖零基础上手秒杀系统(二):令牌桶限流+再谈超卖零基础上手秒杀系统(... 查看详情

缓存数据库双写不一致问题处理(代码片段)

我们的数据库操作中,一般会封装同步修改缓存的写法,但是这是一个两步操作,有可能带来缓存数据库数据不一致的问题。使用redisson提供的分布式锁解决参考:基于redis的分布式锁在我们之前加锁的逻辑中࿰... 查看详情