返回顶部
首页 > 资讯 > 数据库 >MySQL数据库和Redis缓存一致性的更新策略
  • 678
分享到

MySQL数据库和Redis缓存一致性的更新策略

MySQL和Redis缓存一致性更新MySQL和Redis缓存一致性 2023-04-12 09:04:13 678人浏览 独家记忆
摘要

目录一、更新策略二、读写缓存1、同步直写策略2、异步缓写策略三、双检加锁策略四、数据库和缓存一致性的更新策略1、先更新数据库,再更新Redis2、先更新缓存,再更新数据库3、先删除缓存,再更新数据库延时双删4、先更新数据

一、更新策略

1、如果Redis中有数据,需要和数据库中的值相同。

2、如果Redis中无数据,数据库中的最新值要对Redis进行同步更新。

二、读写缓存

1、同步直写策略

写入数据库也同步写Redis缓存,缓存和数据库中的数据一致;对于读写缓存来说,要保证缓存和数据库中的数据一致,就要保证同步直写策略。

2、异步缓写策略

某些业务运行中,mysql数据更新之后,允许在一定时间后再进行Redis数据同步,比如物流系统。

当出现异常情况时,不得不将失败的动作重新修补,需要借助RabbitMQkafka进行重写。

三、双检加锁策略

多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。

其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。

后面的线程进来发现已经有缓存了,就直接走缓存。

public String get(String key){
    // 从Redis缓存中读取
    String value = redisTemplate.get(key);

    if(value != null){
        return value;
    }

    synchronized (RedisTest.class){
        // 重新尝试从Redis缓存中读取
        value = redisTemplate.get(key);
        if(value != null){
            return value;
        }

        // 从Mysql数据库中查询
        value = studentDao.get(key);
        // 写入Redis缓存
        redisTemplate.setnx(key,value,time);
        return value;
    }
}

四、数据库和缓存一致性的更新策略

1、先更新数据库,再更新Redis

按照常理出牌的话,应该都是如此吧?那么,这种情况下,会有啥问题呢?

如果更新数据库成功后,更新Redis之前异常了,会出现什么情况呢?

数据库与Redis内缓存数据不一致。

2、先更新缓存,再更新数据库

多线程情况下,会有问题。

比如

  • 线程1更新redis = 200;
  • 线程2更新redis = 100;
  • 线程2更新MySQL = 100;
  • 线程1更新MySQL = 200;

结果呢,Redis=100、MySQL=200;我擦!

3、先删除缓存,再更新数据库

线程1删除了Redis的缓存数据,然后去更新MySQL数据库;
还没等MySQL更新完毕,线程2杀来,读取缓存数据;
但是,此时MySQL数据库还没更新,线程2读取了MySQL中的旧值,然后线程2,还会将旧值写入Redis作为数据缓存;
线程1更新完MySQL数据后,发现Redis中已经有数据了,之前都删过了,那我就不更新了;
完蛋了。。

延时双删

延时双删可以解决上面的问题,只要sleep的时间大于线程2读取数据再写入缓存的时间就可以了,也就是线程1的二次清缓存操作要在线程2写入缓存之后,这样才能保证Redis缓存中的数据是最新的。


public void deleteRedisData(Student stu){
    // 删除Redis中的缓存数据
    jedis.del(stu);

    // 更新MySQL数据库数据
    studentDao.update(stu);

    // 休息两秒
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    // 删除Redis中的缓存数据
    jedis.del(stu);
}

延迟双删最大的问题就是sleep,在效率为王的今天,sleep能不用还是不用为好。

你不睡我都嫌你慢,你还睡上了…

4、先更新数据库,再删除缓存

  1. 线程1先更新数据库,再删除Redis缓存;
  2. 线程2在线程1删除Redis缓存之前发起请求,得到了未删除的Redis缓存;
  3. 线程1此时才删除Redis缓存数据;

问题还是有,这翻来覆去的,没完没了了。

这种情况如何解决呢?

引入消息中间件解决战斗,再一次详细的复盘一下。

  1. 更新数据库;
  2. 数据库将操作信息写入binlog日志
  3. 订阅程序提取出key和数据;
  4. 尝试删除缓存操作,发现删除失败;
  5. 将这些数据信息发送到消息中间件中;
  6. 从消息中间件中获取该数据,重新操作;

5、总结

哪吒推荐使用第四种方式,先更新数据库,再删除缓存。

方式①和方式②缺点太过明显,不考虑;
方式③中的sleep,总是让人头疼;
方式④是一个比较全面的方案,但是增加了学习成本、维护成本,因为增加了消息中间件。

五、MySQL主从复制工作原理

MySQL数据库和Redis缓存一致性的更新策略

1、当 master 主服务器上的数据发生改变时,则将其改变写入二进制事件日志文件中;

2、salve 从服务器会在一定时间间隔内对 master 主服务器上的二进制日志进行探测,探测其是否发生过改变,

如果探测到 master 主服务器的二进制事件日志发生了改变,则开始一个 I/O Thread 请求 master 二进制事件日志;

3、同时 master 主服务器为每个 I/O Thread 启动一个dump Thread,用于向其发送二进制事件日志;

4、slave 从服务器将接收到的二进制事件日志保存至自己本地的中继日志文件中;

5、salve 从服务器将启动 SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致;

6、最后 I/O Thread 和 SQL Thread 将进入睡眠状态,等待下一次被唤醒;

到此这篇关于MySQL数据库和Redis缓存一致性的更新策略的文章就介绍到这了,更多相关MySQL和Redis缓存一致性内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL数据库和Redis缓存一致性的更新策略

本文链接: https://lsjlt.com/news/201423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL数据库和Redis缓存一致性的更新策略
    目录一、更新策略二、读写缓存1、同步直写策略2、异步缓写策略三、双检加锁策略四、数据库和缓存一致性的更新策略1、先更新数据库,再更新Redis2、先更新缓存,再更新数据库3、先删除缓存,再更新数据库延时双删4、先更新数据...
    99+
    2023-04-12
    MySQL和Redis缓存一致性更新 MySQL和Redis缓存一致性
  • MySQL数据库和Redis缓存一致性的更新策略是什么
    这篇文章主要介绍“MySQL数据库和Redis缓存一致性的更新策略是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL数据库和Redis缓存一致性的更新策略是什么”文章能帮助大家解决问题。...
    99+
    2023-07-06
  • Redis缓存和MySQL数据一致性的方法
    这篇“Redis缓存和MySQL数据一致性的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • redis如何保证缓存和数据库一致性
    redis 通过五种机制维护缓存一致性:1. 写通过缓存,2. 定期同步,3. 事务支持,4. 发布-订阅,5. 校验和修复。选择机制取决于数据变更频率、数据一致性要求、应用性能和维护成...
    99+
    2024-04-20
    redis
  • Redis缓存更新一致性的简单介绍
    这篇文章主要介绍“Redis缓存更新一致性的简单介绍”,在日常操作中,相信很多人在Redis缓存更新一致性的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis缓...
    99+
    2024-04-02
  • MySQL数据和Redis缓存一致性方案详解
    读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现 缓存(Redis)和数据库(MySQL)间的数据一致性问题。 不管是先写MySQL数据库,再删除Redis...
    99+
    2024-04-02
  • 如何更新缓存吗?如何保证缓存和数据库双写一致性?
    目录 前言 先更新数据库,再更新缓存 先更新缓存,再更新数据库 先删除缓存,再更新数据库 先更新数据库,再删除缓存 删除缓存失败,导致不一致 读写分离,导致不一致 前言 在项目中缓存是经常用到的,为了减...
    99+
    2024-04-02
  • 缓存和数据库一致性问题
    1、想要提高应用的性能,可以引入「缓存」来解决 2、引入缓存后,需要考虑缓存和数据库一致性问题,可选的方案有:「更新数据库 + 更新缓存」、「更新数据库 + 删除缓存」 3、更新数据库 + 更新缓存方案,...
    99+
    2021-04-23
    缓存和数据库一致性问题
  • redis缓存和数据库不一致解决
    解决 redis 缓存和数据库不一致问题需要:使用数据一致性协议(如 redis 事务或分布式锁)防止并发写入导致不一致。采用缓存失效策略(如过期时间或更新触发器)确保缓存及时更新。优化...
    99+
    2024-04-19
    redis
  • redis缓存和数据库一致性问题如何解决
    在使用Redis缓存时,常常会遇到与数据库一致性的问题。当数据发生变更时,需要保证Redis缓存与数据库的数据保持一致。以下是几种常...
    99+
    2023-08-24
    redis
  • PHP开发缓存的数据存储与更新策略
    PHP开发缓存的数据存储与更新策略,需要具体代码示例在Web应用程序中,缓存是提高性能和响应速度的重要工具。缓存可以大大减少资源获取的时间和响应的延迟,从而提高系统的效率和用户的满意度。在PHP开发中,缓存技术的应用和优化是非常重要的,本文...
    99+
    2023-11-07
    缓存 数据存储 PHP开发
  • 怎么保证Redis缓存与数据库的一致性
    这篇文章主要为大家展示了“怎么保证Redis缓存与数据库的一致性”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么保证Redis缓存与数据库的一致性”这篇文章吧...
    99+
    2024-04-02
  • redis怎么实现数据存储和缓存的一致性
    redis怎么实现数据存储和缓存的一致性?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。方式1:数据库保存数据,redis不persist red...
    99+
    2024-04-02
  • Mysql和Redis数据一致性
    什么是数据库与缓存一致性 数据一致性指的是:缓存的数据值 = 数据库中的值 为什么会出现数据一致性问题呢? 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用red...
    99+
    2023-09-07
    redis mysql 数据库 java 缓存
  • 如何保证缓存和数据库一致性
    [TOC] 多年前在一次面试中,被问到如果数据更新,先修改数据库还是先修改缓存。因为没有想过,所以比较懵逼,时候赶紧搜索,发现这里面很有学问。基本上所有的文章最终都指向了两个地方,就是Oracle和Hazelcast对缓存更新策略的介绍。 ...
    99+
    2015-01-22
    如何保证缓存和数据库一致性
  • 怎么保证缓存和数据库的数据一致性
    本篇内容主要讲解“怎么保证缓存和数据库的数据一致性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么保证缓存和数据库的数据一致性”吧!1、错误的解决方案1.1、...
    99+
    2023-04-21
    数据库
  • 保证缓存和数据库的数据一致性详解
    目录1、错误的解决方案1.1、 先更新数据库,再删除缓存1.2、 先更新数据库,再更新缓存1.3、 先删除缓存,再更新数据库1.4、 先更新缓存,再更新数据库2、正确的解决方案2.1...
    99+
    2023-05-15
    缓存和数据库数据一致性 保证缓存和数据库数据一致性 数据一致性
  • 面试常问:如何保证Redis缓存和数据库的数据一致性
    目录一、一致性1、强一致性 2、弱一致性 3、最终一致性 二、redis缓存和mysql数据库数据一致性解决 1、方案一:采用延时双删策略2、方案二:一步更新缓存(基于订阅Binlo...
    99+
    2024-04-02
  • 如何保障redis缓存和mysql数据相一致
    如何保障 redis 缓存与 mysql 数据一致性?异步更新:通过消息队列进行更新,不阻塞应用程序。定期同步:使用定时作业定期同步数据,保持数据一致性。混合方法:结合异步和定期同步,兼...
    99+
    2024-04-19
    mysql redis
  • 缓存与数据库一致性保证
    全是干货!本文主要讨论这么几个问题:(1)啥时候数据库和缓存中的数据会不一致(2)不一致优化思路(3)如何保证数据库与缓存的一致性一、需求缘起当数据发生变化时,“先淘汰缓存,再修改数据库”这个点是大家讨论的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作