如何解决Redis缓存和MySQL数据一致性的问题?[通俗易懂]

如何解决Redis缓存和MySQL数据一致性的问题?

大家好,又见面了,我是全栈君。

在高并发的业务场景下,数据库的性能瓶颈往往都是用户并发访问过大。所以,一般都使用redis做一个缓冲操作,让请求先访问到redis,而不是直接去访问MySQL等数据库。从而减少网络请求的延迟响应

如何解决Redis缓存和MySQL数据一致性的问题?[通俗易懂]

数据为什么会不一致

这样的问题主要是在并发读写访问的时候,缓存和数据相互交叉执行。

一、单库情况下

同一时刻发生了并发读写请求,例如为A(写) B (读)2个请求

如何解决Redis缓存和MySQL数据一致性的问题?[通俗易懂]

  1. A请求发送一个写操作到服务端,第一步会淘汰cache,然后因为各种原因卡主了,不在执行后面业务(例:大量的业务操作、调用其他服务处理消耗了1s)。

  2. B请求发送一个读操作,读cache,因为cache淘汰,所以为空

  3. B请求继续读DB,读出一个脏数据,并写入cache

  4. A请求终于执行完全,在写入数据到DB

    总结:因最后才把写操作数据入DB,并没同步。cache里面一直保持脏数据

    脏数据是指源系统中的数据不在给定的范围内或对于实际业务毫无意义,或是数据格式非法,以及在源系统中存在不规范的编码和含糊的业务逻辑。

二、主从同步,读写分离的情况下,读从库而产生脏数据

如何解决Redis缓存和MySQL数据一致性的问题?[通俗易懂]

  1. A请求发送一个写操作到服务端,第一步会淘汰cache

  2. A请求写主数据库,写了最新的数据。

  3. B请求发送一个读操作,读cache,因为cache淘汰,所以为空

  4. B请求继续读DB,读的是从库,此时主从同步还没同步成功。读出脏数据,然后脏数据入cache

  5. 最后数据库主从同步完成

    总结:这种情况下请求A和请求B操作时序没问题,是主从同步的时延问题(假设1s),导致读请求读取从库读到脏数据导致的不一致

根本原因:

单库下,逻辑处理中消耗1s。可能读到旧数据入缓存

主从+读写分离,在1s的主从同步时延中。读到从库的旧数据入缓存

 

数据优化方案

如何解决Redis缓存和MySQL数据一致性的问题?[通俗易懂]

一、缓存双淘汰法

  1. 先淘汰缓存

  2. 再写数据库

  3. 往消息总线esb发送一个淘汰消息,发送立即返回。写请求的处理时间几乎没有增加,这个方法淘汰了缓存两次。因此被称为“缓存双淘汰法“,而在消息总线下游,有一个异步淘汰缓存的消费者,在拿到淘汰消息在1s后淘汰缓存,这样,即使在一秒内有脏数据入缓存,也能够被淘汰掉。

二、异步淘汰缓存

上述的步骤,都是在业务线里面执行,新增一个线下的读取binlog异步淘汰缓存模块,读取binlog总的数据,然后进行异步淘汰。

如何解决Redis缓存和MySQL数据一致性的问题?[通俗易懂]

1.思路:

MySQL binlog增量发布订阅消费+消息队列+增量数据更新到redis

1)读请求走Redis:热数据基本都在Redis

2)写请求走MySQL: 增删改都操作MySQL

3)更新Redis数据:MySQ的数据操作binlog,来更新到Redis

2.Redis更新

1)数据操作主要分为两块:

  • 一个是全量(将全部数据一次写入到redis)

  • 一个是增量(实时更新)

这里说的是增量,指的是mysql的update、insert、delate变更数据。

这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。就无需在从业务线去操作缓存内容

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111871.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • java数据库系统开发案例精选_Java解析db文件

    java数据库系统开发案例精选_Java解析db文件JAVADB数据库范例关于javaDB的介绍就不说了,直接上例子。首先将derby.jar添加到classpath下面(IDE的话直接引入)importjava.sql.*;importjava.util.*;importjava.io.*;publicclassTest{publicstaticvoidmain(String[]args)throwsException{DB…

    2022年10月25日
  • 【Win10系统】Win10系统无线网消失,更改适配器只有以太网,找不到WLAN怎么解决?

    【Win10系统】Win10系统无线网消失,更改适配器只有以太网,找不到WLAN怎么解决?已经快三天了,不想重装系统,前天早上起床打开电脑突然发现右下角网络只有一个飞行模式,旁边的WLAN消失了,到网络属性中更改适配器设置也没找到,几乎试了网上所有的解决办法。1.网络重置2.cmd命令netshwinsockreset3.关机-断电-拔电池或者插拔网卡(未尝试,还要拆螺丝,麻烦)4.services.msc启动那几个服务项5.开飞行模式,重启,关飞行模式6.CClea…

  • CentOS7安装MySQL8.0图文教程

    CentOS7安装MySQL8.0图文教程1.下载MySQL所需要的安装包      网址:https://dev.mysql.com/downloads/mysql/2.SelectOperatingSystem:选择RedHat,CentOS是基于红帽的,SelectOSVersion:选择linux73.选择RPMBundle点击Download4.点击 Noth…

  • Srvctl命令详解(10g)「建议收藏」

    Srvctl命令详解(10g)「建议收藏」Srvctl命令 Srvctl命令式RAC维护中最常用的命令也是最复杂的命令。这个工具用来维护一下几种资源:Database,Instance,ASM,Service,Listener和NodeApplication,nodeApplication又包括GSD,ONS,VIP。 Srvctl命令的用法: [root@felix2bin]#./srvctl-help…

  • pycharm打包python项目_pycharm 打包与在线上传文件「建议收藏」

    pycharm打包python项目_pycharm 打包与在线上传文件「建议收藏」大致分为以下两部分1.本地操作将包文件按照标准格式进行规范处理、打包备份项目开发过程中:经常会涉及到备份操作常规:通过tar命令,将程序文件压缩备份较常见:可以通过系统提供的打包操作,将文件自动按照标准化格式存储2.远程操作[专门用于协同]将包文件进行标准化构建将包文件进行打包处理上传发布到网络上具体操作以下以一个例子作为说明image.png1。在包文件中,添加一个构建模块setup.pyim…

  • 英文字体 艺术_英文字体免费商用

    英文字体 艺术_英文字体免费商用今天分享字体集合特别分享给平面设计师。在这篇文章中,你可以找到25款新鲜出炉的免费英文艺术字体。在之前,我发表了众多高品质字体相关的文章,有手写字体、空心字体、火焰字体、简历字体、涂鸦字体、节日字体、

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号