跳到内容
文章列表

后端开发面试高频知识点:数据库、缓存、消息队列全解析

OfferGo 团队

AI面试专家

4 分钟

后端开发面试高频知识点全解析

数据库

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领域驱动设计:实体、值对象、聚合根、领域服务。微服务拆分原则。设计模式考察集中:单例、工厂、策略、观察者、代理模式。控制反转和依赖注入的好处:降低耦合、方便测试。

后端面试的核心是展示系统化思维。不要只回答问题表面,要深入原理并能关联实际场景。结合项目经验,用数据量化成果。保持对新技术的好奇心和实践是成长的关键。