mysql缓存策略

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 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
目录
打赏
0
0
0
0
0
分享
相关文章
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
425 66
数据抓取的缓存策略:减少重复请求与资源消耗
本教程聚焦于提升爬虫效率与稳定性,通过结合缓存策略、代理IP技术(如爬虫代理)、Cookie和User-Agent设置,优化数据采集流程。以知乎为例,详细讲解如何抓取指定关键词的文章标题和内容。内容涵盖环境准备、代码实现、常见问题及解决方案,并提供延伸练习,帮助读者掌握高效爬虫技巧。适合具备Python基础的初学者,助你规避网站机制,顺利获取目标数据。
数据抓取的缓存策略:减少重复请求与资源消耗
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
71 22
MySQL 中如何实现分库分表?常见的分库分表策略有哪些?
在MySQL中,分库分表(Sharding)通过将数据分散到多个数据库或表中,以应对大量数据带来的性能和扩展性问题。常见策略包括:哈希分片(分布均匀,查询效率高)、范围分片(适合范围查询)、列表分片(适用于特定值查询)、复合分片(灵活性高)和动态分片(灵活应对负载变化)。每种策略各有优劣,需根据业务需求选择。常用工具如MyCAT、ShardingSphere和TDDL可简化实现过程。
|
4月前
|
C# 一分钟浅谈:GraphQL 中的缓存策略
本文介绍了在现代 Web 应用中,随着数据复杂度的增加,GraphQL 作为一种更灵活的数据查询语言的重要性,以及如何通过缓存策略优化其性能。文章详细探讨了客户端缓存、网络层缓存和服务器端缓存的实现方法,并提供了 C# 示例代码,帮助开发者理解和应用这些技术。同时,文中还讨论了缓存设计中的常见问题及解决方案,如缓存键设计、缓存失效策略等,旨在提升应用的响应速度和稳定性。
66 13
MySQL战记:Count( *)实现之谜与计数策略的选择
本文深入探讨了MySQL中`count(*)`的不同实现方式,特别是MyISAM和InnoDB引擎的区别,以及各种计数方法的性能比较。同时,文章分析了使用缓存系统(如Redis)与数据库保存计数的优劣,并强调了在高并发场景下保持数据一致性的挑战。
137 0
MySQL战记:Count( *)实现之谜与计数策略的选择
PHP与MySQL的高效协同开发策略####
本文深入探讨了PHP与MySQL在Web开发中的协同工作机制,通过优化配置、最佳实践和高级技巧,展示了如何提升数据库交互性能,确保数据安全,并促进代码可维护性。我们将从环境搭建讲起,逐步深入到查询优化、事务管理、安全防护及性能调优等核心环节,为开发者提供一套实战驱动的解决方案框架。 ####
缓存数据一致性策略如何分类?
数据库与缓存数据一致性问题的解决方案主要分为强一致性和最终一致性。强一致性通过分布式锁或分布式事务确保每次写入后数据立即一致,适合高要求场景,但性能开销大。最终一致性允许短暂延迟,常用方案包括Cache-Aside(先更新DB再删缓存)、Read/Write-Through(读写穿透)和Write-Behind(异步写入)。延时双删策略通过两次删除缓存确保数据最终一致,适用于复杂业务场景。选择方案需根据系统复杂度和一致性要求权衡。
90 0
在 Service Worker 中配置缓存策略
Service Worker 是一种可编程的网络代理,允许开发者控制网页如何加载资源。通过在 Service Worker 中配置缓存策略,可以优化应用性能,减少加载时间,提升用户体验。此策略涉及缓存的存储、更新和检索机制。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等