MySQL 缓存策略

news2024/11/18 9:29:33

MySQL 缓存方案用来干什么 ?

  • 缓存用户定义的热点数据,用户直接从缓存中获取热点数据,降低数据的写压力。
  • 场景分析
    • 内存访问速度是磁盘访问速度的 10 万倍。
    • 读的需求远远大于写的需求
    • MySQL 自身缓冲层跟业务无关
    • MySQL 作为项目主要数据库,便于统计分析。
    • 缓存数据库作为辅助数据库,存放热点数据

还有哪些方式提升 MySQL 访问性能

在这里插入图片描述

  • 读写分离
    • 是什么 ?
      • 设置多个从数据库,从数据库可能会在多个机器中。
      • 写操作依然在主数据库。
      • 主数据库提供数据的主要依据。
    • 解决了什么问题:从数据库主要解决读压力。
    • 原理:
      • 主从原理。
      • 异步复制:最终一致性;主从之间数据会有差异。
      • 如果读操作有一致性要求,读操作去读主数据库。
  • 连接池
    • 在服务端中创建多个与数据库的链接。
    • 解决了什么问题:并发提升数据库访问性能;复用连接资源,避免连接建立或断开、以及安全验证的开销。
    • 原理:MySQL 的网络模型:select;阻塞的 IO 模型。如果发送一个事务(多个 SQL 语句),这个事务必须在一个连接中执行。
  • 异步连接
    • 在服务端创建一个连接,针对这个连接采用非阻塞 IO。
    • 解决了什么问题:节省了网络传输时间。
    • 原理:使用了非阻塞 IO。

MySQL 缓存方案

  • Redis 缓存和 MySQL 一致性状态分析
    • MySQL 有,Redis 无。
    • MySQL 无,Redis 有。(错误状态)
    • 都有,数据不一致。(错误状态)
    • 都有,数据一致。
    • 都没有
  • 制定用户定义的热点数据读写策略
    • 读:先读 Redis 缓存,缓存存在直接返回;缓存不存在,去访问 MySQL 获取,再写 Redis。
    • 写:
      • 以安全为主
        • 先要删除 Redis 中的数据,然后再写 MySQL,最后将 MySQL 数据同步到 Redis。
        • 问题:缓存方案的主要目标是提升效率,而现在为了安全降低效率。
        • 只有一种情况使用:读远大于写。
      • 以效率为主
        • 先写 Redis 缓存并设置过期时间,再写 MySQL,等待 MySQL 同步到 Redis 中。
        • 过期时间选择:与 MySQL 网络传输时间 + MySQL 处理时间 + MySQL 同步到 Redis 的时间有关。
        • 安全问题:比如设置了过期时间为 200ms,在 200ms 窗口时间内,其它请求可能读到的是脏数据。

MySQL 主从复制

在这里插入图片描述

  • 工作原理:
    • 主库 DML 操作(增删改操作)通过 io-thread 写到 binlog。
    • 从库请求读取 binlog,通过 io-thread 写入从库本地 relay-log(中继日志)。
    • 从库通过 sql-thread 读取 relay-log,并把更新事件在从库重放(replay)一遍。
  • 复制流程:
    • Slave 中的 IO 线程连接上 Master,并请求从指定日志文件的指定位置之后的日志内容。
    • Master 接收到来自 Slave 的 IO 线程的请求后,负责复制的 IO 线程会根据请求信息读取日志指定位置之后的日志信息,返回给 Slave 的 IO 线程。返回信息中包含日志信息、Master 端 binlog 文件的名称、下次读取 Master 端 binlog 文件中的起始位置。
    • Slave 的 IO 线程接收到消息后,将接收到的日志内容依次添加到 Slave 端的 relay-log 文件末尾,并将读取到的 Master 端的 binlog 文件名和下次读取 binlog 文件中的起始位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚地告诉 Master 从何处开始读取日志。
    • Slave 的 SQL 进程在检测到 relay-log 中新增加了内容后,会马上解析 relay-log 的内容为在 Master 端真实执行时的可执行内容,并在自身执行(重放)。

如何把 MySQL 的数据同步到 Redis ?

在这里插入图片描述

  • 额外增加一个中间件(go-mysql-transfer),该中间件伪装成 MySQL 的从数据库,不断地从 MySQL 中拉取数据(binlog)并进行解析,解析之后写到 Redis 中。(基于 MySQL 主从复制的原理,但是不会重放)
git clone https://gitee.com/mirrors/go-mysql-transfer

缓存方案的故障问题及解决

缓存穿透

  • 数据在 Redis 和 MySQL 中都没有,一直读取不存在的数据,造成 MySQL 访问性能急剧降低。
    • 假设黑客恶意请求服务器不存在的数据,此时 Redis 形同虚设,那么所有的请求压力都会堆积在 MySQL 中,相当于请求穿透了 Redis 直接到了 MySQL,造成 MySQL 访问性能急剧降低。
  • 解决
    • 在 Redis 中缓存不存在的热点数据为 <key, nil>,服务器每次读到 “nil” 字符串的时候,说明整个存储系统都没有这个数据,当客户端再次请求这个数据时,服务器可以直接返回。
      • 缺点: 如果黑客不断地随机出新的 key,那么 Redis 就会写很多不存在的 <key, nil>,可能会把 Redis 的内存撑爆(Redis 不怕请求多,而是怕内存不够)。
    • 部署布隆过滤器:布隆过滤器可以确定一个 key 是否存在。
      • 布隆过滤器要部署到 Redis 中,而不是部署到服务器中(如果有多个服务器,那么每次都需要把热点数据写到每个服务器的布隆过滤器中,这样的话,就需要维护多个布隆过滤器,很麻烦)。
      • 缺点:布隆过滤器只能增加数据,不能删除数据。

缓存击穿

  • 数据在 Redis 中没有,在 MySQL 中有,大量并发连接请求,造成 MySQL 访问性能急剧降低。
  • 解决
    • 分布式锁:请求数据的时候获取锁,若获取成功,则操作后释放锁;若获取锁失败,则休眠一段时间(200 ms)再去获取锁。
      • 服务器 A 先访问 Redis(要获取锁),发现数据不存在,然后访问 MySQL,发现数据存在,将数据同步给 Redis(要释放锁),后面的服务器 B、服务器 C 就可以直接从 Redis 中获取数据。
    • 将很热的 key 设置为不过期。

缓存雪崩

  • 大量缓存数据集中失效,但是数据在 MySQL 中存在,造成 MySQL 访问性能急剧降低。
  • 解决
    • 将很热的 key 设置为不过期。
    • 间隔设置过期时间。
    • 重启时,预先导入热数据到缓存(预热)。

缓存方案的弊端

  • 不能处理多语句的事务。
    begin;
    start transaction;
    sql1;
    sql2;
    commit;
    
  • Redis 不支持回滚。
  • 最终解决方案:分布式关系型数据库 TiDB

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

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

相关文章

idea:springboot项目搭建

目录 一、创建项目 1、File → New → Project 2、Spring Initializr → Next 3、填写信息 → Next 4、web → Spring Web → Next 5、填写信息 → Finish 6、处理配置不合理内容 7、注意事项 7.1 有依赖包&#xff0c;却显示找不到依赖&#xff0c;刷新一下maven 二…

word转PDF的方法 简介快速

在现代办公环境中&#xff0c;文档格式转换已成为一项常见且重要的任务。其中&#xff0c;将Word文档转换为PDF格式的需求尤为突出&#xff0c;将Word文档转换为PDF格式具有多方面的优势和应用场景。无论是为了提高文档的可读性和稳定性、保障文档的安全性和保护机制、还是为了…

赛力斯造车引入强援,原华为智选车产品部部长加盟,任集团副总裁

作者 |德新 编辑 |王博 HiEV从多个信息源获悉&#xff0c;赛力斯造车近日引入一位业界大牛。原华为智选车产品部部长李博已于近日加盟&#xff0c;出任赛力斯集团副总裁。 李博是服役华为多年的老将&#xff0c;长期供职于华为终端生态。在华为体系中&#xff0c;产品部部长相…

Java基础数据结构之队列

一.什么是队列 队列是一种先进先出的数据结构&#xff0c;也就是从左边进从右边出&#xff0c;或者说&#xff0c;只允许在一端插入元素&#xff0c;在另一端删除元素 进行插入操作的一端称为队尾&#xff08;tail/rear&#xff09;&#xff0c;删除操作的一段称为队头&#…

MyBatis源码分析之基础支持层异常模块

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有限&am…

mac版本的vscode如何运行html文件

1.安装Live Server扩展 需在VS中安装一个拓展插件Live Server&#xff0c;插件寻找方法如下&#xff1a; 2.编写HTML文件 3.启动Live Server 在VSCode中打开你的HTML文件&#xff0c;并点击右键选择"Open with Live Server"&#xff0c;或者点击右下角的"Go…

安卓类加载机制

目录 一、ClassLoader介绍二、双亲委托机制三、类的加载过程 一、ClassLoader介绍 任何一个 Java 程序都是由一个或多个 class 文件组成&#xff0c;在程序运行时&#xff0c;需要将 class 文件加载到 JVM 中才可以使用&#xff0c;负责加载这些 class 文件的就是 Java 的类加…

Apache POI处理Miscrosoft Office 各种文件格式的开源项目

介绍: 应用场景 maven 坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifa…

支付宝小程序模板开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 支付宝小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一…

Java_优先级队列(堆)(Priority Queue)

文章目录 一、优先级队列1.概念 二、优先级队列的模拟1.堆的概念2.堆的存储方式3.堆的创建1、堆向下调整2、堆的创建代码实现3、建堆的时间复杂度 2.堆的插入与删除1、堆的插入2、堆的删除3、完整的堆代码4、练习 一、PriorityQueue常用接口介绍1.PriorityQueue的特性2.Priorit…

Java项目:38 springboot005学生心理咨询评估系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 学生心理咨询评估系统有管理员和用户 【主要功能】 用户管理、试题管理、试卷管理、考试管理 【技术组成】 SpringBoot MyBatis Vue Boots…

Android Studio开发(一) 构建项目

1、项目创建测试 1.1 前言 Android Studio 是由 Google 推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发 Android 应用程序。 基于 IntelliJ IDEA: Android Studio 是基于 JetBrains 的 IntelliJ IDEA 开发的&#xff0c;提供了丰富的功能和插件…

QT 解决在线安装版本下载速度(以国内镜像启动安装器的方式)

关于Fiddler输入steam的教程&#xff0c;本人试过&#xff0c;无效略过… 正确方式 具体操作方法&#xff1a; 1.方式一、未安装过QT 下载好安装器之后&#xff0c;在安装器&#xff08;qt-unified-windows-x64-4.6.0-online.exe&#xff09;的文件夹中空白处&#xff0c;按…

第八篇:预测受众(Predictive audience)技术是如何赋能数字化营销生态的?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒…

Covalent Network(CQT)将链下收入引入链上,在全新阶段开启 Token 回购

Covalent Network&#xff08;CQT&#xff09;&#xff0c;是 Web3 领域跨越 225 个链的领先数据索引服务商&#xff0c;通过统一 API 的方式提供结构化数据可用性服务&#xff0c;并正在成为 AI、DeFi、分析和治理等多样化需求的关键参与者。为了支持去中心化技术的采用&#…

在XCode中使用SwiftGen管理你的图片、配色、多语言文件等

SwiftGen是一个工具&#xff0c;可以为您的项目资源&#xff08;如图像、本地化字符串等&#xff09;自动生成Swift代码&#xff0c;然后你就可以像使用一个Class类一样访问你的资源了。 而且添加或更新资源后&#xff0c;SwiftGen也会自动更新用于访问资源的Class类。对于管理…

Linux性能优化总结

Part1Linux性能优化 1性能优化 性能指标 高并发和响应快对应着性能优化的两个核心指标&#xff1a;吞吐和延时 图片来自: www.ctq6.cn 应用负载角度&#xff1a;直接影响了产品终端的用户体验 系统资源角度&#xff1a;资源使用率、饱和度等 性能问题的本质就是系统资源已…

理解 JSON 和 Form-data 的区别

在讨论现代网络开发与API设计的语境下&#xff0c;理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里&#xff0c;特别值得关注的是两种主流数据格式&#xff1a;JSON与Form-data。尽管它们的终极目标一致&#xff0c;即数据传输的高效性和可靠性&#xff0c;但…

Unity接入海量RTSP直播流,多线程渲染

Unity 播放海量RTSP视频&#xff0c;多线程播放&#xff0c;长时间运行稳定 Unity 播放海量RTSP视频&#xff0c;多线程渲染 使用的libvlc库&#xff0c;目前只支持windows开发 25路视频同时播放&#xff0c;测试持续运行1晚上&#xff0c;运行稳定&#xff0c;不掉帧&#xf…

Tensorflow2.0笔记 - 计算梯度

本笔记主要记录tf.GradientTape和tf.gradient的用法 import tensorflow as tf import numpy as nptf.__version__#要计算梯度的所有参数计算过程必须放到gradient tape中 #with tf.GradientTape as tape: w tf.constant(1.) x tf.constant(2.)with tf.GradientTape() as tap…