如何解决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进行更新。就无需在从业务线去操作缓存内容

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++基础篇 — vector的resize函数和reserve函数

    对于C++的vector容器模板类,存在size和capacity这样两个概念,可以分别通过vector的size()和capacity()方法获得该vector当前的size和capacity值。相应的,vector提供了两个方法来分别对size和capacity进行操作,它们就是resize方法和reserve方法。首先,对于size和capacity,这是两个比较容易混淆的概念。

    2022年4月7日
    95
  • iOS自动化之WDA(WebDriverAgent)安装

    iOS自动化之WDA(WebDriverAgent)安装1、WDA介绍WebDriverAgent在iOS端实现了一个WebDriverserver,借助这个server我们可以远程控制iOS设备。你可以启动、杀死应用,点击、滚动视图

    2022年7月4日
    51
  • protostuff java_protostuff

    protostuff java_protostuff软件简介protostuff是一个支持各种格式的一个序列化Java类库,包括JSON、XML、YAML等格式。示例代码:publicclassUserSchemaimplementsSchema{publicbooleanisInitialized(Useruser){returnuser.getEmail()!=null;}publicvoidmergeFrom(In…

    2022年5月2日
    41
  • jenkins拉取gitlab代码_git更新本地代码和远程仓库一致

    jenkins拉取gitlab代码_git更新本地代码和远程仓库一致前言python自动化的脚本开发完成后需提交到git代码仓库,接下来就是用Jenkins拉取代码去构建自动化代码了新建项目打开Jenkins新建一个自由风格的项目源码管理Repository

    2022年7月28日
    4
  • upload通关手册

    uploadlabs通关0x00前言这段时间一直在忙,没时间来更新文章,这里就写篇uploadlabs的通关手册吧,现在包括网上也有很多upload通关手册,但是在这里还是想自己去写一篇,来

    2021年12月11日
    51
  • 行为动作识别

    行为动作识别随着计算机学科与人工智能的发展和应用,视频分析技术迅速兴起并得到了广泛关注。视频分析中的一个核心就是人体行为识别,行为识别的准确性和快速性将直接影响视频分析系统后续工作的结果。因此,如何提高视频中人体行为识别的准确性和快速性,已成为视频分析系统研究中的重点问题。目前,典型的视频人体行为识别方法主要有:时空兴趣点、密集轨迹等。其中:时空兴趣点,是通过检测视频中的角点、提取角点的特征进行人体行…

    2022年6月21日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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