一、数据库隔离级别及其含义(MySQL默认级别:可重复读)
数据库的隔离级别从低到高有四种:
隔离级别 | 说明 | 会出现的问题 |
---|---|---|
读未提交(Read Uncommitted) | 读到别人未提交的事务数据 | 脏读、不可重复读、幻读 |
读已提交(Read Committed) | 只能读到别人提交后的数据 | 不可重复读、幻读 |
可重复读(Repeatable Read) | 同一事务内多次读数据结果一致 | 幻读(MySQL用了间隙锁防止) |
串行化(Serializable) | 加锁读,事务串行执行 | 性能最差,但最安全 |
✅ MySQL 默认是 Repeatable Read(可重复读)
二、MySQL 索引原理与优化
✅ 索引原理
-
底层结构:B+树
-
叶子节点存储数据,非叶子节点只存索引,提高查询效率
-
-
索引作用:加快查找、排序,但过多会影响写入速度
✅ 索引类型
-
主键索引(PRIMARY KEY)
-
唯一索引(UNIQUE)
-
普通索引(INDEX)
-
组合索引(多个字段)
-
全文索引(FULLTEXT)
✅ 合理创建索引
-
WHERE/ORDER BY/JOIN中出现频繁的字段
-
高选择性字段(比如手机号)
-
前缀索引:针对长字符串字段
✅ 优化技巧
-
使用覆盖索引(只查索引字段,不查表)
-
避免在索引字段上使用函数、表达式(会失效)
-
最左前缀原则:组合索引用上前几个字段才生效
-
索引列尽量为 NOT NULL
三、消息队列使用场景
-
削峰填谷:系统高并发时缓冲压力(如下单)
-
异步解耦:系统模块之间异步调用(如下单后发短信)
-
流量削减:限流处理、批量处理(如日志收集)
-
顺序保证:比如交易系统按顺序执行操作
四、消息的重发与补偿策略
-
设置消息的最大重试次数,防止无限重发
-
记录消费状态(幂等性),避免重复处理
-
使用定时任务 + 死信队列做补偿处理
-
数据库中标记消费状态 + 消息ID,防止重复消费
五、MQ 如何保证消息不丢
-
消息持久化:生产者/消费者都写磁盘
-
ACK机制:确保消息被正确消费后才确认删除
-
消息重试机制:未ACK的消息重试消费
-
死信队列(DLQ):处理一直失败的消息
六、如何防止缓存击穿与雪崩
✅ 缓存击穿(热点key突然失效)
解决方案:
-
给热点key设置永不过期
-
使用互斥锁控制只有一个线程回源查询数据库
✅ 缓存雪崩(大量缓存同时失效)
解决方案:
-
key过期时间加随机值,错开失效时间
-
设置多级缓存(本地+Redis)
-
降级策略,部分服务降级或限流
七、Redis 的数据结构及使用场景
数据结构 | 描述 | 应用场景 |
---|---|---|
String | 字符串、数字 | 计数器、缓存对象 |
Hash | 键值对集合 | 用户信息、对象属性 |
List | 有序链表 | 消息队列、任务列表 |
Set | 不重复集合 | 标签、去重 |
Sorted Set(ZSet) | 有序集合 | 排行榜、积分榜 |
Bitmap | 位图 | 用户签到、活跃状态 |
HyperLogLog | 估算基数 | 统计UV(独立访客) |