mysql缓存策略

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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数据不一致;

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
存储 关系型数据库 MySQL
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
37 2
|
1月前
|
存储 缓存 算法
缓存淘汰策略
缓存淘汰策略
31 0
|
1月前
|
存储 缓存 NoSQL
后端开发中的缓存策略:提升应用性能的关键
后端开发中的缓存策略:提升应用性能的关键
26 0
|
5天前
|
存储 缓存 安全
基于iOS平台的高效图片缓存策略实现
【4月更文挑战第22天】 在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。尤其对于iOS平台,由于设备存储空间的限制以及用户对流畅性的高要求,设计一种合理的图片缓存策略显得尤为关键。本文将探讨在iOS环境下,如何通过使用先进的图片缓存技术,包括内存缓存、磁盘缓存以及网络请求的优化,来提高应用的性能和响应速度。我们将重点分析多级缓存机制的设计与实现,并对可能出现的问题及其解决方案进行讨论。
|
6天前
|
存储 缓存 算法
实现iOS平台的高效图片缓存策略
【4月更文挑战第22天】在移动应用开发中,图片资源的处理是影响用户体验的重要因素之一。特别是对于图像资源密集型的iOS应用,如何有效地缓存图片以减少内存占用和提升加载速度,是开发者们面临的关键挑战。本文将探讨一种针对iOS平台的图片缓存策略,该策略通过结合内存缓存与磁盘缓存的机制,并采用先进的图片解码和异步加载技术,旨在实现快速加载的同时,保持应用的内存效率。
|
24天前
|
存储 关系型数据库 MySQL
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
MySQL数据库性能大揭秘:表设计优化的高效策略(优化数据类型、增加冗余字段、拆分表以及使用非空约束)
|
24天前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
|
3天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL与NoSQL的主要区别在于数据结构、查询语言和可扩展性。MySQL是关系型数据库,依赖预定义的数据表结构,使用SQL进行复杂查询,适合垂直扩展。而NoSQL提供灵活的存储方式(如JSON、哈希表),无统一查询语言,支持横向扩展,适用于处理大规模、非结构化数据和高并发场景。选择哪种取决于应用需求、数据模型及扩展策略。
10 0
|
4天前
|
缓存 关系型数据库 MySQL
MySQL数据库优化技巧:提升性能的关键策略
索引是提高查询效率的关键。根据查询频率和条件,创建合适的索引能够加快查询速度。但要注意,过多的索引可能会增加写操作的开销,因此需要权衡。
|
12天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。