后端开发面试高频知识点全解析
数据库
MySQL核心问题
索引是后端面试最高频的考点。B+树的结构:非叶子节点只存键值不存数据,叶子节点存全部数据并用双向链表连接。这带来了范围查询的高效性和稳定的IO次数。
聚簇索引和非聚簇索引的区别:聚簇索引的叶子节点直接存整行数据,一个表只能有一个;非聚簇索引叶子节点存主键值,需要回表查询。这就是为什么建议用自增主键(顺序插入减少页分裂)。
最左前缀原则是联合索引的核心。联合索引(a,b,c)相当于创建了(a)、(a,b)、(a,b,c)三个索引。查询条件必须是索引的最左列开始且不能跳过中间列。
SQL优化是实操考察重点。EXPLAIN分析执行计划的几个关键字段:type(const>eq_ref>ref>range>index>ALL)、key(实际使用的索引)、rows(扫描行数)、Extra(Using filesort/Using temporary需要优化)。慢查询优化流程:开启slow_query_log、用mysqldumpslow分析、EXPLAIN定位问题、加索引或改写SQL。
事务与锁
事务四大特性ACID:原子性(undo log回滚)、一致性(事务前后数据满足约束)、隔离性(MVCC+锁机制)、持久性(redo log保证)。
四种隔离级别:读未提交、读已提交、可重复读(MySQL默认)、串行化。脏读、不可重复读、幻读分别在哪一级别出现?InnoDB如何通过MVCC+Next-Key Lock在可重复读级别解决幻读?
行锁(Record Lock)、间隙锁(Gap Lock)、临键锁(Next-Key Lock)的区别和适用场景非常关键。
缓存
Redis核心数据结构
String不只是存字符串,可以存JSON、数字(incr原子自增)、二进制。分布式锁用SETNX+过期时间实现。
Hash适合存对象属性,内存优化好于多个String key。List可实现消息队列(LPUSH+BRPOP阻塞消费)、最新列表。Set的交并差集操作适合共同关注、推荐场景。ZSet通过score排序,排行榜必备。
缓存问题三件套
缓存穿透:查询不存在的数据,绕过缓存直接打DB。解决方案:布隆过滤器、缓存空值。
缓存击穿:热点key过期瞬间大量请求打DB。解决方案:互斥锁、逻辑过期(不设TTL,后台异步更新)。
缓存雪崩:大量key同时过期或Redis宕机。解决方案:过期时间加随机值、Redis集群+哨兵、限流降级。
Redis高可用
持久化:RDB快照(全量、恢复快、可能丢数据)、AOF日志(增量、更安全、文件大)。
主从复制:读写分离,全量同步+增量同步。哨兵模式:自动故障转移。集群模式:数据分片,16384个slot。
消息队列
为什么需要消息队列
削峰填谷应对流量高峰、异步处理提升响应速度、解耦系统间依赖。
消息可靠性
生产者确认机制、Broker持久化、消费者手动ACK。消息幂等性通过数据库唯一索引+Redis去重实现。
分布式系统
CAP理论:一致性、可用性、分区容错不可兼得。BASE理论:基本可用、软状态、最终一致性。
分布式ID生成:UUID(简单但有性能问题)、数据库自增(单点瓶颈)、Snowflake(1位不用+41位时间戳+10位机器ID+12位序列号)。
分布式事务:两阶段提交(XA协议)、TCC(Try-Confirm-Cancel)、本地消息表、RocketMQ事务消息。
分布式锁:数据库乐观锁、Redis SETNX+过期时间、Zookeeper临时顺序节点。
设计模式与架构
DDD领域驱动设计:实体、值对象、聚合根、领域服务。微服务拆分原则。设计模式考察集中:单例、工厂、策略、观察者、代理模式。控制反转和依赖注入的好处:降低耦合、方便测试。
后端面试的核心是展示系统化思维。不要只回答问题表面,要深入原理并能关联实际场景。结合项目经验,用数据量化成果。保持对新技术的好奇心和实践是成长的关键。