Redis缓存
缓存穿透穿透,穿透,穿透;恶意,恶意,恶意的
定义
查询数据库中根本不存在的数据(如 id=-1 或已删除的用户),缓存不命中,每次都打到数据库。
解决方案1️⃣ 缓存空值(Null Caching)
2️⃣ 布隆过滤器(Bloom Filter)✅ 高频答案
启动时将所有合法 ID 载入 Bloom Filter(或 RedisBloom 模块)
布隆过滤器:“位数组(Bit Array)”+“多个哈希函数”
布隆过滤器的工作方式
当你把一个 Key 放入布隆过滤器时:
初始化:创建一个长度为 m的位数组(全是 0)。
多次哈希:使用 k个不同的哈希函数对 Key 进行计算,得到 k个位置索引。
置位:将位数组中这 k个位置的值全部设为 1。
查询:再次用这 k个哈希函数计算新 Key,检查这 k个位置:
只要有一个位置是 0 → 绝对不在集合中(因为如果在,当时肯定会被置为1)。
所有位置都是 1 → 可能在集合中(因为可能是其他 Key 刚好把这些位置都置成了1,这就是误判)。
缓存雪崩定义
大量缓存 Key 在同一时刻批量过期,或 Redis ...
Redis数据类型
键设计键命名规范:建议使用冒号分隔,如 user:1001:info,这样在 Redis 客户端中查看时层次更清晰
String
缓存对象使用 String 来缓存对象有两种方式:
直接缓存整个对象的 JSON,命令例子: SET user:1 '{"name":"xiaolin", "age":18}'。
采用将 key 进行分离为 user:ID:属性,采用 MSET 存储,用 MGET 获取各属性值,命令例子: MSET user:1:name xiaolin user:1:age 18 user:2:name xiaomei user:2:age 20
常规计数因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。
分布式锁SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁:
上锁
释放锁
为什么需要lockvalue?因为A线程还没执行完,锁过期 ...
Redis业务问题
延迟任务用zset的score存储过期时间,
循环去扫描,到期了就去执行业务逻辑
成熟方案:使用RocketMQ的延时消息
大key阻塞请求(最严重):Redis 是单线程的。如果对一个包含 100 万个元素的 Set 执行 SMEMBERS或 DEL,会导致 Redis 主线程卡顿,期间无法处理其他任何请求。
网络拥塞:大 Key 传输会占用大量带宽,可能导致网卡流量打满,影响其他业务。
内存不均(针对 Cluster):在 Redis Cluster 中,一个巨大的 Key 无法被拆分到多个节点【==Cluster是均衡key的数量,但是key较大,那这个Cluster分片上的内存就会较大==】,导致某个分片的内存远大于其他节点,形成瓶颈。
过期/删除困难:大 Key 的被动过期或主动删除(DEL)会非常慢。虽然 Redis 4.0+ 支持 UNLINK(异步删除),但逻辑上的处理依然复杂。
解决:
分key
1234# 分key之后,分片可能不在一个集群分片上,可以使用hashtag{}来指定计算hash的部 ...
锁
按读写锁分
共享锁(S锁):也称读锁,多个事务可以同时读取同一行数据,互不干扰,但都不能修改
排他锁(X锁):也称写锁,一旦某个事务获得排他锁,当前事务可读写;其他事务既不能读也不能写,只能等待
兼容性(表锁和行锁都一样):只有S和S是兼容的
==注意:==这个图是【表表】 【行行】,【表行】都通用的:
表级意向锁的情况(因为意向锁是加行锁的时候加的,那我一个表有很多行,加各自的行锁就会加对应的意向锁,所以意向锁之间不冲突)
表级的元数据锁:
按粒度划分全局锁
功能:让整个数据库处于只读状态,其他DML/DDL操作都会被阻塞。
使用场景:全库逻辑备份(但InnoDB使用mysqldump --single-transaction更好)
主要命令:FLUSH TABLES WITH READ LOCK; (上锁) / UNLOCK TABLES; (解锁)。
表级锁
表锁:基本的表级别S/X锁,粒度大,并发性能低。使用 LOCK TABLES ... READ/WRITE 命令控制
元数据锁(MDL):保护表 ...
索引
按数据结构分类按数据结构分【创建索引时可以指定类型】
B+树索引
主键索引
叶子节点存放了完整的记录
二级索引
叶子节点只存放了主键值,需要==回表==(再根据主键索引去查全部数据);当然如果通过二级索引只查询主键,或者查询的就是索引列,是不需要回表的(这种情况叫:==覆盖索引==)
哈希索引
InnoDb不支持
全文索引
关键词索引,但是大数据上elSearch
按物理存储分
主键索引(聚簇索引)【全部数据】
二级索引(辅助索引)【索引数据列+主键】
按字段特性分
主键索引
唯一索引
普通索引
前缀索引
前缀索引目的减少存储空间,如果前缀匹配多条数据,需要回表
123# 创建column_name前length长度的前缀索引CREATE INDEX index_nameON table_name(column_name(length));
按字段特性分
单列索引
联合索引
1CREATE INDEX index_product_no_name ON produ ...
日志
两阶段提交二阶段提交(2PC)是一种用于分布式数据库或系统中确保事务原子性的协议,它通过一个协调者和多个参与者共同协作,保证所有节点要么全部提交事务,要么全部回滚。
它的执行分为两个阶段:
投票阶段:协调者向所有参与者发送“准备提交”请求。参与者执行事务操作,并锁定资源,然后向协调者反馈“同意”或“中止”。
提交阶段:如果协调者收到所有参与者的“同意”,则发送“提交”命令,参与者完成提交并释放资源;如果任何参与者反馈“中止”或超时,则协调者发送“回滚”命令,所有参与者进行回滚。
undo logMVCCMVCC依靠undo log实现
回滚记录阶段: “事务修改数据前,InnoDB会先将旧数据拷贝到Undo Log中,形成一条版本记录。不同操作记录不同内容:
UPDATE记录旧值
INSERT记录主键
DELETE记录完整数据”
构建版本链: “每条记录都有DB_ROLL_PTR指针,指向它的上一个版本。修改时,当前记录指向新的Undo Log,形成版本链”
回滚执行: “执行ROLLBACK时,==从后向前==遍历事务的所有 ...
分布式MySQL
分区表为什么不够了?
仍在单机:所有分区仍然在同一个MySQL实例、同一块磁盘/磁盘阵列上。这意味着:
IO瓶颈:所有分区的数据读写最终会争用同一套物理硬件(CPU、内存、磁盘IO、网络带宽)。当数据量和并发达到单机上限时,性能会达到天花板。
连接数瓶颈:所有连接都连接到同一个MySQL实例,受max_connections限制。
可用性风险:单点故障。该实例宕机,整个表(所有分区)都不可用。
结论:分区表是单机数据库性能优化的高级手段,但无法突破单机硬件资源的根本限制。
垂直分库分表垂直分库例如微服务按业务功能将表拆分到不同数据库,例如:
订单库:order, order_item
用户库:user, user_profile
商品库:product, category
垂直分表
将一张宽表按列拆分为多张表:
主表:存放频繁访问的字段(user_id, nickname, age)
扩展表:存放冷门或大字段(bio, avatar, settings)
优点:减少 IO 阻塞,提高缓存命中率。
水平分库分表==这是最常用的分库分表手段 ...
分区表
一、分区表的核心原理1.1 逻辑表 vs 物理分区
逻辑表:用户通过 CREATE TABLE ... PARTITION BY ... 创建的分区表,在 information_schema 中只有一条记录。
物理分区:每个分区对应一个独立的表空间文件(InnoDB 中是 .ibd 文件,MyISAM 中是 .MYD / .MYI)。数据按分区规则写入不同的物理文件。
当执行查询时,优化器会根据 WHERE 条件中的分区键,只扫描必要的分区,这个行为称为 分区裁剪(Partition Pruning)。
1.2 支持的存储引擎
InnoDB(最常用,支持所有分区类型)
MyISAM(已逐渐淘汰)
NDB(用于 MySQL Cluster)
二、分区类型详解MySQL 支持以下几种分区方式,每种方式适合不同的数据分布需求。
分区类型
语法 / 规则
适用场景
示例
RANGE分区
PARTITION BY RANGE(column) (PARTITION p1 VALUES LESS THAN (value), ...)
时间序列数据、有序范围
按 ...
事务
事务特性>
PS:不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB
原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样,就好比买一件商品,购买成功时,则给商家付了钱,商品到手;购买失败时,则商品在商家手中,消费者的钱也没花出去。
隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的
持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
一致性(Consistency):是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。比如,用户 A 和用户 B 在银行分别有 800 元和 600 ...
MySQL基本概念
三大范式
1NF:字段原子唯一不可再拆
2NF:非主属性必须完全依赖主键
3NF:非主属性必须直接依赖主键
外键外键是表中用于关联另一张表的字段,它指向另一张表的主键或唯一键,用于维护数据完整性
一般不加外键约束,操作的时候会检查其他表;
FOREIGN KEY (stu_id) REFERENCES Student(stu_id);
一般comment注释下关联性,业务层面解决
存储过程
将SQL语句通过逻辑控制封装在一起供调用
语句
(操作)DML:delete insert update可以回滚
(定义)DDL:drop truncate 不可以回滚
数据库设计**找到:实体-属性-关系 **
一对多
多对多:需要中间的表
一对一:两种方式
主键关联
唯一外键关联
MySQL执行流程
连接器:TCP建立连接,最大连接数:show variables like 'max_connections'
查询缓存:key:【SQL语句】 value:【查询结果】 8.0之后移除,表更新清除缓存
解析SQL:进行词法分析 ...
