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

数据为什么会不一致

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

一、单库情况下

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

  • A请求发送一个写操作到服务端,第一步会淘汰cache,然后因为各种原因卡主了,不在执行后面业务(例:大量的业务操作、调用其他服务处理消耗了1s)。
  • B请求发送一个读操作,读cache,因为cache淘汰,所以为空
  • B请求继续读DB,读出一个脏数据,并写入cache
  • A请求终于执行完全,在写入数据到DB

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

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

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

  • A请求发送一个写操作到服务端,第一步会淘汰cache
  • A请求写主数据库,写了最新的数据。
  • B请求发送一个读操作,读cache,因为cache淘汰,所以为空
  • B请求继续读DB,读的是从库,此时主从同步还没同步成功。读出脏数据,然后脏数据入cache
  • 最后数据库主从同步完成

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

根本原因:

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

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

数据优化方案

一、缓存双淘汰法

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

二、异步淘汰缓存

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

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

系统的学习PHP

1、全流程开发 TP6.0实战高并发电商服务系统2、产品经理高清实战3、设计模式实例剖析与深入解读4、Git&GitHub视频教程5、Redis实战6、SQL 注入及如何防止

【下载地址】

链接:https://pan.baidu.com/s/1v5gm7n0L7TGyejCmQrMh2g 提取码:x2p5

免费分享,但是X度限制严重,如若链接失效点击链接或搜索加群 群号518475424。

easyexcel写入数据为空_如何解决Redis缓存和MySQL数据一致性的问题?相关推荐

  1. Redis系列教程(三):如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题

    Java相关的面试都会问到缓存的问题:史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等,除此之外还会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等不常见的问题,但却是非 ...

  2. java雪崩_【并发编程】java 如何解决redis缓存穿透、缓存雪崩(高性能示例代码)...

    [并发编程]java 如何解决redis缓存穿透.缓存雪崩(高性能示例代码) 发布时间:2018-11-22 16:48, 浏览次数:872 , 标签: java redis <>缓存穿透 ...

  3. 清空缓存的命令_布隆过滤器应用——解决Redis缓存穿透问题

    1. 布隆过滤器 简要介绍布隆过滤器的概念和特点,详细知识请参考几篇参考文献或其它文章. 1.1 概念 简单点说,布隆过滤器本质是一个位数组. 当一个元素加入过滤器时,使用多个hash函数对元素求值, ...

  4. 解决Redis缓存穿透之布隆过滤器详解

    文章目录 1. 什么是Bloom Filter(布隆过滤器) 1.1 布隆过滤器优点 1.2 布隆过滤器缺点 1.3 布隆过滤器使用场景 1.4 布隆过滤器检索过程 1.5 布隆过滤器的算法描述 2. ...

  5. python xlwt包写入数据到excel文件出错解决办法

    #调试环境 debian10,python3.7,pycharm 2020.1 读取excel文件内容 # import xlrd import xlwt # workbook=xlrd.open_w ...

  6. mysql数据库插入数据为空_用java向mysql数据库中插入数据为空

    利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util ...

  7. phpstudy mysql端口_完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存...

    今天学习php,当然是要先安装好运行环境了,phpstyudy是一个运行php的集成环境, 一键安装对新手很友好,与时作为一个新手,便跟着教程安装了phpstudy集成环境. 很快安装好了,嗯.对新手 ...

  8. net.conn read 判断数据读取完毕_高并发:缓存模式以及缓存的数据一致性

    缓存由于其高性能,支持高并发的特性,在高并发的项目中不可或缺.被大家广泛使用的有Redis,Memcached等.本文主要探讨几种常见的缓存的读写模式,以及如何来保证缓存和数据库的数据一致性. 这里大 ...

  9. mysql删除端口配置文件_完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存...

    今天学习php,当然是要先安装好运行环境了,phpstyudy是一个运行php的集成环境, 一键安装对新手很友好,与时作为一个新手,便跟着教程安装了phpstudy集成环境. 很快安装好了,嗯.对新手 ...

最新文章

  1. javaBeen的四个作用范围
  2. QTableWidgetble自定义表头排序设置
  3. golang的错误汇总
  4. 【计组实验】P4 Verilog多周期处理器微系统 MIPS指令集
  5. 数据库开发技术java方向_Java开发工程师(Web方向) - 03.数据库开发 - 第5章.MyBatis...
  6. Django之项目搭建和配置总结(一)
  7. LeetCode 2007. 从双倍数组中还原原数组(map)
  8. setdata改数组里的值 微信小程序_今日艰难笔记redux小程序随记
  9. eureka注册中心之服务提供者
  10. 请教一个ghost恢复的问题
  11. 使用 ExpandableListView 实现折叠ListView
  12. linux 百度云 备份软件下载,百度云存储api实现文件分享及linux下的备份上传
  13. AtCoder Beginner Contest 136 解题报告
  14. ASP.NET验证控件之RegularExpressionValidator
  15. 2019Q1中高端人才报告:薪资TOP10,平均年薪超23万元
  16. 视频教程-Python实现自己的分布式区块链视频教程-区块链
  17. Oracle数据库的备份方法
  18. win7安装OneNote
  19. Python-Scrapy 获取历史双色球开奖号码
  20. 申宝股票-三大指数震荡下行

热门文章

  1. 结构体转char[]
  2. torch tensor用法
  3. Windows下VS2015 MPI编译64位Boost1.64
  4. 流媒体服务器 客户端播放器方案推荐
  5. qt5 中文乱码解决
  6. 【8】青龙面板系列教程之nolanjdc的一键安装获取cookie【作者删库了,不用尝试了】
  7. 企业内网中的WSUS更新服务 服务器连接到Microsoft Update来获取更新程序
  8. angular监听图片加载完成_angular1.0 如何监听页面渲染完毕 (转)
  9. 编译boost时 cmake的debug:math命令无法解析“*”号
  10. Linux中变量#,#,@,0,0,1,2,2,*,$$,$?的含义