MySQL(五)缓存策略

news2024/11/15 19:51:41

MySQL系列文章

MySQL(一)基本架构、SQL语句操作、试图
MySQL(二)索引原理以及优化
MySQL(三)SQL优化、Buffer pool、Change buffer
MySQL(四)事务原理及分析
MySQL(五)缓存策略
MySQL(六)主从复制
数据库三范式


文章目录

  • MySQL系列文章
  • mysql为什么需要缓存?
  • mysql缓存的使用场景?
  • 为什么需要缓冲层?
  • 缓冲层的选择
  • 总结
  • 缓冲层存在的问题
  • 读写策略
  • 同步方案
    • 触发器+UDF函数
    • 伪装数据库
  • 缓存异常情况
    • 缓存穿透
    • 缓存击穿
    • 缓存雪崩
  • 缓存的弊端
  • 连接池问题

mysql为什么需要缓存?

当随着业务的扩大,数据量逐渐增大,会增加mysql读写压力。
一般在中间增加redis作为mysql的缓存。
mysql缓存方案:缓存用户定义的热点数据,用户直接从缓存获取热点数据,降低数据的读压力。

mysql缓存的使用场景?

内存访问速度是磁盘速度的10万倍(数量级)
读的需求远远大于写的需求
MySQL自身缓冲层跟业务无关(比如buffer pool)
MySQL作为项目主要数据库,便于统计分析
缓存数据库作为辅助数据库,存放热点数据

为什么需要缓冲层?

读多写少,单个主节点能支撑项目数据量;数据的主要依据是 mysql;

缓冲层的选择

缓存数据库可以选用 redis,memcached;它们所有数据都存储在内存当中,当然也可以将内存当中的数据持久化到磁盘当中;

总结

  • 由于 mysql 的缓冲层不由用户来控制,也就是不能由用户来控制缓存具体数据;
  • 访问磁盘的速度比较慢,尽量获取数据从内存中获取,所以需要缓存从内存中读取;
  • 主要解决读的性能;因为写没必要优化,必须让数据正确的落盘;如果写性能出现问题,那么可以使用横向扩展集群方式来解决;
  • 项目中需要存储的数据应该远大于内存的容量,同时需要进行数据统计分析,所以数据存储获取的依据应该是关系型数据库;
  • 缓存数据库可以存储用户自定义的热点数据;以下的讨论都是基于热点数据的同步问题;
    在这里插入图片描述

缓冲层存在的问题

没有缓冲层之前,我们对数据的读写都是基于 mysql;所以不存在同步问题;
引入缓冲层后,我们对数据的获取需要分别操作缓存数据库和 mysql;那么这个时候数据可能存在几个状态?

  1. mysql 有,缓存无
  2. mysql 无,缓存有
  3. 都有,但数据不一致
  4. 都有,数据一致
  5. 都没有
    其中1、4、5都可以接受的状态,需要制定读写策略来避免2,3情况的产生。

读写策略

读策略:先读redis:没命中数据,则读Mysql;redis有数据,则直接返回。
读Mysql中:没命中数据,则返回没有;命中数据,则将Mysql读到的数据同步到redis。
写策略:分为安全优先和效率优先两种(insert,update,delete)
安全优先:删除缓存,然后写mysql,接着mysql把数据同步到redis
效率优先:先写redis,如果是插入和更新操作,把key设置过期时间(比如200ms),然后再写mysql,最后mysql同步到redis。(安全问题只会影响200ms)。

通过读写策略可以解决缓冲层的问题,但是在MySQL数据同步到redis时有一些同步方案。

同步方案

  1. 触发器+UDF函数
  2. 伪装数据库

触发器+UDF函数

步骤:

  1. 在MySQL中对要操作的数据设置触发器Trigger,监听操作
  2. 客户端(NodeServer)向MySQL中写入数据时,触发器会被触发,触发之后调用MySQL的UDF函数
  3. UDF函数可以把数据写入到Redis中,从而达到同步的效果
    结果分析:
    这种方案适合于读多写少,并且不存并发写的场景
    因为MySQL触发器本身就会造成效率的降低,如果一个表经常被操作,这种方案显示是不合适的

伪装数据库

伪装数据库伪装成从数据库从MySQL中读取binlog数据,数据库读取到数据之后,解析Bin log,然后将数据写入写入同步到Redis中,然后客户端从Redis读数据。
阿里巴巴开源了一个Canal就是作为伪装数据库解决同步问题。
工作原理
canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
mysql master收到dump请求,开始推送binary log给slave(也就是canal)
canal解析binary log对象(原始为byte流)

缓存异常情况

缓存穿透

假设某个数据 redis 不存在,mysql 也不存在,而且一直尝试读怎么办?缓存穿透,数据最终压力依然堆积在 mysql,可能造成 mysql 不堪重负而崩溃;redis中没有做一个保护。
解决方法
发现 mysql 不存在,将 redis 设置为 <key, nil> 设置过期时间 下次访问 key 的时候 不再访问 mysql 容易造成 redis 缓存很多无效数据;
布隆过滤器(能够确认一定不存在的key),将 mysql 当中已经存在的 key,写入布隆过滤器,不存在的直接 pass 掉;(解决使用不同的非法key来攻击数据库)

缓存击穿

某些数据 redis 没有,但是 mysql 有;此时当大量这类数据的并发连接请求,同样造成 mysql 过大;
解决

分布式锁
请求数据的时候获取锁,若获取成功,则操作后释放锁;若获取失败,则休眠一段时间(200ms)再去获取,当获取成功,操作后释放锁。
优点:没有额外的内存消耗,保证一致性,实现简单
缺点:线程需要等待,性能受影响

将非常热点的 key,设置不过期;

缓存雪崩

表示一段时间内,缓存集中失效(redis 无, mysql 有),导致请求全部走 mysql,有可能搞垮数据库,使整个服务失效;
mysql 主要的数据的依据;redis 可有可无的状态;

解决
缓存数据库在整个系统不是必须的,也就是缓存宕机不会影响整个系统提供服务;

  1. 如果因为缓存数据库宕机,造成所有数据涌向 mysql;采用高可用的集群方案,如哨兵模式、cluster模式;
  2. 如果因为设置了相同的过期时间,造成缓存集中失效;设置随机过期值或者其他机制错开失效时间;
  3. 如果因为系统重启的时候,造成缓存数据消失;
    重启时间短,redis 开启持久化(过期信息也会持久化)就行了; 重启时间长提前将热数据导入 redis 当中;

缓存的弊端

不能处理多语句的事务
redis不支持回滚
造成redis,mysql不一致

连接池问题

连接池:热点key总是在同一个连接;同一个key必须要走同一个mysql连接,或者同一个redis连接(通过hash实现)。目的是确保同一个没有并发问题。

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

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

相关文章

利用pgloader工具将MySQL数据迁移至PostgreSQL数据库

一、简介 pgloader是一款开源软件,可以将各种来源的数据加载到PostgreSQL数据库中&#xff0c;支持动态读取数据&#xff0c;使用 COPY 流式传输协议将数据加载到 PostgreSQL 数据库中&#xff0c;并使用单独的线程读取和写入数据&#xff0c;由于能够直接从源数据库加载数据。…

1771_Windows下格式化Linux硬盘

全部学习汇总&#xff1a; GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 我自己使用Linux系统多年&#xff0c;但是对于很多操作系统相关的知识我其实并不是很了解。我当初之所以使用Linux一是因为这个系统能够提供给我所有想要的工…

Unity游戏源码分享-Unity手游射击横版游戏

Unity游戏源码分享-Unity手游射击横版游戏 战斗场景 项目地址&#xff1a; https://download.csdn.net/download/Highning0007/88050256

Deployment:让应用永不宕机

“Deployment”&#xff0c;顾名思义&#xff0c;它是专门用来部署应用程序的&#xff0c;能够让应用永不宕机&#xff0c;多用来发布无状态的应用&#xff0c;是 Kubernetes 里最常用也是最有用的一个对象。 Deployment 的关键字段&#xff1a;先看 replicas 字段。它的含义比…

在Vitis IDE中使用第三方库 libtiff 保存 tiff 文件

目的和思路 一个Vitis IDE 裸机项目&#xff0c;需要将视频帧无损地保存下来 由于每帧的像素数据是 16bit 1通道的 bayer 格式&#xff0c;满足这一需求的图像格式似乎只有 tiff 格式 开源的tiff 库是 libtiff&#xff0c;而在 Vitis IDE 裸机项目中要使用的话就需要交叉编译…

AD22软件系统参数的一些基本设置

AD22软件系统参数设置 SystemData managementSchematicPCB Editor System Data management Schematic PCB Editor

集群基础5——keepalived对apache高可用

文章目录 一、基本了解二、配置文件参数释义2.1 默认配置文件2.2 定制配置文件2.2.1 vrrp_instance段配置参数2.2.2 vrrp_script段配置参数2.2.3 real_server段配置参数2.2.4 tcp_check段配置参数 三、keepalived对apache高可用3.1 环境说明3.2 安装服务3.3 配置主服务器3.4 配…

前端编码规范

prettier 配置 1. vscode 安装prettier 的 插件 2. 新建 .prettierrc 文件 {"semi": false, // 不尾随分号"singleQuote": true, // 使用单引号"trailingComma": "none" // 多行逗号分隔的语法&#xff0c;最后一行不加逗号 }eslin…

orbslam3 生成标定板rosrun kalibr kalibr_create_target_pdf --type

rosrun kalibr kalibr_create_target_pdf --type apriltag --nx 6 --ny 6 --tsize 0.08 --tspace 0.3小师妹要做相机视觉标定&#xff0c;需要制作棋盘格&#xff0c;无奈其电脑有些卡&#xff0c;对此毫无经验的博主从头开始安装&#xff08;此前博主已经安装了ROS环境&#x…

精品个人或团队引导页网站HTML源码_好看大气

2023全新宽屏大气好看团队个人指导页网站HTML源码&#xff0c;带音乐视频mv&#xff0c;源码比较小&#xff0c;只有七兆&#xff0c;就因为一个MV占了十几兆。源码也很漂亮&#xff0c;但是有个缺点就是没有手机适配&#xff0c;只能PC浏览器正常显示&#xff0c;手机不能完全…

“探索图像处理的奥秘:使用Python和OpenCV进行图像和视频处理“

1、上传图片移除背景后下载。在线抠图软件_图片去除背景 | remove.bg – remove.bg 2、对下载的图片放大2倍。ClipDrop - Image upscaler 3、对放大后的下载照片进行编辑。 4、使用deepfacelive进行换脸。 1&#xff09;将第三步的照片复制到指定文件夹。C:\myApp\deepfakeliv…

Java 设计模式——模板方法模式

目录 1.概述2.结构3.案例实现3.1.抽象类3.2.具体子类3.3.测试 4.优缺点5.使用场景6.JDK 源码解析6.1.InputStream6.2.AbstractQueuedSynchronizer 1.概述 &#xff08;1&#xff09;在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知…

【代码随想录 | Leetcode | 第三天】数组 | 滑动窗口 | 209

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来滑动窗口的分享✨ 目录 前言209. 长度最小的子数组总结 209. 长度最小的子数组 ✨题目链接点这里 给定一个含有 n 个正整数的数组和一个正整数target。找出该数组中满足其和 ≥ target 的长度…

docker在arm64架构ubuntu系统的安装

卸载可能存在的旧版本 sudo apt remove docker docker-engine docker-ce docker-io安装依赖使apt可通过HTTPS下载包 sudo apt update && apt install -y apt-tranport-https ca-certificates curl software-properties-commonapt-transport-https用于支持通过HTTPS协…

如何设计光场2.0(聚焦型光场相机)系统参数

1. 系统参数设计 目前的硬件系统的现状&#xff1a;主透镜50mm&#xff0c;MLA&#xff1a;15*15&#xff0c;d0.5mm&#xff0c;f15mm&#xff0c;s4.8um 开普勒型光场系统&#xff1a; 首先我们需要确定系统的M&#xff0c;M参数表示单个位置的点能被多少个小微透镜成像&am…

C++【哈希表的完善及封装】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2019 版本 16.11.17 文章目录 &#x1f307;前言&#x1f3d9;️正文1、哈希表的完善1.1、拷贝与赋值1.2、优化&#xff1a;哈希函数1.3、优化&am…

带你快速了解字符(串)函数

​ ⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f496; 持续更文&#xff0c;谢谢大家支持 &#x1f496; 文章目录 本文重点1. strlen函数1.1 模拟实现 2. strcpy函数2.1 模拟实现 3. strcat函数3.1 模拟实现 4. strcmp函…

基于linux下的高并发服务器开发(第一章)- 目录遍历函数

10 / 目录遍历函数 // 打开一个目录 #include <sys/types.h> #include <dirent.h>DIR *opendir(const char *name); 参数&#xff1a; - name: 需要打开的目录的名称 返回值&#xff1a; DIR * 类型&#xff0c;理解为目录流 错误…

Hcip第五次作业----BGP联邦综合实验

配置IP地址 r1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.0.0.1 24 [r1-GigabitEthernet0/0/0]int lo0 [r1-LoopBack0]ip add 192.168.1.1 24 [r1-LoopBack0]int lo1 [r1-LoopBack1]ip add 10.0.0.1 24 r2 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 12.0.0.2…

Orangepi Zero2 基于官方外设开发(二)

一、OLED屏显示-IIC协议 1、相关介绍 IIC及OLED相关内容请参考以下文章&#xff1a; IIC协议_单行梦想家的博客-CSDN博客 OLED显示屏_单行梦想家的博客-CSDN博客 2、OrangePi的IIC接口 由原理图可知&#xff0c;Orange Pi Zero 2 可用的 i2c 为 i2c3 Linux系统启动后&…