我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

    一、更新策略

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

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

    二、读写缓存

    1、同步直写策略

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

    2、异步缓写策略

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

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

    三、双检加锁策略

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

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

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

    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缓存一致性的更新策略是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

    下载Word文档

    猜你喜欢

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

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

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

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

    保证Redis缓存与数据库一致性的方法是什么

    本文小编为大家详细介绍“保证Redis缓存与数据库一致性的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“保证Redis缓存与数据库一致性的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、四
    2023-07-05

    Redis缓存和数据库的数据一致性的问题解决

    目录前言一、谈谈一致性二、 情景分析2.1 针对读场景2.2 针对写场景三、同步策略3.1 先更新缓存,再更新数据库3.2 先更新数据库,再更新缓存3.3 先删除缓存,后更新数据库3.4 先更新数据库,后删除缓存四、解决办法4.1 双写一致
    Redis缓存和数据库的数据一致性的问题解决
    2024-09-20

    怎么保证缓存和数据库的数据一致性

    本篇内容主要讲解“怎么保证缓存和数据库的数据一致性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么保证缓存和数据库的数据一致性”吧!1、错误的解决方案1.1、 先更新数据库,再删除缓存若数据库
    2023-04-21

    Java并发编程数据库与缓存数据一致性方案是什么

    本文小编为大家详细介绍“Java并发编程数据库与缓存数据一致性方案是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java并发编程数据库与缓存数据一致性方案是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
    2023-06-29

    redis和数据库数据保持一致的方法是什么

    保持Redis和数据库数据一致有几种方法:使用消息队列:可以通过在数据库中的数据发生变化时将消息发送到消息队列中,然后在Redis中订阅这些消息,在Redis中同步更新数据。使用定时任务:可以定期检查数据库中的数据是否有变化,并将变化的数据
    redis和数据库数据保持一致的方法是什么
    2024-04-09

    PHP与MySQL索引的数据变更和数据一致性的优化策略及其对性能的影响

    引言在Web开发中,PHP和MySQL是最常用的组合之一。针对大量数据的增删改查操作,索引的设计和优化是非常重要的。本文将介绍PHP与MySQL索引的数据变更和数据一致性的优化策略,并探讨这些策略对系统性能的影响,并提供相应的代码示例。一、
    2023-10-21

    PHP与MySQL索引的库存管理和数据更新策略及其对并发性能的影响

    引言:在数据库的应用中,高效的数据管理和更新策略对于保证系统的并发性能至关重要。本文将以PHP和MySQL为例,深入探讨索引在库存管理和数据更新中的应用,以及它们对并发性能的影响。文章将涵盖索引的基本原理、库存管理和数据更新策略的实现,同时
    2023-10-21

    编程热搜

    目录