iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL数据库和Redis缓存一致性的更新策略是什么
  • 165
分享到

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

2023-07-06 01:07:27 165人浏览 独家记忆
摘要

这篇文章主要介绍“MySQL数据库和Redis缓存一致性的更新策略是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mysql数据库和Redis缓存一致性的更新策略是什么”文章能帮助大家解决问题。

这篇文章主要介绍“MySQL数据库Redis缓存一致性的更新策略是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mysql数据库Redis缓存一致性的更新策略是什么”文章能帮助大家解决问题。

    一、更新策略

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

    如果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缓存一致性的更新策略是什么

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

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

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

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

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

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

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

    关于“MySQL数据库和Redis缓存一致性的更新策略是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网数据库频道,小编每天都会为大家更新不同的知识点。

    您可能感兴趣的文档:

    --结束END--

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

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

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

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • MySQL数据库和Redis缓存一致性的更新策略是什么
      这篇文章主要介绍“MySQL数据库和Redis缓存一致性的更新策略是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL数据库和Redis缓存一致性的更新策略是什么”文章能帮助大家解决问题。...
      99+
      2023-07-06
    • MySQL数据库和Redis缓存一致性的更新策略
      目录一、更新策略二、读写缓存1、同步直写策略2、异步缓写策略三、双检加锁策略四、数据库和缓存一致性的更新策略1、先更新数据库,再更新Redis2、先更新缓存,再更新数据库3、先删除缓存,再更新数据库延时双删4、先更新数据...
      99+
      2023-04-12
      MySQL和Redis缓存一致性更新 MySQL和Redis缓存一致性
    • Redis缓存和MySQL数据一致性的方法
      这篇“Redis缓存和MySQL数据一致性的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
      99+
      2022-10-19
    • 保证Redis缓存与数据库一致性的方法是什么
      本文小编为大家详细介绍“保证Redis缓存与数据库一致性的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“保证Redis缓存与数据库一致性的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、四...
      99+
      2023-07-05
    • 如何更新缓存吗?如何保证缓存和数据库双写一致性?
      目录 前言 先更新数据库,再更新缓存 先更新缓存,再更新数据库 先删除缓存,再更新数据库 先更新数据库,再删除缓存 删除缓存失败,导致不一致 读写分离,导致不一致 前言 在项目中缓存是经常用到的,为了减...
      99+
      2022-10-18
    • 怎么保证Redis缓存与数据库的一致性
      这篇文章主要为大家展示了“怎么保证Redis缓存与数据库的一致性”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么保证Redis缓存与数据库的一致性”这篇文章吧...
      99+
      2022-10-19
    • redis怎么实现数据存储和缓存的一致性
      redis怎么实现数据存储和缓存的一致性?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。方式1:数据库保存数据,redis不persist red...
      99+
      2022-10-18
    • 怎么保证缓存和数据库的数据一致性
      本篇内容主要讲解“怎么保证缓存和数据库的数据一致性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么保证缓存和数据库的数据一致性”吧!1、错误的解决方案1.1、...
      99+
      2023-04-21
      数据库
    • 什么是数据库的读一致性和写一致性
      一、读一致性 读一致性是指在数据库中的并发读操作中,读取到的数据应该是一致的。具体来说,当一个事务在执行读取操作时,如果另一个事务正在对同一数据进行修改(写操作),那么读取操作应该获取到已经提交的最新版本的数据,而不是读取到部分修改完成的数...
      99+
      2023-10-29
      数据库 读一致性 写一致性
    • 面试常问:如何保证Redis缓存和数据库的数据一致性
      目录一、一致性1、强一致性 2、弱一致性 3、最终一致性 二、redis缓存和mysql数据库数据一致性解决 1、方案一:采用延时双删策略2、方案二:一步更新缓存(基于订阅Binlo...
      99+
      2022-11-12
    • PHP与MySQL索引的数据变更和数据一致性的优化策略及其对性能的影响
      引言在Web开发中,PHP和MySQL是最常用的组合之一。针对大量数据的增删改查操作,索引的设计和优化是非常重要的。本文将介绍PHP与MySQL索引的数据变更和数据一致性的优化策略,并探讨这些策略对系统性能的影响,并提供相应的代码示例。一、...
      99+
      2023-10-21
      索引 性能影响 数据变更 一致性优化
    • Java并发编程数据库与缓存数据一致性方案是什么
      本文小编为大家详细介绍“Java并发编程数据库与缓存数据一致性方案是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java并发编程数据库与缓存数据一致性方案是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
      99+
      2023-06-29
    • 数据库缓存最终一致性的四种方案分别是什么
      这篇文章将为大家详细讲解有关数据库缓存最终一致性的四种方案分别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。背景缓存是软件开发中一个非常有用的概念,数...
      99+
      2022-10-19
    • PHP与MySQL索引的库存管理和数据更新策略及其对并发性能的影响
      引言:在数据库的应用中,高效的数据管理和更新策略对于保证系统的并发性能至关重要。本文将以PHP和MySQL为例,深入探讨索引在库存管理和数据更新中的应用,以及它们对并发性能的影响。文章将涵盖索引的基本原理、库存管理和数据更新策略的实现,同时...
      99+
      2023-10-21
      MySQL PHP 索引 关键词:
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作