MySQL缓存策略

文章目录

MySQL缓存

MySQL缓存:缓存用户定义的热点数据 ,用户直接从缓存获取热点数据,降低数据库的 写压力。

Redis-缓存用户定义的MySQL中的热点数据。
场景分析:

①内存的访问速度是磁盘访问速度的10万倍

读的需求远远大于写的需求

③mysql自身的缓冲层(BufferPool)和业务无关,一个是缓存MySQL中最近最少使用的,一个是缓存用户定义的热点数据的

④mysql作为项目的主要数据库,便于统计和分析

⑤缓存数据库作为辅助数据库,存放热点数据。

其他提升MySQL性能的方式

读写分离

MySQL也有主从复制:避免单点故障

在某些场景下,读的需求没有那么高(非读一致性需求),可以采用写到主数据库,读到从数据库。从而降低了主数据库的读压力。

连接池

服务端 创建多条与数据库的连接

并发提升数据库的访问性能,同时复用连接资源,避免连接建立,断开以及安全验证的开销。

异步连接(reactor网络模型)

在服务端创建一个连接,采用非阻塞Io

缓存方案实现

MySQL与缓存的一致性状态分析

①MySQL有,redis无

②MySQL无,redis有
③MySQL有,redis有,数据一致

④MySQL有,redis有,数据不一致
⑤都无

制定用户定义热点数据的读写策略

读:

先读缓存,缓存存在直接返回;缓存不存在,访问mysql获取,有返回并同步到缓存,没有说明整个系统都没有这个数据

写:

  1. 以安全为主: 先删缓存(整个hash 结构)为了让其他连接获取到变更后的值, 然后对MySQL DML操作,**MySQL数据变更同步到redis。**使用伪装从库的方式进行同步
  2. 降低安全需求,提升效率(trade off):先写缓存并设置过期时间 ,再写MySQL,等待MySQL同步到redis中。过期时间选择:与MySQL网络传输的时间+MySQL处理时间+MySQL同步到redis的时间。但是带来一个安全问题:时间窗口内其他连接可能读到脏数据。

MySQL和Redis的同步方案

同步方案1:

伪装从数据库,从mysql中拉取数据同步到redis。

阿里Canel

或者另一组件

go-mysql-transfer
在go-mysql-transfer中定义热点数据,执行同步方案。

同步方案2:

udf+触发器,缺点是udf不支持事务操作,每一次都要与redis建立连接。

同步方案3:

Canel+Canel客户端:高可用,但是比go-mysql-transfer多了一个流程

缓存方案的故障以及解决

缓存穿透

数据在缓存和mysql中都无,一直读取不存在的数据,造成mysql访问性能急剧降低

解决:①缓存设置<key,nil>

布隆过滤器 只能增加不能删除

缓存击穿

缓存无,mysql有,大量并发连接请求,造成mysql访问性能急剧降低

解决:①过热数据不过期

②分布式锁

缓存雪崩

大量缓存同时集中失效,但是mysql存在该数据,造成mysql访问性能急剧降低

解决:①间隔设置过期时间

②重启时,预先导入热点数据到缓存

缓存方案的弊端

①事务多语句必须走一条连接(尤其是有连接池的场景)

②在缓存方案中redis不支持回滚

③可能造成redis MySQL不一致

https://github.com/0voice

相关推荐
渣渣盟5 分钟前
MySQL DDL操作全解析:从入门到精通,包含索引视图分区表等全操作解析
大数据·数据库·mysql
小小工匠17 分钟前
Redis - 基本架构:一个键值数据库到底由什么组成
数据库·redis·架构
mN9B2uk1726 分钟前
为mysql数据库建立索引
数据库·mysql·oracle
SilentSamsara31 分钟前
SQLAlchemy 2.x:异步 ORM 与数据库迁移 Alembic 完整指南
开发语言·数据库·python·sql·青少年编程·oracle·fastapi
流星白龙33 分钟前
【MySQL高阶】7.MySQL日志
数据库·mysql·adb
Irene199138 分钟前
SQL示例:正确理解题意(隐藏分组键)严格SQL模式下,ORDER BY中的列必须出现在GROUP BY中或作为聚合函数
mysql
流星白龙1 小时前
【MySQL高阶】0.MySQL的安装
数据库·mysql·adb
Rick19931 小时前
联合索引是按顺序排好序的
数据库·mysql
步十人1 小时前
【Redis】网络高并发模型
网络·数据库·redis
我是一颗柠檬1 小时前
【Redis】列表与集合Day4(2026年)
数据库·redis·后端·缓存