MySQL的缓存策略

目录

一、MySQL 缓存方案用来干什么

二、提升MySQL访问性能的方式

1、读写分离(MySQL的主从复制)

2、连接池

3、异步连接

三、缓存方案是怎么解决的

1、缓存与MySQL一致性状态分析

2、制定热点数据的读写策略

四、缓存方案问题的解决方法

1、缓存穿透

2、缓存击穿

3、缓存雪崩

五、缓存方案的弊端


一、MySQL 缓存方案用来干什么

用来缓存用户定义的热点数据,用户直接从缓存获取热点数据,降低数据库的读写压力

我们都知道内存的读取速度是磁盘访问速度的十万倍,那么这个缓存方案适用于什么场景呢?

1、既然读取速度这么高,那么肯定就是读的需求远大于写的需求。

2、MySQL自身的缓冲层跟业务无关。MySQL中的缓存层也是用来缓存热点数据,但是这些数据包括索引、记录等。mysql 缓冲层是从自身出发,跟具体的业务无关,而不是缓存我们用户自己定义的热点数据

3、因此我们采用Redis作为我们的缓冲数据库,存放用户定义的热点数据。而MySQL只是作为项目的主要数据库,便于统计分析。

二、提升MySQL访问性能的方式

1、读写分离(MySQL的主从复制)

        什么是读写分离?我们设置多个从数据库,从数据库分布在多个不同的机器中,我们写的操作依然是在主数据库,而读的操作分给了从数据库,从数据库的数据都是来自主数据库。这样将读写进行分离,会解决主数据库读的压力。

        我之前的文章讲过主从之间如何进行同步。我们得知主从之间可能会存在数据不一致的情况,但是最终的数据是一样的,也就是可能会有延迟。比如博主写了一篇文章并且刚刚发布,但是我的朋友说还没有看到,我说你等个几秒就好了。对于这种情况就很适合这种方案(读取从数据库)。

        但是对于读的时效性很强的时候(一致性),我们就不可以读取从数据库了,而是直接读取主数据库。

2、连接池

        在MySQL中存在连接池的组件,比如两个客户端连接上来,但是我们使用多个线程去服务这几个客户端,可以大大提高并发访问数据库的能力,并且,连接池的资源是可以复用的,我们可以避免连接建立或断开,以及安全验证的开销。

        他的网络模型采用的并不是Reactor,而是select+阻塞io模型。对于上面所说的多个线程服务客户端,这里要特别注意,如果我们开启一个事务的话,一个事务内不是包含很多SQL语句嘛,我们要保证这些事务语句全部在一个线程内执行。

3、异步连接

        我们上面的连接池中讲到了网络模型采用的是 select + 非阻塞IO 。如果是阻塞IO的话也就是同步方式,我们发送多个SQL语句的话,他需要一个一个进行执行并且一个一个进行返回。

        但是我们采用异步的方式(非阻塞IO),我们发送多个命令,那么这些命令会异步执行,谁执行完毕,谁就通过回调函数进行返回,大大节省网络传输的时间。

三、缓存方案是怎么解决的

1、缓存与MySQL一致性状态分析

可行方案不可行方案
MySQL有,Redis无MySQL无,Redis有
都有,数据一致都有,数据不一致
都没有

        我们根据上面所讲述的主从复制,可以得知,MySQL中必须保存全部的数据,而Redis从数据库只是保存热点数据。那么我们来讨论上面这个表格的情况。

        可行方案中:MySQL有,Redis无。MySQL没有热点数据需要进行存储,所以Redis中没有数据,也就是说,用户查找的这个数据并不是热点数据。

        第二种方案:都有,数据一致。MySQL中包含热点数据,而且Redis中也包含热点数据,并且是一致的数据。这样我们查找从数据库的时候,就不会出现与主数据库查询不同的情况了。

        第三种:都没有。也就是说用户查找的这个数据是不存在的,所以在MySQL中也不存在。

        不可行方案:MySQL无,Redis有。我们讲的主从复制,需要保证写数据是写在主数据库中的,所以主数据库包含全部的信息,而从数据库是从主数据库中进行同步的。所以这种情况是不允许的。

        不可行方案:都有,数据不一致。我们讲的主从复制中也说到了从数据库与主数据库进行同步可能会有延迟,但是最终数据是一致的。这样就会导致我们可能读取从数据库的时候(读取热点数据)可能会导致与主数据库的数据不一致。

2、制定热点数据的读写策略

        对于读的策略比较简单,由于是热点数据,我们直接读取缓存(Redis),如果在Redis中找到了数据,那就直接返回。如果未找到,那就读取MySQL,如果在MySQL中读到数据,并且返回后,那就写入Redis。这里写入Redis中的是热点数据,并不是说,一查没有,一查没有,就全部写入Redis中。

写的策略分两种,一种是安全为主,一种是效率为主。

        如果要以安全为主,我们就要避免主数据库和从数据库读取的数据不同的问题。当我们先写入MySQL后,必然会出现MySQL与Redis数据不同的问题,那么我们就不能先写入MySQL。而是要先删除Redis中的数据,然后再写入MySQL,最后将MySQL中的数据同步到Redis中去,这样就保证两方的数据一致了。但是我们的缓存方案就是为了提升效率,现在却为了安全而降低了效率,这是我们不愿看到的。

        如果要以效率为主,我们可以先写入缓存,并且设置过期时间(大约是200毫秒),然后再写入MySQL,当写入MySQL后,我们再将MySQL中的数据同步到Redis中去。当同步到Redis中去的时候,这个过期时间也就到期了。过期时间是与MySQL网络传输时间+MySQL处理时间+MySQL同步到Redis的时间。有个问题是如果当写入MySQL写入失败,这个时候Redis中含有数据,那么他就会提供脏数据。但是这个问题也就200毫秒的存活时间,因为从数据库会找主数据库进行同步。

四、缓存方案问题的解决方法

1、缓存穿透

        问题:如果黑客让客户端一直读取MySQL和Redis中都不存在的数据,那么所有的读取操作都落在了MySQL中,那么就会造成MySQL中访问的性能急剧降低。

        解决:如果在Redis和MySQL中读取的数据都不存在,那么就在Redis中设置一个<Key,nil>,代表查找的这个热点数据不存在。或者部署布隆过滤器(类似于哈希表),使这些数据只能增加,不能删除,具体可以搜一搜。

2、缓存击穿

        问题:如果Redis中没有,但是MySQL中有,也就是说本来一个热点数据,在Redis中存在,但是过期了,那么大量的并发请求读取操作就会落到MySQL中,这样就造成MySQL访问的性能急剧降低。

        解决:我们可以将过热的数据设置成不过期的状态。或者是添加分布式锁,将并发的请求操作,变成串行执行。

3、缓存雪崩

        问题:我们在写入Redis中的数据是需要加入过期时间的,但是当我们不小心将多个过热数据的过期时间设置成统一时间,就会面临大量热点数据集中失效的问题,虽然失效,但是在MySQL中还是存在这个数据,所以大量的请求读取操作就会落到MySQL中去,就会造成MySQL访问性能急剧降低。

        解决:我们可以将这个过期时间给错开,避免同时过期。当然我们可以在重启MySQL的时候,先将一些热数据先缓存到Redis中。

五、缓存方案的弊端

        我们上面讲到一个问题就是,不能支持多语句的事务,如果要支持的话,需要保证begin到commit之间的全部语句都在一条线程中执行。而且Redis不支持回滚,并且有时候会造成Redis与MySQL数据不一致。

感谢大家的观看!0voice · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/145962.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

正点原子阿尔法ARM开发板-IMX6ULL(八)——串口通信(寄存器解释)(补:有源蜂鸣器)

文章目录 一、蜂鸣器&#xff08;待&#xff0c;理解&#xff09;1.1 第一行1.2 第二行1.3 第三行 二、串口原理2.1 通信格式2.2 UART寄存器 一、蜂鸣器&#xff08;待&#xff0c;理解&#xff09; 1.1 第一行 对于第一行&#xff0c;首先先到fsl_iomuxc文件里面寻找IOMUXC_S…

人力资源数据集分析(一)_t-test、卡方检验和描述性统计

数据入口&#xff1a;人力资源分析数据集 - Heywhale.com 数据说明 字段说明EmpID唯一的员工IDAge年龄AgeGroup年龄组Attrition是否离职BusinessTravel出差&#xff1a;很少、频繁、不出差DailyRate日薪Department任职部门&#xff1a;研发部门、销售部门、人力资源部门Dista…

【VUE3.0】如何得到一张像素风格的图片?

目录 引言网络途径获取代码转换已有的图片0. 先看效果1. 上传图片&#xff0c;这个没什么好说的&#xff0c;前端上传图片基本操作。2. 通过滑动条提供一个1-10的数字&#xff0c;用于放缩图片画质。3. 函数拿到图片资源后先对图片进行缩小100倍尺寸处理&#xff0c;此时画质已…

服务器非法关闭后MySQL服务启动失败

在写这篇文章前&#xff0c;我弄好了&#xff0c;写完之后把成功安装的几个MySQL都删除了&#xff0c;只留了最后测试成功的服务“mysql-test” ,然后点击运行&#xff0c;发现又出现上图的错误。心态炸了。 本以为定位到问题了&#xff0c;但是这个错误让我迷茫了。我只能临时…

为什么你的广告规模无法扩大

许多跑facebook的广告主可能都遇到过这样的情况&#xff0c;小额测试广告的时候效果不错&#xff0c;一旦加预算想扩大规模广告往往就会崩掉&#xff0c;始终无法把广告提升一个level,如果你尝试了很多投放策略调整都无法挽救的话&#xff0c;可能问题是出在广告素材上。 对于一…

多重指针变量(n重指针变量)实例分析

0 前言 指针之于C语言&#xff0c;就像子弹于枪械。没了子弹的枪械虽然可以用来肉搏&#xff0c;却失去了迅速解决、优雅解决战斗的能力。但上了膛的枪械也非常危险&#xff0c;时刻要注意是否上了保险&#xff0c;使用C语言的指针也是如此&#xff0c;要万分小心&#xff0c;…

杀死端口占用的进程

1、查看端口的进程&#xff0c;以9023为例 &#xff08;1&#xff09;方法1 netstat -tunpl|grep 9023 &#xff08;2&#xff09;方法2 ss -tulpan |grep 9023 &#xff08;3&#xff09;方法3 netstat -ntlp |grep 9023 &#xff08;4&#xff09;方法4 lsof -i:9023 …

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module&#xff0c;Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G&#xff0c;不建议复现

变压器空载时是否有必要做无功补偿

在电力系统中&#xff0c;变压器作为关键设备之一&#xff0c;其运行状态对整个系统的功率质量和效率具有重要影响。关于“变压器空载时是否有必要做无功补偿”这一问题&#xff0c;答案取决于具体的应用场景、系统需求以及经济性考虑。以下将从变压器空载特性、无功补偿的原理…

360手机黑科技“位置穿越”功能修复 360位置穿越使用

​ 360手机刷机 360手机黑科技 360手机位置穿越 360手机位置修复 360手机站&#xff1a;360os.top 资源免费下载: os.360os.top 备用资源站&#xff1a;360手机-360手机刷机RootTwrp 360手机位置穿越 360手机位置穿越‌&#xff0c;是一款虚拟定位软件&#xff0c;无需进行r…

毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

块匹配算法简介(上)

图像中的运动估计方法大致分为两类:光流法和块匹配算法(BMA,Block Matching Algorithm)。本文将介绍BMA的相关内容,包括基本原理、相似度计算准则与常见的几种搜索方法,如三步法、四步法、钻石搜索法等。 1. 背景 视频中相邻帧往往存在大量的相似内容,即只有局部的一些…

算法课习题汇总(2)

整数划分问题 将正整数n表示成一系列正整数之和&#xff0c;nn1n2…nk(n1>n2>…>nk,k>1)。正整数n的这种表示称为正整数n的划分。 思路&#xff1a; n表示待划分数&#xff0c;m表示最大减数。 #include<iostream> using namespace std;int q(int n, int…

JIT(即时编译)技术

介绍一下JIT优化技术&#xff1f; 想要把高级语言转变成计算机认识的机器语言有两种方式&#xff0c;分别是编译和解释&#xff0c;虽然Java转成机器语言的过程中有一个步骤是要编译成字节码&#xff0c;但是&#xff0c;这里的字节码并不能在机器上直接执行。 JVM中内置了 解释…

记软件开发者画图(UML),使用WPS应用制图

目录 前言 一、什么是UML 二、使用什么画图工具 三、示例 ​四、IntelliJ IDEA 2021快速生成UML图 前言 做软件开发的从写第一个示例程序到最后写项目程序避不开的需要设计画图&#xff0c;所以今天我们就来梳理一下‌UML&#xff08;统一建模语言&#xff09;图形需要画…

LINUX网络编程:TCP(1)

目录 1.认识Tcp的报头 2.确认应答机制&#xff08;ACK&#xff09; 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号&#xff0c;之后会介…

T9-猫狗识别2(暂时版qaq)

T9周&#xff1a;猫狗识别2 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****七、预测**八、总结&#xff08;暂时&#xff09; &…

倒排索引(反向索引)

倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎和数据库管理系统中常用的一种数据结构&#xff0c;用于快速检索文档集合中的文档。在全文搜索场景中&#xff0c;倒排索引是一种非常高效的手段&#xff0c;因为它能够快速定位到包含特定关键词的所有文档。 1、基本…

【Python技术】使用akshare、pyecharts绘制K线图

下班回到家&#xff0c;回家途中瞄了下股票&#xff0c;大盘又是3000多只股票待涨&#xff0c; 盘中上证指数一度跌破2700。 估计不少人心里不爽&#xff0c;那就聊聊相关技术学习下。 之前写过【python技术】使用akshare、pandas、mplfinance绘制红绿色K线图简单示例 &#x…

Android Retrofit源码分析(一):Retrofit是什么?和OkHttp的区别是什么?为什么需要他?

目录 一、Retrofit是什么? Retrofit是一个基于OKHttp的RESTful网络请求框架,由Square公司开源,专为Android和Java提供类型安全的HTTP客户端。它可以理解为OKHttp的加强版,底层封装了OKHttp,主要负责网络请求接口的封装,使得网络请求工作更加简洁高效。 简单来说,Retro…