MySQL(五)缓存策略

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: MySQL(五)缓存策略


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实现)。目的是确保同一个没有并发问题。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
28天前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
1月前
|
缓存 关系型数据库 MySQL
MySQL执行计划选择策略:揭秘查询优化的艺术
【10月更文挑战第15天】 在数据库性能优化中,选择最优的执行计划是提升查询效率的关键。MySQL作为一个强大的关系型数据库管理系统,提供了复杂的查询优化器来生成执行计划。本文将深入探讨如何选择合适的执行计划,以及为什么某些计划更优。
98 2
|
12天前
|
缓存 API C#
C# 一分钟浅谈:GraphQL 中的缓存策略
本文介绍了在现代 Web 应用中,随着数据复杂度的增加,GraphQL 作为一种更灵活的数据查询语言的重要性,以及如何通过缓存策略优化其性能。文章详细探讨了客户端缓存、网络层缓存和服务器端缓存的实现方法,并提供了 C# 示例代码,帮助开发者理解和应用这些技术。同时,文中还讨论了缓存设计中的常见问题及解决方案,如缓存键设计、缓存失效策略等,旨在提升应用的响应速度和稳定性。
31 13
|
5天前
|
缓存 NoSQL 关系型数据库
MySQL战记:Count( *)实现之谜与计数策略的选择
本文深入探讨了MySQL中`count(*)`的不同实现方式,特别是MyISAM和InnoDB引擎的区别,以及各种计数方法的性能比较。同时,文章分析了使用缓存系统(如Redis)与数据库保存计数的优劣,并强调了在高并发场景下保持数据一致性的挑战。
MySQL战记:Count( *)实现之谜与计数策略的选择
|
19天前
|
SQL 关系型数据库 MySQL
PHP与MySQL的高效协同开发策略####
本文深入探讨了PHP与MySQL在Web开发中的协同工作机制,通过优化配置、最佳实践和高级技巧,展示了如何提升数据库交互性能,确保数据安全,并促进代码可维护性。我们将从环境搭建讲起,逐步深入到查询优化、事务管理、安全防护及性能调优等核心环节,为开发者提供一套实战驱动的解决方案框架。 ####
|
1月前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
28天前
|
存储 缓存 安全
在 Service Worker 中配置缓存策略
Service Worker 是一种可编程的网络代理,允许开发者控制网页如何加载资源。通过在 Service Worker 中配置缓存策略,可以优化应用性能,减少加载时间,提升用户体验。此策略涉及缓存的存储、更新和检索机制。
|
1月前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
102 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
39 3
|
1月前
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
38 1