加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

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实现依赖注入,由BeanFactory或ApplicationContext容器管理Bean。BeanFactory提供延迟初始化,ApplicationContext在启动时完整初始化并支持事件、国际化等。Spring支持构造、setter、接口三种注入方式,常用注解包括@Component、@Service、@Repository、@Controller、@Autowired、@Qualifier、@Scope、@PostConstruct、@PreDestroy等,默认单例作用域也可设为prototype、request、session、globalSession。Bean生命周期由容器自动控制,可自定义初始化和销毁方法。单例循环依赖通过三级缓存(singletonFactories、earlySingletonObjects、singletonObjects)解决,构造器循环依赖和非单例循环依赖无法处理。@Autowired按类型注入,@Resource默认按名称注入并可按类型使用。

Spring MVC

MVC 将应用划分为模型、视图、控制器三层,降低耦合便于维护;DAO 层专职数据库访问,技术可选 Spring JDBC、Hibernate、MyBatis 等。Spring MVC 通过 DispatcherServlet 接收请求,利用 HandlerMapping 找到 Handler,再经 HandlerAdapter 调用,返回 ModelAndView,由 ViewResolver 解析视图并渲染,最终生成 HTML、JSON 等响应。常用注解包括 @RequestMapping(映射 URL 与方法)、@RequestParam(绑定请求参数)、@RequestBody(读取请求体)、@PathVariable(绑定 URL 占位符)。拦截器实现 HandlerInterceptor,提供 preHandle、postHandle、afterCompletion 三阶段,可在配置类的 addInterceptors 中注册。对 Controller 使用拦截器、对所有请求使用 Filter、对非 Controller Bean 使用 AOP,实现不同层面的请求拦截。

MyBatis & 其他

MyBatis 与 JPA 的区别在于映射方式、可移植性、日志与 SQL 优化等;MyBatis 支持基本类型、Map、JavaBean 作为参数;一对多关联可用嵌套查询或嵌套结果并通过 collection 实现;# 采用预编译防注入,$ 直接拼接适用于动态列;XML 与 Mapper 接口通过 namespace 绑定;分页插件方便但自行编写更高效;缓存分为一级(SqlSession)和二级(SqlSessionFactory)并可配置;补充说明 cookie 与 session 的存储位置、容量、安危及适用场景,GET/POST 区别及幂等性,SpringBoot 定时任务实现方式,日志可用 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 的分布式锁,解决跨节点并发竞争问题。