mysql缓存策略

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: mysql缓存策略

mysql缓存方案用来干什么

       比如直接和mysql交互会造成mysql很大的压力,现在在mysql前面增加redis充当缓存;也可以把redis替换为memcached;因为mysql做增删改操作的时候必须要落盘,访问redis的效率要远远高于mysql;

       mysql中有change buffer缓存,那么为什么还要增加redis缓存中间件呢?因为change buffer缓存针对的是lru淘汰策略,主要是针对最近访问的数据,但是没法缓存用户访问的热点数据;

还有哪些方案可以提升mysql访问性能

       读写分离,分担读写压力,因为读的操作较多,所以直接往从数据库中读,写的操作较少,所以直接操作主数据库;

       redolog用于事务持久化/确保本地数据一致;

       binlog用于数据备份/主从复制,确保主从数据一致;

       mysql主从复制中,从数据库会主动和主数据库建立连接,建立连接后会产生log dump thread线程,该线程从binlog读数据并发送到从数据库;从数据库读到binlog后会通过io thread写到relay log中;sql thread线程会从relay log读取日志后进行重放replay,即重新执行sql语句,就可以应用到从数据库;可以看到这是一种异步复制;说明同一时刻主从数据库的数据可能不一致,这是读写分离可能就有问题,可能读到的不是最新数据;所以读写分离保证的是最终一致性,而不是实时一致性;如果要求是强一致性的,即要求确保读到的数据一定是最新的数据,我们可以从主数据库中去读;

       连接池

       异步连接

缓存方案是怎么解决的?

       热点数据放到redis中,服务器读数据的时候从redis中读,如果不是热点数据依然从mysql读;mysql和redis是独立的进程;现在将mysql和redis作为整体看作db;这种情况下可能出现几种状态;

       1)mysql有数据,redis中没有;通过同步可以一致;

       2)mysql没有数据,redis中有;

       3)都有数据·,但是数据不一致;

       4)都有数据,且数据一致;

       5)都没有;

       这里只有2,3情况需要制定读写策略来避免;

       读策略,在server层写逻辑,如果是热点数据则从redis中读数据,如果不是热点数据则从mysql中读数据;如果mysql中可以读到数据则同步到redis,如果读不到数据则返回没有;

       写策略,一定要确保是4;

               1)安全优先;先删除缓存,然后写mysql,接着mysql把数据同步到redis;同一个key必须要走同一个mysql连接,同一个redis连接,通过hash实现;确保同一个key没有并发问题;有一条连接在访问某个key,不可能有另一条连接也在访问这个key;安全优先效率较低;

               2)效率优先;先写redis,若是插入和更新,把key设置过期时间,再写mysql,最后mysql同步到redis;过期时间设置为server把数据发送到mysql然后同步到redis这个过程所花的时间;工作当中用到的是效率优先的策略;虽然有安全性的问题,但是只会影响设置的过期时间这段时长;

如何把mysql数据同步到redis?有很多开源方案;

       1)触发器+udf,触发器对表进行增删改操作,会触发行为把mysql数据同步到redis中;udf即user define function,我们可以用c/c++实现udf,在实现中与redis建立连接并把数据进行同步;把热点数据表设置触发器,然后在触发器中调用udf,udf与redis建立连接并把数据同步到redis;触发器中有有种数据,一种是new即新增的数据,一种是old即原来的数据,old存储在undolog中;

       2)伪装从数据库,一种是阿里开源的canal,一种是go-mysql-transfer;

       阿里开源的canal,canal主动与mysql建立连接,往mysql拉取binlog,canal client不断的从canal中拉数据并将数据写到redis;这种方案的有点是解决了可用性的问题,有可替换的节点,分布式考虑的更多;

       go-mysql-transfer伪装成从数据库,并从mysql拉取数据,拉完数据后直接写redis;但是没有解决分布式的问题;

       代码路径

               git clone https://gitee.com/josinli/mysql_redis.git

               git clone https://gitee.com/mirrors/go-mysql-transfer.git

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

缓存方案的弊端是不能处理多语句的事务,因为redis不支持回滚,造成redis和mysql数据不一致;

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