跳到正文
Java 入门到面试指南
返回

02-数据库与中间件面试速查

阶段:面试篇 | 用法:遮住答案自测,能独立说出 3 条以上要点再打勾;冲刺期每天过一遍

使用说明

  • 格式:- [ ] **Q:xxx?** —— 一句话核心答案 | 详见《对应指南文件名》;一句话只是提醒,打勾标准是能展开说 3 条以上要点;
  • 本文件覆盖数据库、中间件、网络、操作系统四大块——它们与 Java 八股共同构成一面/二面的主力题源;
  • 先看下方”板块频率与追问链速览”排优先级:MySQL 与 Redis 出现频率最高,建议每天至少各过一遍;
  • MQ 按”作用 → 可靠性 → 不丢不重”一条线连着记,别孤立背每个组件的特性;
  • 网络与操作系统偏”概念 + 排查”:三次握手、epoll、零拷贝要与 IO 模型篇对照着理解,不要死背;
  • 本清单与《01-Java高频八股速查》交替着过,避免同一板块刷久了疲劳效率下降;
  • 场景类题目(分库分表、秒杀、限流)的完整设计思路见《02-高并发系统设计》。

板块频率与追问链速览

板块出现频率典型追问链
MySQL⭐⭐⭐⭐⭐索引结构 → 回表/覆盖 → 失效场景 → explain → 事务/MVCC → 三大日志 → 分库分表
Redis⭐⭐⭐⭐⭐数据类型 → 持久化 → 缓存三问题 → 一致性 → 分布式锁 → 主从/哨兵/集群
消息队列⭐⭐⭐⭐为什么用 → 不丢消息 → 不重复(幂等)→ 顺序 → 三大 MQ 选型
ES/ZK/Nacos⭐⭐⭐倒排索引 → 与 MySQL 分工 → 数据同步;ZK Watcher/锁;Nacos AP/CP
网络⭐⭐⭐⭐握手挥手 → HTTPS → epoll → HTTP 方法/状态码 → 粘包
操作系统⭐⭐进程线程 → 死锁 → 虚拟内存 → 零拷贝/IO 多路复用

自测清单

MySQL(20 题)

面试形式:必考板块,从一道索引题出发能连追问十分钟;“你项目里加过什么索引、为什么”是标准衔接。

  • Q:为什么用 B+ 树而不是 B 树/哈希/红黑树? —— 矮胖 3 层可存千万级数据、叶子链表支持范围查询;哈希不支持范围,红黑树/AVL 树太高 IO 次数多 | 详见《索引-事务-锁与调优》
  • Q:聚簇索引与二级索引的区别? —— 聚簇索引叶子存整行数据(InnoDB 必有,默认主键),二级索引叶子存主键值 | 详见《索引-事务-锁与调优》
  • Q:什么是回表? —— 用二级索引只拿到主键,还要回聚簇索引再查一次整行;查询列都在索引里则免回表 | 详见《索引-事务-锁与调优》
  • Q:什么是覆盖索引? —— 查询所需列全部包含在索引中,无需回表;是”只查需要的列”与联合索引设计的核心依据 | 详见《索引-事务-锁与调优》
  • Q:最左前缀原则? —— 联合索引 (a,b,c) 必须从 a 开始连续命中才走索引,遇到范围查询后索引列失效 | 详见《索引-事务-锁与调优》
  • Q:索引失效的常见场景? —— 索引列上函数/运算、隐式类型转换、前导 % 模糊、or 连接非索引列、违反最左前缀、优化器认为全表更快 | 详见《索引-事务-锁与调优》
  • Q:explain 主要看哪些字段? —— type(至少 range,理想 ref/const)、key(实际用的索引)、rows(预估扫描行数)、Extra(出现 Using filesort/Using temporary 要优化)| 详见《索引-事务-锁与调优》
  • Q:ACID 分别靠什么实现? —— 原子性靠 undo log、持久性靠 redo log、隔离性靠锁+MVCC、一致性是前三者共同保障的结果 | 详见《索引-事务-锁与调优》
  • Q:四种隔离级别? —— 读未提交 → 读已提交(解决脏读)→ 可重复读(InnoDB 默认,解决不可重复读)→ 串行化;InnoDB 的 RR 用 MVCC+间隙锁基本杜绝幻读 | 详见《索引-事务-锁与调优》
  • Q:MVCC 的原理? —— 隐藏字段 trx_id/roll_pointer + undo log 版本链 + ReadView 可见性判断;RC 每次查询生成 ReadView,RR 事务内复用第一次的 | 详见《索引-事务-锁与调优》
  • Q:三大日志的作用? —— redo log 保证崩溃恢复(WAL、循环写)、undo log 支持回滚与 MVCC、binlog 用于主从复制与数据恢复(Server 层、追加写)| 详见《索引-事务-锁与调优》
  • Q:redo log 和 binlog 的区别? —— 层级(InnoDB vs Server)、形态(循环写 vs 追加写)、用途(崩溃恢复 vs 复制/恢复)都不同;两阶段提交保证两者一致 | 详见《索引-事务-锁与调优》
  • Q:InnoDB 有哪些锁? —— 行锁(记录锁/间隙锁/临键锁)、表锁、意向锁;行锁是加在索引上的,无索引条件更新会升级为全表扫描锁住大量记录 | 详见《索引-事务-锁与调优》
  • Q:慢 SQL 怎么排查优化? —— 慢查询日志定位 → explain 分析执行计划 → 优化索引/改写 SQL/覆盖索引 → 数据量太大再考虑分库分表 | 详见《索引-事务-锁与调优》
  • Q:分库分表怎么拆? —— 先垂直(按业务拆库、大字段拆表)再水平(按分片键散列行);分片键要满足高频查询条件且分布均匀 | 详见《索引-事务-锁与调优》
  • Q:分库分表带来哪些问题? —— 跨片 join/分页/聚合困难、跨库事务、全局唯一 ID、扩容数据迁移;能用缓存/ES 撑住就别急着拆 | 详见《02-高并发系统设计》
  • Q:深分页怎么优化? —— LIMIT 1000000,10 要扫描并丢弃前 100 万行;改成游标(WHERE id > 上次最大值)、子查询先定位 id、或覆盖索引 | 详见《索引-事务-锁与调优》
  • Q:inner join / left join / right join 的区别? —— inner 取两表交集;left 保留左表全部行、右表无匹配补 NULL;right 相反 | 详见《MySQL基础与SQL实战》
  • Q:char 与 varchar 的区别? —— char 定长、空间换性能、适合定长数据(手机号/MD5);varchar 变长、多 1~2 字节长度头,按实际长度存储 | 详见《MySQL基础与SQL实战》
  • Q:drop、delete、truncate 的区别? —— drop 删表结构与数据;delete 逐行删、可回滚、可带 where;truncate 清空全表重置自增,属 DDL 不可回滚 | 详见《MySQL基础与SQL实战》

Redis(15 题)

面试形式:与 MySQL 并列的必考板块;缓存三问题 + 一致性 + 分布式锁是固定三连,答好了会追问集群。

  • Q:Redis 为什么快? —— 纯内存操作 + 命令执行单线程(无锁无切换)+ epoll IO 多路复用 + 针对场景优化的数据结构 | 详见《01-Redis》
  • Q:五种基本类型与使用场景? —— String 缓存/计数/分布式锁,Hash 对象属性,List 队列/时间线,Set 去重/抽奖/交并集,ZSet 排行榜/延迟队列 | 详见《01-Redis》
  • Q:RDB 与 AOF 怎么选? —— RDB 快照恢复快、可能丢最后一次快照后的数据;AOF 追加日志丢得少但文件大;4.0 混合持久化(RDB 底座+AOF 增量)兼得 | 详见《01-Redis》
  • Q:过期删除策略? —— 惰性删除(访问时检查)+ 定期删除(随机抽检)组合,内存超限再触发淘汰策略 | 详见《01-Redis》
  • Q:内存淘汰策略? —— 默认 noeviction 写报错;缓存场景用 allkeys-lru,含过期集合维度有 volatile-lru/lfu 等 8 种 | 详见《01-Redis》
  • Q:缓存穿透及解决? —— 查询不存在的数据每次都打穿到 DB;空值缓存、布隆过滤器、入口参数校验 | 详见《01-Redis》
  • Q:缓存击穿及解决? —— 单个热点 key 过期瞬间大量请求直击 DB;互斥锁重建、逻辑过期不删 key、热点数据不过期 | 详见《01-Redis》
  • Q:缓存雪崩及解决? —— 大量 key 同时失效或 Redis 宕机;TTL 加随机值、多级缓存、集群高可用、限流降级兜底 | 详见《01-Redis》
  • Q:缓存与数据库一致性? —— Cache Aside 先更新 DB 再删除缓存 + 失败重试;要求更高用延迟双删;终极方案 canal 订阅 binlog 异步删缓存 | 详见《01-Redis》
  • Q:用 Redis 写分布式锁要注意什么? —— SET key uniqueValue NX EX 原子加锁;value 存唯一标识防误删;解锁用 Lua 校验后删除 | 详见《01-Redis》
  • Q:Redisson 分布式锁的原理? —— Lua 加解锁 + Hash 结构记录持有线程与重入次数;看门狗默认 30 秒锁、每 10 秒续期,解决业务超时锁先过期 | 详见《01-Redis》
  • Q:主从复制的流程? —— 首次全量同步(主库生成 RDB 传给从库)+ 复制缓冲区增量,之后命令异步传播;读写分离依赖它 | 详见《01-Redis》
  • Q:哨兵的作用? —— 监控主库、通知运维、自动故障转移(选新主)、充当配置中心;至少 3 个哨兵节点防止误判与脑裂 | 详见《01-Redis》
  • Q:Cluster 集群的原理? —— 16384 个槽位按 CRC16 分片到各主节点,客户端请求错位收 MOVED 重定向;gossip 协议通信,主从自动切换 | 详见《01-Redis》
  • Q:大 key 与热 key 怎么处理? —— 大 key:拆分成多个 key、用 UNLINK 异步删除、避免集合过大;热 key:本地缓存兜底、副本打散、限流 | 详见《01-Redis》

消息队列(12 题)

面试形式:围绕”不丢消息、不重复消费、保证顺序”三问展开,项目里用过 MQ 才答得出体感。

  • Q:消息队列的三大作用? —— 异步(缩短响应时间)、解耦(生产者消费者互不依赖)、削峰(洪峰进队列匀速消费)| 详见《02-RabbitMQ》
  • Q:RabbitMQ 的四种交换机? —— direct 精确匹配、fanout 广播、topic 通配符匹配、headers 按头部匹配;业务路由多用 topic | 详见《02-RabbitMQ》
  • Q:RabbitMQ 如何保证消息不丢? —— 三段:生产者 confirm 确认、交换机/队列/消息持久化、消费者手动 ack,任一环节失败可重发 | 详见《02-RabbitMQ》
  • Q:死信队列是什么? —— 消息被拒绝/过期/队列满时路由到 DLX;用途是异常消息兜底,以及 TTL+死信实现延迟队列 | 详见《02-RabbitMQ》
  • Q:Kafka 为什么快? —— 顺序写磁盘+页缓存、零拷贝 sendfile、批量发送与压缩、分区并行消费 | 详见《03-Kafka》
  • Q:Kafka 的 ACK 机制? —— 0 不等待、1 主分区落盘即确认、all(-1)等 ISR 全部确认;可靠性要求高用 all + retries | 详见《03-Kafka》
  • Q:ISR 是什么? —— 与 leader 保持同步的副本集合(含 leader),落后超过阈值被踢出;all ACK 只等 ISR 成员,兼顾可靠与性能 | 详见《03-Kafka》
  • Q:消费组与 rebalance? —— 组内消费者分摊分区且一个分区只归一个消费者;成员增减触发重平衡,期间会停止消费且可能重复消费 | 详见《03-Kafka》
  • Q:Kafka 怎么保证消息顺序? —— 只保证分区内有序;需要顺序的业务按 key 路由到同一分区,消费端单线程处理该分区 | 详见《03-Kafka》
  • Q:RocketMQ 事务消息的原理? —— 半消息(消费者不可见)→ 执行本地事务 → 提交/回滚半消息;Broker 定时回查事务状态兜底 | 详见《04-RocketMQ》
  • Q:重复消费怎么办(幂等)? —— MQ 是至少一次投递,重复不可避免;消费端用唯一业务键 + 去重表/Redis SETNX/状态机校验实现幂等 | 详见《04-RocketMQ》
  • Q:RabbitMQ/Kafka/RocketMQ 怎么选型? —— RabbitMQ 低延迟、功能全、适合中小业务;Kafka 吞吐王、适合日志与大数据;RocketMQ 电商业务(事务/延迟/顺序消息全支持)| 详见《04-RocketMQ》

Elasticsearch/ZooKeeper/Nacos(12 题)

面试形式:ES 问倒排索引与和 MySQL 的分工;ZK/Nacos 问 AP/CP 与服务发现原理,JD 提到才深挖。

  • Q:什么是倒排索引? —— 分词后建立”词项 → 文档列表”的映射,查询按词直达文档,FST 结构压缩词典,这是全文检索快的根本 | 详见《05-Elasticsearch》
  • Q:ES 和 MySQL 的分工? —— MySQL 是事务主存(写入源),ES 做检索与聚合的查询副本;各司其职而非互相替代 | 详见《05-Elasticsearch》
  • Q:match 与 term 的区别? —— match 对查询词分词后做全文匹配打分;term 不分词做精确匹配;bool 组合 must/should/filter(filter 不算分且可缓存)| 详见《05-Elasticsearch》
  • Q:ES 的深分页问题? —— from+size 每个分片都要取 from+size 条排序,默认限制 1 万;翻页深用 search_after 游标,全量导出用 scroll | 详见《05-Elasticsearch》
  • Q:text 和 keyword 类型的区别? —— text 分词、参与相关性打分,用于全文搜索;keyword 不分词、整体匹配,用于精确过滤与聚合排序 | 详见《05-Elasticsearch》
  • Q:MySQL 数据怎么同步到 ES? —— 主流用 canal 监听 binlog → 发 MQ → 消费写入 ES,解耦且不侵入业务;代码双写是简易方案但有一致性风险 | 详见《05-Elasticsearch》
  • Q:ZooKeeper 的应用场景? —— 分布式锁、注册中心、配置中心、Master 选举;本质是基于”文件系统 + Watcher”的协调服务 | 详见《06-ZooKeeper与Nacos》
  • Q:Watcher 机制的特点? —— 一次性触发(触发后需重新注册)、轻量(只推事件类型不推数据)、顺序性(客户端先收到事件再看到新数据)| 详见《06-ZooKeeper与Nacos》
  • Q:临时节点与顺序节点? —— 临时节点随会话断开自动删除(服务发现/锁的基石);顺序节点由 ZK 追加序号保证全局有序(锁排队)| 详见《06-ZooKeeper与Nacos》
  • Q:ZAB 协议做了什么? —— 崩溃恢复(按 zxid/epoch 选主)+ 消息广播(类似两阶段提交、过半即提交);因此 ZK 是 CP 系统 | 详见《06-ZooKeeper与Nacos》
  • Q:Nacos 的 AP 与 CP 怎么选? —— 临时实例走 Distro 协议(AP,默认),持久实例与配置中心走 Raft(CP);服务发现一般用 AP 保可用 | 详见《06-ZooKeeper与Nacos》
  • Q:注册中心的服务发现原理? —— 服务启动时注册地址 → 消费者订阅并拉取列表缓存本地 → 心跳续约剔除失效实例 → 变更推送更新本地缓存 | 详见《06-ZooKeeper与Nacos》

网络(15 题)

面试形式:一面的保留节目,三次握手/四次挥手与 HTTPS 是出现率最高的两道,常加”从 URL 到页面”综合题。

  • Q:TCP 和 UDP 的区别? —— TCP 面向连接、可靠字节流、有流量/拥塞控制;UDP 无连接、不可靠、报文小延迟低(DNS/视频/游戏)| 详见《03-IO模型与网络编程》
  • Q:为什么三次握手不是两次? —— 确认双方收发能力都正常,并防止历史重复的 SYN 建立无效连接;两次会导致服务端白白维持半连接 | 详见《03-IO模型与网络编程》
  • Q:四次挥手与 TIME_WAIT? —— 双向各发 FIN+ACK;主动方最后等 2MSL:确保对端收到最后的 ACK、让旧报文在网络中消亡 | 详见《03-IO模型与网络编程》
  • Q:TCP 如何保证可靠传输? —— 序列号+确认应答、超时重传/快速重传、滑动窗口流量控制、拥塞控制(慢启动/拥塞避免/快恢复)| 详见《03-IO模型与网络编程》
  • Q:常见 HTTP 状态码? —— 200 成功、301/302 重定向、304 缓存有效、400 参数错、401/403 未认证/无权限、404 不存在、500 服务器错、502/504 网关错误/超时 | 详见《03-IO模型与网络编程》
  • Q:HTTP 方法的幂等性? —— GET/PUT/DELETE 幂等(重复执行效果相同),POST 非幂等;幂等性影响重试设计 | 详见《03-IO模型与网络编程》
  • Q:HTTPS 的握手与加密? —— TCP 之后 TLS 协商套件 → 验证证书(防冒充)→ ECDHE 非对称交换出对称密钥 → 之后对称加密通信;混合加密兼顾安全与性能 | 详见《03-IO模型与网络编程》
  • Q:GET 和 POST 的区别? —— 语义:GET 获取(幂等、参数在 URL、可缓存)vs POST 提交(非幂等、参数在 body);本质都是 TCP 报文,区别是约定 | 详见《03-IO模型与网络编程》
  • Q:TCP 粘包拆包怎么解决? —— TCP 是字节流没有消息边界;定长协议、分隔符、长度前缀(Netty LengthFieldBasedFrameDecoder)三种方案 | 详见《03-IO模型与网络编程》
  • Q:select/poll/epoll 的区别? —— select 有 1024 上限且每次全量拷贝轮询;poll 无上限仍轮询;epoll 红黑树管理 fd + 就绪链表回调,O(1) 只处理就绪的 | 详见《03-IO模型与网络编程》
  • Q:Cookie/Session/Token 的区别? —— Cookie 存客户端随请求携带;Session 存服务端(集群需共享);Token(JWT)自包含无状态、天然适合分布式 | 详见《03-IO模型与网络编程》
  • Q:JWT 的结构与校验? —— Header.Payload.Signature,签名防篡改;服务端无状态验证签发方;缺点是无法主动失效(要配黑名单)| 详见《03-IO模型与网络编程》
  • Q:DNS 的解析过程? —— 浏览器缓存 → 系统缓存 → 本地 DNS(递归)→ 根/顶级/权威服务器(迭代),最终拿到 IP 并缓存 | 详见《03-IO模型与网络编程》
  • Q:HTTP/1.1、2、3 的演进? —— 1.1 长连接但仍有队头阻塞;2 二进制分帧+多路复用解决 HTTP 层阻塞;3 基于 QUIC/UDP 彻底解决 TCP 层队头阻塞 | 详见《03-IO模型与网络编程》
  • Q:从输入 URL 到页面展示发生了什么? —— DNS 解析 → TCP 三次握手 → TLS 握手 → HTTP 请求 → 服务端处理返回 → 浏览器解析渲染,综合串讲题 | 详见《03-IO模型与网络编程》

操作系统(8 题)

面试形式:题少但与网络相通——死锁、IO 多路复用、零拷贝都会在并发与中间件话题里被顺手问到。

  • Q:进程和线程的区别? —— 进程是资源分配单位(独立地址空间),线程是 CPU 调度单位(共享进程堆与方法区,各自有栈);线程切换成本更低 | 详见《03-IO模型与网络编程》
  • Q:进程间通信方式? —— 管道、消息队列、共享内存(最快)、信号量、Socket;线程间直接共享内存但要加锁同步 | 详见《03-IO模型与网络编程》
  • Q:死锁的四个必要条件? —— 互斥、请求与保持、不可剥夺、循环等待;破坏任意一个即可预防,工程上常用资源有序申请 | 详见《03-IO模型与网络编程》
  • Q:什么是虚拟内存? —— 每个进程独立的虚拟地址空间,经页表映射到物理内存,缺页中断按需加载;带来隔离与”内存超售”能力 | 详见《03-IO模型与网络编程》
  • Q:用户态与内核态? —— CPU 权限分级;系统调用/中断触发切换并保存上下文,切换有开销,频繁切换是性能杀手(如大量小 IO)| 详见《03-IO模型与网络编程》
  • Q:IO 多路复用是什么? —— 一个线程同时监听多个 fd,内核告知就绪后才处理;select/poll/epoll 是三种实现,epoll 是高性能服务的标配 | 详见《03-IO模型与网络编程》
  • Q:什么是零拷贝? —— 数据不经过用户态来回拷贝(sendfile/mmap),减少 CPU 拷贝与上下文切换;Kafka、RocketMQ、Nginx 靠它提速 | 详见《03-IO模型与网络编程》
  • Q:fork 是什么?写时复制? —— Unix 创建子进程的系统调用;COW 让父子先共享物理页,任一方写入时才真正复制,降低创建成本 | 详见《03-IO模型与网络编程》

深入学习资料

资料说明链接
JavaGuide MySQL 面试题(系列)索引/事务/日志/锁的完整版答案https://javaguide.cn/database/mysql/mysql-questions-01.html
JavaGuide Redis 面试题(系列)缓存问题与集群的完整版答案https://javaguide.cn/database/redis/redis-questions-01.html
JavaGuide 消息队列入门MQ 基础概念与选型总览https://javaguide.cn/high-performance/message-queue/message-queue.html
JavaGuide 读写分离与分库分表分库分表场景题的完整展开https://javaguide.cn/high-performance/read-and-write-separation-and-library-subtable.html
JavaGuide ZooKeeper 入门ZK 数据模型、ZAB、应用场景https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.html
JavaGuide 面试突击版冲刺期数据库/中间件快速过题https://interview.javaguide.cn/home.html
pdai 面试知识体系数据库/中间件/网络的专题题库https://pdai.tech/md/interview/x-interview.html