加载中

面经

文章分类

浏览该分类下的所有文章

48 篇文章 4

SQL

本文概述MySQL常用SQL技巧:LIMIT分页及优化;COUNT、AVG、SUM、MAX、MIN等聚合函数与GROUP BY;表连接方式,区分内连接、左/右外连接及等值连接,说明一对多、多对多、自关联;外连接概念;行转列示例(CASE/IF);SQL注入防御(参数校验、预编译);WHERE 与 HAVING 的作用时机及性能差异。

索引

MySQL 索引是存放在磁盘上的独立结构,通过指针快速定位符合条件的行,主要有 BTREE 与 HASH 两种实现,MyISAM 只支持 BTREE,MEMORY 可用两者。索引分为普通、唯一、主键、单列、组合、全文、空间等类型,创建方式包括在 CREATE TABLE、ALTER TABLE 或 CREATE INDEX 语句。是否建索引应依据唯一性、查询、排序、分组等需求,并遵循最左前缀原则;并非所有列都适合建索引,频繁更新、低基数或不在 WHERE 中使用的列不宜建。索引能加速查询、保证唯一性、优化连接与排序,但会占用磁盘、增加维护成本。InnoDB 使用聚簇索引(主键即数据)和辅助索引(存主键指针),MyISAM 仅保存记录地址。B+树因高度低、支持范围查询而为主流,Hash 仅适合等值查询且易失效。索引失效常因函数、类型转换、LIKE 前缀或不满足最左前缀导致,可通过 EXPLAIN 检查并在必要时重建。

事务

事务是原子性、一致性、隔离性、持久性的组合,可分为扁平、带保存点、链、嵌套和分布式等类型。InnoDB 通过 undo/redo 日志、Buffer Pool、行锁、MVCC 与 Next‑Key Lock 实现 ACID,默认使用 REPEATABLE READ(等同于 SERIALIZABLE)解决脏读、不可重复读和幻读。MySQL 不原生支持嵌套事务,可用保存点模拟回滚。

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提升速度,InnoDB 还可关闭外键检查和自动提交。面对千万级大表,建议依次优化SQL/索引、增加缓存、实现读写分离、使用分区表、进行垂直或水平拆分。慢查询优化步骤为打开慢查询日志、分析日志并使用EXPLAIN 调整索引、结构或分页等。使用EXPLAIN 时重点关注type、key、key_len、rows、Extra,避免出现ALL、Using filesort、Using temporary 等低效情况。

其他(数据库)

介绍了关系数据库的三大范式:1NF要求字段原子化,2NF消除非键属性对主键的部分依赖,3NF进一步消除传递依赖,满足3NF即可避免冗余。随后说明MySQL常用存储引擎InnoDB(事务、行锁、外键)和MyISAM(高插入/查询速度、无事务),以及其他引擎的基本特性。接着阐述redo log、undo log、binlog的作用:redo保障事务持久性,undo支持回滚和MVCC,binlog记录所有修改用于复制。进一步解释InnoDB的MVCC实现原理,包括隐藏列、undo版本链和ReadView。最后说明MySQL主从复制流程:主库写入binlog→从库读取并写入relay log→SQL线程重放,实现异步数据同步。

Spring Boot

Spring Boot 本质是基于 Spring 的脚手架,遵循“约定优于配置”,帮助快速构建、独立运行的准生产项目。通过 Starter(起步依赖)简化依赖管理,只需声明功能即可引入所需库。启动时,Application 类的 main 方法调用 SpringApplication.run,依次完成环境准备、容器创建、刷新、监听通知等步骤。@SpringBootApplication 组合了 @EnableAutoConfiguration,实现自动装配;核心通过 @Import、@Conditional 系列注解在满足类路径、Bean、属性等条件时实例化相应 Bean。Spring Boot 因此具备快速构建、零配置集成、独立部署、运行时监控和云原生等优势。

Spring

Spring核心是IoC和AOP,IoC通过DI由容器实现,容器分BeanFactory(延迟、轻量)和ApplicationContext(完整、预实例化)。Bean是POJO,由容器管理,可用@Component、@Service等注解声明,@Autowired/@Resource实现注入,@Scope定义单例、prototype、request、session等作用域,@PostConstruct/@PreDestroy控制生命周期。循环依赖通过单例的三级缓存(singletonFactories、earlySingletonObjects、singletonObjects)解决。@Autowired按类型注入,@Resource默认按名称注入。

Spring MVC

Spring MVC 基于 MVC 模式,将系统划分为 Model(数据)、View(界面)和 Controller(业务逻辑)三层,降低耦合便于维护。DAO 层负责统一的数据访问,可使用 Spring JDBC、Hibernate、MyBatis 等实现。请求经由 DispatcherServlet、HandlerMapping、HandlerAdapter 处理,返回 ModelAndView,由 ViewResolver 解析视图并渲染,支持 HTML、JSON、PDF 等多种媒体。常用注解包括 @RequestMapping、@RequestParam、@RequestBody、@PathVariable 等,用于映射路径、绑定参数和处理请求体。拦截器实现 HandlerInterceptor,提供 preHandle、postHandle、afterCompletion 三阶段,可在 WebMvcConfigurer 中注册;对 Controller 用拦截器,对所有请求用 Filter,针对 Bean 用 Spring AOP 进行拦截。

MyBatis & 其他

本文系统阐述了 MyBatis 与 JPA 的核心差异:映射方式、可移植性、日志与 SQL 优化等;说明 MyBatis 支持的参数类型、实现一对多关联的两种 XML 配置(嵌套查询、嵌套结果),并比较 # (预编译防注入)与 $ (直接拼接、用于动态列)用法及适用场景。进一步介绍了 XML 与 Mapper 接口的 namespace 绑定、分页实现方式及其性能、以及一级、二级缓存机制。随后简要对比了 cookie 与 session 的存储位置、容量、安全性和适用场景,解释了 session 工作原理。最后覆盖了 GET/POST 区别、400 错误含义、请求乱码处理、Spring Boot 定时任务实现、日志 AOP 设计以及 Spring Boot JPA 的概念与实现。

Redis(一)

Redis常用于缓存、热点数据库、计数、分布式锁和消息队列等。它是内存键值NoSQL,单线程+IO复用实现高吞吐,支持字符串、哈希、列表、集合、有序集合等核心类型及Bitmap、HyperLogLog、Geo、Streams。持久化提供RDB、AOF、混合三种方案;高可用通过Sentinel或Cluster实现,复制采用psync全量/部分同步。缓存淘汰策略包括noeviction、volatile‑lru、allkeys‑lfu等,过期采用惰性+定期扫描。并介绍setnx实现分布式锁、watch乐观锁、List常用命令及防止缓存穿透、击穿、雪崩的设计要点。

Redis(二)

Redis Cluster 能在单机内存、并发或流量瓶颈时实现负载均衡,但批量操作、事务、跨库和多层复制受限,只能在同一 slot 或同一节点上使用。Hash 类型在键值对少且键值长度 <64 字节且数量 <512 时采用 ziplist 编码,否则使用 dict,并通过渐进式 REHASH 动态扩容/收缩保证性能。Zset 同样根据元素数量 ≤128 且成员长度 <64 字节使用 ziplist,否则使用 skiplist,内部由 dict(成员→分值映射)和跳跃表(按分值有序)组成,提供 O(logN) 查找。利用 Redis 可实现分布式 Session:在用户首次访问时生成唯一 token,存入 Redis 并通过 cookie 返回,后续请求在 Redis 中验证 token 即可共享会话。分布式锁则通过 SET NX EX(或 SET EX NX)加锁,设定超时时间防止死锁,并在解锁时使用 Lua 脚本保证原子性。