Java 高级面试知识体系:覆盖全面、兼顾深度与广度的体系化指南
目标:把零散知识点串成一张网——广度上无死角、深度上能下钻、表达上有模板、记忆上有抓手。 阅读建议:先通读第一章建立方法论,再按模块逐个攻破,最后用第五、六章的表达框架与记忆策略把知识"焊"在脑子里。
一、方法论先行:高级面试到底考什么
1.1 三层能力模型
| 层级 | 考察点 | 典型问法 | 应对要求 |
|---|---|---|---|
| 广度(知道) | 技术栈覆盖面 | "你了解 XX 吗?" | 能说清定义、定位、适用场景 |
| 深度(理解) | 原理与源码 | "为什么这样设计?" | 能讲到实现机制、设计取舍 |
| 体系(会用) | 实战与权衡 | "你会怎么选型/排查?" | 能结合项目讲方案、数据、坑 |
初级面试考"会不会",中级面试考"懂不懂",高级面试考"权衡与实战"。 同一个知识点,高级岗必须能讲出:它解决什么问题 → 怎么解决的 → 有什么代价 → 我在哪里用过 → 踩过什么坑。
1.2 高级面试的评分公式
得分 = 知识准确性 × 表达结构性 × 实战证据(数据/案例) × 追问抗压四个因子缺一不可:背得再熟,讲得混乱、没有实战佐证、一问深了就崩,依然过不了。
二、知识体系全景图(广度覆盖清单)
2.1 模块权重与备考优先级
| 模块 | 高频程度 | 深度要求 | 优先级 | 说明 |
|---|---|---|---|---|
| JVM 与 GC | ★★★★★ | 深 | P0 | 高级岗区分度核心,必问调优实战 |
| 并发编程 | ★★★★★ | 深 | P0 | synchronized/AQS/线程池必问源码级 |
| MySQL | ★★★★★ | 深 | P0 | 索引、事务、锁、调优是必答题 |
| Redis | ★★★★★ | 深 | P0 | 缓存三件套 + 高可用 + 分布式锁 |
| Spring 全家桶 | ★★★★☆ | 深 | P0 | 生命周期、循环依赖、事务失效 |
| 消息队列 | ★★★★☆ | 中深 | P1 | 可靠性、顺序、幂等、积压 |
| 分布式理论与方案 | ★★★★☆ | 深 | P1 | CAP、一致性、分布式事务选型 |
| 系统设计/场景题 | ★★★★☆ | 广+设计 | P1 | 高级岗的胜负手 |
| 集合源码 | ★★★☆☆ | 中 | P2 | HashMap/ConcurrentHashMap 为焦点 |
| 网络与 Netty | ★★★☆☆ | 中 | P2 | TCP、IO 模型、零拷贝 |
| 微服务治理 | ★★★☆☆ | 中 | P2 | 限流熔断、注册发现、链路追踪 |
| JDK21 新特性 | ★★★☆☆ | 中 | P2 | 虚拟线程已成 2025-2026 新晋高频 |
2.2 一条主线串全局
把所有模块串在"一次请求的生命周期"上,任何知识点都能挂到这条主线上:
学任何新技术都问自己:它在这条链路的哪个环节?解决该环节的什么问题?——这就是体系。
三、核心模块详解(广度清单 + 深度下钻)
每个模块 = 知识点清单(广度)+ 深度追问方向(深度)+ 高频题答题要点。
3.1 JVM(P0)
广度清单:运行时数据区、对象创建与内存布局、类加载机制、GC 算法与分代假说、主流收集器、调优参数、内存问题排查工具(jps/jstat/jmap/MAT/Arthas)。
深度下钻方向:
- 为什么需要 TLAB?对象一定分配在堆上吗(逃逸分析/标量替换)?
- G1 的 RSet/Card Table 如何跨 Region 找引用?ZGC 着色指针 + 读屏障原理?
- 安全点(Safepoint)与 STW 的关系;写屏障在 GC 中的作用。
- 双亲委派为什么会被打破(SPI/Tomcat/热部署)?如何打破?
收集器对比(必背表):
| 收集器 | 区域 | 算法/特点 | 停顿 | 适用场景 |
|---|---|---|---|---|
| CMS | 老年代 | 并发标记清除,低停顿但有碎片 | 几十 ms | 遗留系统,已废弃 |
| G1 | 全堆 | Region 化 + 分代,可预测停顿模型 | 10~100ms | 大内存通用首选 |
| ZGC | 全堆 | 着色指针 + 读屏障,并发整理 | <1ms | 极低延迟、超大堆 |
OOM 排查流程(答"你排查过内存问题吗"的剧本):
答题时按此流程讲一个真实案例:现象 → 数据 → 工具 → 根因 → 修复 → 效果,这就是"体系 + 实战"。
3.2 并发编程(P0,分水岭)
广度清单:JMM、volatile/synchronized、CAS 与原子类、AQS、ReentrantLock/ReadWriteLock、线程池、ThreadLocal、并发工具类(CountDownLatch/CyclicBarrier/Semaphore)、并发容器、CompletableFuture、虚拟线程。
深度下钻方向:
- JMM 三特性(原子/可见/有序)分别由什么机制保证;happens-before 八条规则能举例。
- synchronized 锁升级全过程:无锁 → 偏向锁 → 轻量级锁(CAS 自旋)→ 重量级锁(OS 互斥量)。
- AQS:state + CLH 双向队列;独占/共享模式;ReentrantLock 公平与非公平的源码差异。
- 线程池:7 参数、执行流程、拒绝策略、参数如何评估(IO 密集 vs CPU 密集)、如何做监控与动态调参。
- ThreadLocal:ThreadLocalMap 弱引用 key 与内存泄漏成因。
线程池执行流程(高频画图题):
synchronized vs ReentrantLock 对比:
| 维度 | synchronized | ReentrantLock |
|---|---|---|
| 层级 | JVM 内置(monitorenter/monitorexit) | JDK API(AQS 实现) |
| 锁释放 | 自动(退出同步块) | 必须手动 finally unlock |
| 能力 | 锁升级优化 | 可中断/超时/公平锁/多条件 Condition |
| 选择 | 简单同步首选 | 需要高级特性时用 |
虚拟线程(JDK21 新晋高频):用户态轻量线程,由 JVM 调度,M:N 映射到平台线程;阻塞时挂起而非占用 OS 线程,适合 IO 密集高并发(Web 服务、消息消费);注意不适合 CPU 密集任务,警惕 synchronized 中的 pinning 问题。答出"替换 Tomcat 线程池后 QPS 提升"的实测数据是加分项。
3.3 集合框架(P2,但 HashMap 是 P0 级焦点)
广度清单:ArrayList/LinkedList、HashMap/LinkedHashMap/TreeMap、HashSet、ConcurrentHashMap、CopyOnWriteArrayList、fail-fast/fail-safe。
HashMap 深度下钻(必问):
- 结构:数组 + 链表 + 红黑树;链表转树条件:长度 ≥ 8 且数组长度 ≥ 64(泊松分布解释为什么是 8)。
- 扰动函数:高 16 位与低 16 位异或,减少高位信息丢失导致的碰撞。
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}- 容量为什么必须是 2 的幂:
(n-1) & hash可用位运算取模,且扩容时元素只需判断新增 bit 是 0 还是 1,无需重新计算。 - 扩容流程、1.7 头插死循环 vs 1.8 尾插、多线程下应选 ConcurrentHashMap(1.8:CAS + synchronized 锁单个桶节点,size 用 LongAdder 风格计数)。
3.4 IO 与网络(P2)
广度清单:BIO/NIO/AIO、IO 多路复用(select/poll/epoll)、零拷贝、Netty(Reactor、ByteBuf、内存池)、TCP 三次握手/四次挥手、TIME_WAIT、滑动窗口、拥塞控制、HTTP/HTTPS/HTTP2。
深度下钻:
- epoll 相比 select 的优势:无 fd 数量限制、事件驱动回调(epoll_wait)、LT/ET 模式。
- 零拷贝:sendFile、mmap、Kafka/RocketMQ 如何使用 mmap + 页缓存。
- Netty 主从 Reactor 模型;堆外内存与 DirectByteBuffer 的回收时机。
- TIME_WAIT 大量出现怎么排查(短连接 + 主动关闭方),如何优化。
3.5 Spring 生态(P0)
广度清单:IoC/DI、Bean 生命周期、作用域、循环依赖、AOP 实现、事务(传播行为/失效场景)、SpringBoot 自动配置、starter 机制、SpringCloud 组件。
Bean 生命周期(背诵主线):
深度下钻:
- 循环依赖与三级缓存:为什么需要第三级缓存(提前暴露 ObjectFactory,解决 AOP 代理对象提前引用问题);构造器注入为何无法解决。
- AOP:JDK 动态代理(接口)vs CGLIB(子类,final 类无法代理);SpringBoot 2.x 起默认 CGLIB。
- 事务失效八大场景:自调用、非 public、异常被吞、异常类型不匹配(默认只回滚 RuntimeException/Error)、传播行为不当、多线程、未被 Spring 管理、数据库引擎不支持。
- 自动配置原理:
@EnableAutoConfiguration→@Import(AutoConfigurationImportSelector)→ 读取AutoConfiguration.imports(旧版 spring.factories)→@Conditional条件装配。
常用传播行为速记:REQUIRED(有则加入,无则新建,默认)、REQUIRES_NEW(挂起当前、新开事务)、NESTED(保存点嵌套)。
3.6 MySQL(P0,面试最高频)
广度清单:索引原理与优化、事务 ACID、隔离级别、MVCC、锁机制、日志系统(redo/undo/binlog)、缓冲池、SQL 调优。
索引深度下钻:
- 为什么用 B+ 树:对比 B 树(叶子才存数据、范围查询友好、树更矮 IO 更少)、红黑树(树高不可控)、Hash(不支持范围)。
- 聚簇索引 vs 二级索引、回表、覆盖索引、索引下推(ICP)、最左前缀、索引失效场景(函数计算、隐式类型转换、
!=/OR不当、前导模糊 LIKE)。
事务与 MVCC:
- 隔离级别:RU/RC/RR/Serializable;MySQL 默认 RR。
- MVCC:undo log 版本链 + ReadView;RC 每次 SELECT 生成新 ReadView,RR 仅事务首次生成——一句话区分两者差异。
- RR 下如何解决幻读:快照读靠 MVCC,当前读靠 Next-Key Lock。
锁体系:全局锁、表锁、行锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock);死锁排查:SHOW ENGINE INNODB STATUS 看最近死锁日志。
日志三剑客(必背):
| 日志 | 层级 | 作用 |
|---|---|---|
| redo log | InnoDB 引擎层 | 崩溃恢复(WAL,保证持久性) |
| undo log | InnoDB 引擎层 | 事务回滚 + MVCC 版本链 |
| binlog | Server 层 | 主从复制、归档恢复 |
两阶段提交保证 redo 与 binlog 一致——被追问"为什么更新语句要先写 redo 再写 binlog"时的标准答案。
SQL 调优答题套路:慢查询日志定位 → EXPLAIN 看 type/key/rows/Extra(出现 filesort、temporary 要警惕)→ 优化索引/改写 SQL/分页优化(延迟关联)→ 验证。
3.7 Redis(P0)
广度清单:数据结构与底层编码、持久化(RDB/AOF)、过期策略与内存淘汰、主从/哨兵/Cluster、缓存穿透/击穿/雪崩、缓存一致性、分布式锁、大 key 与热 key。
数据结构与底层编码(深度体现):String→SDS;List→quicklist;Hash/Zset 小数据 listpack、大数据 hashtable/skiplist;跳表为什么不用红黑树(实现简单、范围查询友好)。
缓存三剑客对比(必背表):
| 问题 | 现象 | 解法 |
|---|---|---|
| 穿透 | 查不存在的数据,缓存无、DB 被击穿 | 缓存空值 / 布隆过滤器 / 参数校验 |
| 击穿 | 热点 key 过期瞬间并发打到 DB | 互斥锁重建 / 逻辑过期 / 永不过期+异步刷新 |
| 雪崩 | 大量 key 同时过期或 Redis 宕机 | 过期时间加随机值 / 多级缓存 / 限流降级 / 集群高可用 |
缓存一致性:Cache Aside(先更新 DB 再删缓存)是默认答案;能讲清"延迟双删"与"binlog 订阅(Canal)兜底"是加分项;能说出"强一致需要分布式事务,工程上追求最终一致"是高级视角。
分布式锁:SET key val NX PX 起步 → Lua 脚本保证原子释放 → 看门狗续期(Redisson)→ Redlock 的争议(时钟假设)能主动提及体现深度。
高可用演进:主从(读写分离)→ 哨兵(自动故障转移)→ Cluster(16384 槽分片,MOVED/ASK 重定向)。
3.8 消息队列(P1)
高频问题四连:
- 如何保证不丢:生产者 confirm/事务消息 + Broker 持久化(同步刷盘/多副本)+ 消费者手动 ACK,三段都要答。
- 如何保证顺序:同一业务 key 路由到同一分区/队列 + 单线程消费;全局顺序则单分区。
- 如何保证幂等:唯一 ID + 去重表/Redis Set/数据库唯一键,消费端兜底。
- 积压怎么办:临时扩容消费者 + 转发到新 topic 扩并行度 + 修复根因 + 事后回放。
选型对比:
| MQ | 特点 | 适用 |
|---|---|---|
| Kafka | 高吞吐、日志流式生态 | 大数据、日志、流处理 |
| RocketMQ | 事务消息、延迟消息、顺序消息完善 | 业务系统、电商交易 |
| RabbitMQ | AMQP、路由灵活、管理成熟 | 中小规模、复杂路由 |
3.9 分布式理论与实践(P1)
理论:CAP(分区容错必选,CP/AP 是取舍)、BASE;一致性协议 Raft 核心流程(Leader 选举 → 日志复制 → 安全性约束)能画能讲。
分布式事务选型(必背表):
| 方案 | 一致性 | 性能 | 适用 |
|---|---|---|---|
| 2PC/XA | 强一致 | 低(同步阻塞) | 传统数据库场景 |
| TCC | 强一致(业务补偿) | 中 | 资金类、短流程 |
| Saga | 最终一致 | 高 | 长流程、跨服务编排 |
| 本地消息表/事务消息 | 最终一致 | 高 | 异步解耦的可靠通知 |
答题套路:"先看业务能否接受最终一致,能接受优先事务消息/本地消息表;资金类强一致用 TCC;能用 Saga 编排的长流程不上 2PC。"
分布式 ID:UUID(无序伤索引)→ 号段模式(Leaf)→ 雪花算法(时钟回拨问题与解法:等待/备用位/逻辑时钟)。
分布式锁三方案对比:Redis(性能高、需处理过期与续期)、ZK(可靠、临时顺序节点、性能一般)、DB(简单、性能差)——按业务对可靠性与性能的要求选。
3.10 微服务与高可用(P2)
广度清单:注册中心对比(Nacos CP/AP 可切换、Eureka AP、ZK CP)、负载均衡策略、网关职责(鉴权/限流/路由/灰度)、熔断降级、限流算法、链路追踪、灰度发布。
限流算法对比(高频):
| 算法 | 特点 | 缺点 |
|---|---|---|
| 固定窗口 | 简单 | 临界突刺 |
| 滑动窗口 | 平滑统计 | 实现稍复杂 |
| 漏桶 | 恒定速率出流量 | 无法应对突发 |
| 令牌桶 | 允许一定突发 | 需维护令牌生成 |
熔断三态:关闭 → 打开 → 半开;能讲清滑动窗口统计失败率触发熔断即达深度。
3.11 系统设计 / 场景题(高级岗胜负手)
答题五步框架(万能套路):
- 澄清需求:QPS/数据量/一致性要求/可用性目标(主动问,体现工程素养)。
- 容量估算:QPS × 单请求大小 → 带宽/存储,算分库分表数量。
- 核心流程:画出主链路(复用第二章那张图)。
- 找瓶颈:读多→缓存/读写分离;写多→异步化/分片;热点→本地缓存/隔离。
- 演进与兜底:限流、降级、灰度、监控告警。
高频场景速查:
| 场景 | 核心考点 | 关键词 |
|---|---|---|
| 秒杀 | 流量漏斗层层过滤 | 静态化、限流、库存预扣(Redis Lua)、异步下单、超卖 |
| 短链系统 | 发号器 + 重定向 | 雪花/自增 ID + Base62、301/302、布隆去重 |
| Feed 流 | 推拉结合 | 大 V 拉、普通用户推、Timeline 归并 |
| 抢红包 | 预拆包 | 提前生成金额列表、Redis LPOP、异步入账 |
| 延迟任务 | 实现选型 | 时间轮/DelayQueue/RocketMQ 延迟消息 |
四、如何把零散知识点串成体系
4.1 三种串联方法
方法一:主线串联法——沿"请求生命周期"把知识挂上去(见 2.2)。每学一个技术先回答:它位于链路哪一环?解决什么瓶颈?
方法二:五问表格法——任何新技术都用同一张表吃透,天然形成横向对比:
| 五问 | 示例(Redis) |
|---|---|
| 是什么 | 内存 KV 存储 |
| 为什么需要它(解决什么) | DB 扛不住高频读 |
| 怎么实现的 | 单线程 + epoll + 内存数据结构 |
| 代价与边界 | 容量有限、持久化有损风险 |
| 我用在哪 | 项目中的会话缓存/排行榜 |
方法三:问题树法——以一个高频问题为树干,向下拆子问题。示例(HashMap):
HashMap 为什么快?
├── 哈希定位 O(1)
│ ├── hash 扰动函数为什么这样写?
│ └── 为什么容量是 2 的幂?
├── 冲突处理
│ ├── 链表为什么转红黑树?阈值为什么是 8?
│ └── 为什么不用跳表?
└── 扩容
├── 2 倍扩容的好处?
└── 1.7 死循环的根因?4.2 高频通用骨架(背骨架而非背答案)
- "如何保证 XX"类:先拆链路分段(生产→传输→存储→消费),每段给手段,最后谈兜底与监控。
- "如何选型"类:列 3 个候选 → 定评估维度(性能/一致性/成本/运维)→ 给结论与理由。
- "性能优化"类:先定位(监控/压测数据)→ 分层优化(网络/应用/缓存/DB/JVM)→ 验证(对比数据)→ 防劣化(基线与告警)。
五、临场表达:四个答题模板
5.1 模板 A:原理题五步法(是什么→为什么→怎么做→取舍→实践)
例题:"说说你对线程池的理解" ① 一句话定位:线程池本质是生产者-消费者模型,复用线程避免创建销毁开销。 ② 为什么需要:线程是稀缺资源,频繁创建开销大且无法限流。 ③ 怎么工作:core→队列→max→拒绝策略(配执行流程图讲)。 ④ 取舍:IO 密集线程可多、CPU 密集线程≈核数;队列不宜无界。 ⑤ 实践:我在 XX 项目中把异步任务从 Executors.newFixedThreadPool 改为自定义线程池 + 有界队列 + 告警,避免了 OOM。
5.2 模板 B:对比/选型题(先给结论 → 维度表格 → 场景落地)
结论先行 10 秒,再用 2-3 个维度展开,最后落到"我在什么场景选了什么、效果如何"。
5.3 模板 C:项目经验题 STAR-L
Situation(背景)→ Task(你的职责)→ Action(方案与关键决策)→ Result(量化数据:QPS/RT/成本下降百分比)→ Lesson(踩坑与沉淀)。L 是高级岗的灵魂——能讲出坑才证明真做过。
5.4 模板 D:故障排查题(现象 → 定位过程 → 根因 → 修复 → 预防)
提前准备 2-3 个真实故障剧本:一次 OOM/CPU 100%、一次慢 SQL、一次缓存事故。每个剧本按此五段练到 3 分钟内讲完。
5.5 表达禁忌
- 只背名词不讲"为什么"——高级面试直接减分。
- 说"我们做了 XX"却讲不清自己负责什么——追问即露馅。
- 被问住时硬编——正确做法:坦诚边界 + 给出推理思路("我没在生产用过,但按我的理解它应该……")。
- 不给数据——"性能提升明显"不如"RT 从 200ms 降到 60ms"。
六、长期记忆策略
6.1 费曼输出法(最有效)
每个模块学完后做两件事:① 用自己的话写一篇 500 字总结(讲不清的地方就是没懂的地方);② 找一个不懂技术的人(或对着墙)讲一遍核心原理。
6.2 艾宾浩斯复习表
| 复习轮次 | 时间点 | 动作 |
|---|---|---|
| R1 | 当天睡前 | 闭卷默写当日模块的思维导图主干 |
| R2 | 第 2 天 | 遮住答案自问自答高频题 |
| R3 | 第 4 天 | 跨模块串联(如 Redis 缓存 + MySQL 一致性) |
| R4 | 第 7 天 | 模拟面试(录音回放) |
| R5 | 第 15 天 | 只复习错题本与薄弱模块 |
6.3 关键词挂钩示例
- 线程池:核→队→最→拒(四步流程)
- 缓存三剑客:穿(不存在)→ 击(单点热)→ 雪(集体倒)
- MVCC:版本链 + ReadView,RC 次次读、RR 读一次
- 事务日志:redo 保命(崩溃恢复)、undo 后悔(回滚)、binlog 传宗(复制)
6.4 错题本机制
每次模拟/真实面试后记录:被问住的题 → 正确答案 → 当时为什么卡壳(没学过/学过没懂/懂了不会讲)。三种卡壳对应三种补法,一周后重测。
七、四周备考计划
| 周次 | 主攻模块 | 每日动作 |
|---|---|---|
| 第 1 周 | JVM + 并发(P0) | 上午精读原理,下午画思维导图,晚上自问自答 |
| 第 2 周 | MySQL + Redis(P0) | 同上 + 动手执行 EXPLAIN/redis-cli 验证 |
| 第 3 周 | Spring + MQ + 分布式(P1) | 整理对比表格,写项目经验 STAR-L 稿 |
| 第 4 周 | 系统设计 + 全面复盘 | 每天一场模拟面试(录音),按错题本补漏 |
每日节奏建议:30 分钟复习旧模块(艾宾浩斯)+ 2 小时新内容精读 + 1 小时输出(默写/讲题)+ 30 分钟真题演练。
面试前 24 小时清单:
- [ ] 自我介绍 1/3 分钟两版,突出 2 个亮点项目
- [ ] 2 个项目 STAR-L 稿 + 3 个故障剧本过一遍
- [ ] 八张必背对比表(收集器/锁/缓存三剑客/事务方案/MQ/限流算法/传播行为/日志)
- [ ] 反问环节准备 2-3 个问题(团队技术栈、业务挑战、成长路径)
附:高频必答题速查表(Top 30)
| # | 问题 | 一句话答题锚点 |
|---|---|---|
| 1 | HashMap 原理 | 数组+链表+红黑树,扰动函数,2 的幂,8 树化,2 倍扩容 |
| 2 | ConcurrentHashMap | 1.7 分段锁 → 1.8 CAS+synchronized 锁桶节点 |
| 3 | synchronized 锁升级 | 偏向→轻量级 CAS→重量级,竞争逐步升级 |
| 4 | volatile | 可见性(MESI/总线)+ 禁重排(内存屏障),不保证原子 |
| 5 | AQS | state + CLH 队列,模板方法模式 |
| 6 | 线程池参数与流程 | 核→队→最→拒,IO/CPU 密集定参 |
| 7 | ThreadLocal 泄漏 | 弱引用 key + 线程常驻,用完必 remove |
| 8 | 虚拟线程 | JVM 调度的用户态线程,M:N,IO 密集利器 |
| 9 | JVM 内存区域 | 堆/方法区共享,栈/程序计数器私有 |
| 10 | GC 分代与算法 | 复制(新)、标记整理(老),分代假说 |
| 11 | G1 vs ZGC | G1 区域化可预测停顿;ZGC 着色指针 <1ms |
| 12 | OOM 排查 | jmap + MAT 支配树 + 泄漏链 |
| 13 | 类加载与双亲委派 | 加载→链接→初始化,委派保唯一性,SPI 打破 |
| 14 | Bean 生命周期 | 实例化→填充→Aware→初始化→代理→销毁 |
| 15 | 循环依赖三级缓存 | 三级 ObjectFactory 解决代理提前暴露 |
| 16 | 事务失效场景 | 自调用/非 public/异常被吞/类型不符 |
| 17 | 自动配置 | ImportSelector + imports 文件 + Conditional |
| 18 | B+ 树索引 | 矮胖、叶子链表、范围友好 |
| 19 | 最左前缀与失效 | 函数/隐式转换/前导模糊 |
| 20 | MVCC | undo 版本链 + ReadView,RC 与 RR 的差异点 |
| 21 | redo/undo/binlog | 恢复/回滚/复制,两阶段提交 |
| 22 | MySQL 锁 | 行锁/间隙锁/临键锁,RR 防幻读 |
| 23 | Redis 单线程为何快 | 纯内存 + epoll + 单线程免锁 |
| 24 | 穿透/击穿/雪崩 | 空值布隆/互斥续期/随机过期+集群 |
| 25 | 缓存一致性 | Cache Aside + 延迟双删/binlog 兜底 |
| 26 | Redis 分布式锁 | SET NX PX + Lua 释放 + 看门狗 |
| 27 | MQ 不丢消息 | 生产 confirm + 持久化 + 手动 ACK |
| 28 | 分布式事务 | 优先最终一致(事务消息),资金用 TCC |
| 29 | 雪花算法 | 64 位三段,时钟回拨是考点 |
| 30 | 秒杀设计 | 层层过滤 + Redis 预扣 + 异步下单 |
最后一句话:高级面试不是知识竞赛,而是"用结构化的表达,证明你有体系化的工程能力"。广度建立地图,深度打下井,体系连成网,表达磨成刃——四者合一,offer 自来。
