MySQL的缓存策略

news2024/11/15 9:50:08

目录

一、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.coloradmin.cn/o/2150184.html

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

相关文章

Python画笔案例-055 绘制七彩浪花

1、绘制七彩浪花 通过 python 的turtle 库绘制 七彩浪花&#xff0c;如下图&#xff1a; 2、实现代码 绘制七彩浪花&#xff0c;以下为实现代码&#xff1a; """七彩浪花.py """ import turtlecs [red,orange,yellow,green,cyan,blue,magenta]…

网络流之最大流(EK 模板)

EK的时间复杂度是O( )。 EK 算法 和 dinic 算法的区别是 &#xff1a;EK是通过 bfs 找到一条增广流&#xff0c;然后累加&#xff0c;循环此步骤直到 bfs 找不到增广流&#xff1b;而 dinic 算法 是通过 bfs 分层找到一条增广流&#xff0c;然后通过 dfs 跑完 当前分层图中所…

Redis基本命令详解

1. 基本命令 命令不区分大小写&#xff0c;而key是区分大小写的 # select 数据库间的切换 数据库共计16个 127.0.0.1:6379> select 1# dbsize 返回当前数据库的 key 的数量 127.0.0.1:6379[1]> dbsize# keys * 查看数据库所有的key 127.0.0.1:6379[1]> keys *# fl…

[Spring]Spring MVC 请求和响应及用到的注解

文章目录 一. Maven二. SpringBoot三. Spring MVC四. MVC注解1. RequestMapping2. RequestParam3. PathVariable4. RequestPart5. CookieValue6. SessionAttribute7. RequestHeader8. RestController9. ResponseBody 五. 请求六. 响应 一. Maven Maven是⼀个项⽬管理⼯具。基于…

qwen2.5 vllm推理;openai function call调用中文离线agents使用

参考: https://qwenlm.github.io/zh/blog/qwen2.5/ https://qwen.readthedocs.io/zh-cn/latest/framework/function_call.html#vllm 安装: pip install -U vllm -i https://pypi.tuna.tsinghua.edu.cn/simplevllm-0.6.1.post2 运行:</

预测合理交易目标:中断形态趋势分析

日常交易时&#xff0c;我们除了通过判断一些重要指标来预测趋势走向之外&#xff0c;观察趋势的形态变化也是我们技术分析中很重要的分析方式。而识别并理解这些形态可以为交易者提供进出场的关键信号。今天我们就来说说其中一种形态——中断形态&#xff01; 中继形态在市场…

使用 Python 高分解决 reCAPTCHA v3 的指南

reCAPTCHA v3 是自动化系统面临的最具挑战性的障碍之一。随着越来越多的网站实施高级 CAPTCHA 系统来抵御机器人&#xff0c;在 reCAPTCHA v3 中获得高分对于成功的自动化至关重要。本指南将引导您了解有效的策略和 Python 技术&#xff0c;以高分解决 reCAPTCHA v3&#xff0c…

10000字长文,深度解读!人工智能AI 产品经理与传统产品经理工作到底有什么不同?

一、AI 产品经理的定义及职责范围 AI 产品经理是直接应用或间接涉及了 AI 技术&#xff0c;进而完成相关 AI 产品的设计、研发、推广、产品生命周期管理等工作的产品经理。具体来说&#xff0c;狭义 AI 产品经理直接应用了语义、语音、计算机视觉和机器学习这 4 个领域的 AI 技…

机器学习之非监督学习(四)K-means 聚类算法

机器学习之非监督学习&#xff08;一&#xff09;K-means 聚类算法 0. 文章传送1.非监督学习定义2.非监督学习分类2.1 聚类 Clustering2.2 异常检测 Anomaly Detection 3.K-means聚类算法 K-means clustering案例引入算法步骤算法优化成本函数初始化方法K的选择 代码实现 4.案例…

Unity教程(十六)敌人攻击状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

C++STL的Stack的使用:STL栈和队列的使用介绍、leecode---最小栈、nowcoder---栈的压入、弹出序列等的介绍

文章目录 前言一、STL栈和队列的使用二、leetcode---最小栈三、nowcoder---栈的压入、弹出序列总结 前言 CSTL的Stack的使用&#xff1a;STL栈和队列的使用介绍、leecode—最小栈、nowcoder—栈的压入、弹出序列等的介绍 一、STL栈和队列的使用 #include <iostream> #in…

PCL KD树的使用

目录 一、概述 1.1原理 1.1.1 数据拆分过程 1.1.2 树的构建示例 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1KD树构建与查询&#xff1a; 2.1.2 k近邻搜索 2.1.3半径搜索 2.2完整代码 三、实现效果 3.1处理后点云 3.2数据显示 PCL点云算法汇总及实战…

Jboss Administration Console弱⼝令

漏洞描述 Administration Console管理⻚⾯存在弱⼝令&#xff0c;admin:admin&#xff0c;登陆后台上传war包 , getshell 影响版本 全版本 环境搭建 因为这⾥⽤的环境是CVE-2017-12149的靶机 cd vulhub-master/jboss/CVE-2017-12149 docker-compose up -d 密码⽂件 /j…

【SA8155P】AIS Camera相关内容的简单介绍

高通车载相机模块(AIS,Automotive lmage System)是专门针对车载系统特性而设计的一套车载视觉架构,可用于AVM、RVC、DMS等常见车载视频应用开发。车载Camera系统的图像大部分是给自动驾驶等使用,更多考虑的是远距离传输、多摄像头图像处理等场景。 本文仅对AIS Camera相关…

MySQL的登陆错误:ERROR 1049 (42000): Unknown database ‘root‘

MySQL的登陆错误&#xff1a;ERROR 1049 (42000): Unknown database ‘root’ 安装MySQL的时候&#xff0c;到网上查的命令行登陆MySQL的方法都是mysql -u root -p password mysql -r root -p 123456但是奇怪的是这条命令我输进去死活都不对&#xff0c;它都会要求再输入一遍…

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务&#xff0c;2211实际是ssh协议端口&#xff0c;80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…

从0开始学ARM

1. ARM模式和寄存器 1.1 ARM处理器工作模式 Cortex系列之前的ARM处理器工作模式一共有7种。 1.1.1 工作模式 Cortex系列的ARM处理器工作模式有8种&#xff0c;多了1个monitor模式&#xff0c;如下图所示&#xff1a; ARM之所以设计出这么多种模式出来&#xff0c;就是为了…

三菱变频器RS-485 端子的接线和构成

RS-485 端子排列 RS-485 端子接线方法 RS-485 的计算机1台、变频器1台时 RS-485 的计算机1台、变频器n台(多台)时 通讯运行的初始设定 1、为使变频器和计算机进行 RS-485 通讯&#xff0c;进行必要的设定。 2、通讯分为使用变频器的PU接口的通讯和使用RS-485端子的通讯。 3、…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(四)-搜索

搜索 搜索内容比较多&#xff0c;onesearch分成两部分&#xff0c;第一部分&#xff0c;Query构建&#xff0c;其中包括搜索词设置&#xff0c;设置返回字段&#xff0c;filter&#xff0c;高亮&#xff1b;第二部分分页和排序。第一部分是映射引擎负责&#xff0c;映射通用表…

SAP B1 流程实操 - 营销单据销售部分(下)

背景 在 SAP B1 中&#xff0c;最重要的模块就是【销售】&#xff0c;企业可能不涉及生产和库存&#xff08;贸易公司&#xff09;&#xff0c;甚至不涉及采购&#xff08;服务业&#xff09;&#xff0c;但是一定会有基本的 销售。本文中我们讲解 销售 模块的基本核心&#x…