加载中

面经

文章分类

浏览该分类下的所有文章

48 篇文章 4

SQL

文章系统地介绍了 MySQL 常用 SQL 技巧:分页的 LIMIT 用法及大偏移优化(索引覆盖、延迟关联、书签方式),常见聚合函数(COUNT、AVG、SUM、MAX、MIN)及与 GROUP BY 的配合;表的内连接、外连接(左、右)以及一对多、多对多、自关联的实现方式;行转列的 CASE/IF 与聚合函数技巧;SQL 注入的原理与防御措施(严格参数校验、预编译绑定);关联更新的写法;以及 WHERE 与 HAVING 的作用时机、可用范围和性能差异。

索引

本文系统阐述了MySQL索引的概念、优势与弊端,分类包括普通、唯一、主键、组合、全文、空间等;介绍了创建方式(CREATE TABLE、ALTER TABLE、CREATE INDEX)及判断是否需要索引的原则;说明索引使用的限制(最左前缀、函数等导致失效)和通过EXPLAIN 检查生效;比较了B+树与Hash、聚簇与非聚簇的实现原理,并给出索引评估、重建及优化建议。

事务

事务是一个原子工作单元,必须满足ACID特性:原子性(undo log回滚)、一致性(约束不被破坏)、隔离性(锁与MVCC实现)和持久性(redo log预写日志)。事务类型包括扁平事务、带保存点的扁平事务、链事务、嵌套事务和分布式事务;MySQL InnoDB原生支持前四种,嵌套事务只能通过保存点模拟。InnoDB通过undo/redo日志、Buffer Pool、行锁、Next‑Key Lock及间隙锁实现四种SQL标准隔离级别,其中默认的REPEATABLE READ在实际中已能防止脏读、不可重复读和幻读。事务回滚使用ROLLBACK或ROLLBACK TO SAVEPOINT。

InnoDB通过共享锁(S)和排他锁(X)实现行级并发控制;意向锁(IS/IX)在表级表明细粒度需求。锁算法包括Record、Gap和Next‑Key锁,其中Next‑Key用于防止幻读。死锁产生于事务相互等待,常用超时回滚和wait‑for‑graph检测并回滚undo最小事务。InnoDB不进行锁升级,行锁通过索引项加锁,间隙锁锁定记录间范围防止插入导致幻读。

优化

MySQL 优化涵盖系统层面、表结构、索引和 SQL 本身。查询应尽量使用有效索引,避免前缀 % 的 LIKE、仅首列的复合索引或 OR 条件失效;用 JOIN 取代子查询提升效率。插入可通过禁用索引、唯一性检查、外键检查、关闭自动提交或批量 INSERT、LOAD DATA INFILE 加速。面对千万级数据,先优化 SQL 与索引,再加缓存、读写分离、分区表或水平/垂直拆分。慢查询需开启慢日志、设定阈值并用 EXPLAIN 分析 type、key、key_len、rows、Extra,重点消除 Using filesort、Using temporary 等。掌握 EXPLAIN 各列含义,可快速定位性能瓶颈。

其他(数据库)

本文简要介绍数据库设计的三大范式及其要求,阐述MySQL常用存储引擎InnoDB和MyISAM的特性,说明redo、undo、binlog的作用与实现机制,解析InnoDB的MVCC实现原理,并概述MySQL 主从复制的工作流程,即主库写入 binlog、从库拉取并转存为 relay log,再由 SQL 线程重放,实现数据同步。

Spring Boot

Spring Boot是基于 Spring 的脚手架框架,遵循“约定优于配置”,可快速构建独立运行的准生产级项目。通过 Starter 简化依赖管理,使用 @EnableAutoConfiguration 实现自动装配,核心注解如 @SpringBootApplication、@Conditional 系列控制 Bean 的实例化。启动时 SpringApplication.run 完成环境准备、容器创建、监听器通知等步骤,提供监控、云原生集成等优势。

Spring

Spring的核心是IoC和AOP,IoC通过DI(依赖注入)实现,依赖注入方式主要有构造器、setter和接口。Spring提供BeanFactory和ApplicationContext两类容器,前者为基础容器采用延迟初始化,后者在其上扩展事件、国际化等高级特性并默认预实例化。Bean的作用域包括singleton、prototype、request、session、globalSession,生命周期可通过@PostConstruct、@PreDestroy等注解定制。单例循环依赖通过三级缓存(singletonFactories、earlySingletonObjects、singletonObjects)实现解决。@Autowired按类型自动装配,@Resource默认按名称装配,两者在注入方式上略有区别。

Spring MVC

MVC 将系统分为模型、视图、控制器三层,降低耦合;DAO 层专职数据库访问。Spring MVC 通过 DispatcherServlet 接收请求,利用 HandlerMapping 定位 Handler,HandlerAdapter 调用处理器,返回 ModelAndView,交由 ViewResolver 解析并渲染,支持多种响应形式。常用注解包括 @RequestMapping、@RequestParam、@RequestBody、@PathVariable 等。拦截器实现 HandlerInterceptor,可在 preHandle、postHandle、afterCompletion 阶段拦截请求;对 Controller 用拦截器,对静态资源用 Filter,对 Bean 用 AOP。

MyBatis & 其他

本文系统阐述了 MyBatis 与 JPA 的核心差异——映射方式、可移植性、日志与 SQL 优化等;介绍了 MyBatis 支持的参数类型、实现一对多关联的两种 XML 配置(嵌套查询、嵌套结果),以及 # 与 $ 的安全性与使用场景;说明了 XML 与 Mapper 接口的 namespace 绑定、分页方式的效率比较以及一级、二级缓存机制。随后简要对比了 cookie 与 session 的存储位置、容量、隐私与适用场景,概述了 GET 与 POST 的特性、400 错误含义、请求乱码处理方法;并提供了 Spring Boot 中定时任务的实现思路、基于 AOP 的接口日志记录方案,以及 JPA 的定义与实现概览。

Redis(一)

Redis常用于分布式缓存、热点存储、计数、分布式锁和消息队列等。它是内存键值NoSQL,核心类型包括字符串、哈希、列表、集合和有序集合,并支持Bitmap等。单线程凭IO复用和内存操作实现高吞吐,持久化通过fork提供RDB、AOF及混合模式。高可用方案有Sentinel和Cluster,主从同步使用psync完成全量或增量复制。提供多种淘汰和过期策略,并通过防穿透等措施保障可靠。

Redis(二)

Redis Cluster通过分片实现负载均衡,适用于单机内存、并发和流量瓶颈,但批量操作、跨节点事务、多数据库及多层复制受限。Hash在键值对<512且字符<64时采用压缩列表(ziplist),否则使用字典(hashtable),后者通过渐进式 REHASH 动态扩容。Zset 依据元素数量<128且成员<64字节使用 ziplist,否则使用字典+跳跃表(skiplist)实现,兼顾空间与 O(logN) 查询。利用 Redis 的高性能键值存储,可在分布式环境中实现共享 Session(将会话标识存入 Redis)以及基于 SETNX/EXPIRE 的分布式锁,解决跨节点并发竞争问题。