加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

SQL

本文系统介绍MySQL常用SQL技巧:LIMIT分页及大偏移优化(索引覆盖、延迟关联、书签),常用聚合函数COUNT、AVG、SUM、MAX、MIN及GROUP BY用法;内连接、左/右外连接、等值连接及一对多、多对多、自关联实现;使用CASE/IF实现行转列(pivot);SQL注入原理及防御(参数校验、预编译);关联更新语句示例;WHERE与HAVING的区别及性能建议。

索引

MySQL索引是一种磁盘结构,用于快速定位行,主要实现为BTREE和HASH两种。常见索引包括普通、唯一、主键、组合、全文和空间索引,创建方式有在CREATE TABLE时定义、ALTER TABLE或CREATE INDEX。索引能提升查询、排序、分组和唯一性校验,但会占用磁盘、增加写入和维护成本,且不一定每次都被使用,需遵守最左前缀原则并通过EXPLAIN验证。MyISAM的BTREE叶节点存记录地址,InnoDB采用聚簇索引把数据存于叶子,辅助索引指向主键。HASH仅适合等值查询,BTREE支持范围和排序。索引并非越多越好,应根据列基数、更新频率等评估,并在必要时进行重建。

事务

事务是数据库的原子操作单元,必须满足ACID(原子性、一致性、隔离性、持久性)。常见类型包括扁平事务、带保存点的扁平事务、链事务、嵌套事务和分布式事务;MySQL InnoDB 原生支持前四种,嵌套事务可通过保存点模拟。InnoDB 通过 undo log、redo log、Buffer Pool、行锁、Next‑Key Lock 与 MVCC 实现 ACID;默认隔离级别 REPEATABLE READ 在使用间隙锁后已能防止脏读、不可重复读和幻读。事务回滚依赖 undo log 与 ROLLBACK(或 ROLLBACK TO SAVEPOINT)。

锁是数据库并发控制的核心特性,InnoDB 提供行级共享锁(S)和排他锁(X),以及表级意向锁(IS、IX)以支持多粒度加锁。行锁的实现依赖索引项,采用三种算法:Record Lock、Gap Lock 和 Next‑Key Lock,其中 Gap Lock 锁定记录间的范围,用于防止幻读。InnoDB 不存在锁升级,因为锁管理基于位图而非单条记录。死锁指事务相互等待锁资源,常见于 A‑等待‑B、B‑等待‑A 的循环。解决办法包括超时回滚和主动的 wait‑for‑graph 检测,后者通过锁链表和事务等待链表构建图形,发现回路后回滚 undo 最小的事务。全文系统阐述了锁的类型、粒度、算法、幻读防护以及死锁的产生与处理方法。

优化

MySQL优化涵盖系统层面、表结构、索引和SQL。查询应使用合适索引,避免前置%LIKE、合理使用多列索引、OR条件,并用JOIN取代低效子查询。批量插入可通过禁用索引、唯一性检查、外键检查、自动提交或使用LOAD DATA提升速度。面对千万级数据,依次优化SQL/索引、加入缓存、实现读写分离、使用分区或进行垂直、水平拆分。慢查询通过开启慢查询日志、EXPLAIN分析并解决索引失效、结构冗余、关联拆分、LIMIT分页等问题。使用EXPLAIN时重点关注type、key、key_len、rows、Extra,避免Using filesort、Using temporary等低效执行方式。

其他(数据库)

本文介绍了关系数据库设计的三大范式:1NF要求字段原子化,2NF消除非主属性对候选键的部分依赖,3NF进一步去除传递依赖以避免冗余。随后概述了 MySQL 常用存储引擎,重点比较了事务安全的 InnoDB(支持行锁、外键、ACID)与非事务的 MyISAM。接着解释了 redo log、undo log 与 binlog 的作用:redo log 保证事务持久性,undo log 支持回滚和 MVCC,binlog 记录所有数据修改用于主从复制。随后阐述了 InnoDB 实现的 MVCC 机制,包括隐藏列、基于 undo log 的版本链和 ReadView 快照。最后说明了 MySQL 主从同步的实现流程:master 将修改写入 binlog,slave 通过 I/O 线程拉取并写入 relay log,再由 SQL 线程重放,实现异步复制。

Spring Boot

Spring Boot 本质是对 Spring 的脚手架,遵循“约定优于配置”,可快速构建独立运行的准生产项目。通过 Starter 以 Maven POM 方式提供传递依赖,简化包导入;启动时由 Application 的 main 方法调用 SpringApplication.run,完成环境准备、容器创建、监听通知等步骤。自动装配依赖 @EnableAutoConfiguration、spring.factories 中的 AutoConfiguration 类,并在满足 @Conditional 系列条件时实例化 Bean。核心注解包括 @SpringBootApplication(组合 @EnableAutoConfiguration)、@Import、以及多种 @Conditional 派生注解,用于根据类、Bean、属性、平台等条件灵活控制配置。

Spring

Spring的核心是IoC与AOP,IoC通过DI(构造、setter、接口注入)实现对象解耦,AOP统一处理日志、事务等横切关注点。容器分为轻量的BeanFactory和功能更全的ApplicationContext,后者默认单例并支持事件、国际化等高级特性。Bean通过XML或注解(@Component、@Service、@Repository、@Controller、@Autowired、@Qualifier、@Scope、@PostConstruct、@PreDestroy)注册管理,作用域包括singleton、prototype、request、session、globalSession。Spring利用三级缓存解决单例setter循环依赖。@Autowired 按类型注入,@Resource 默认按名称注入。

Spring MVC

文章先解释MVC模式把系统划分为Model、View、Controller以降低耦合,随后说明DAO层负责统一的数据访问。接着详细描述Spring MVC的请求处理流程:DispatcherServlet接收请求 → HandlerMapping定位Handler → HandlerAdapter调用 → 返回ModelAndView → ViewResolver解析视图并渲染,最终生成HTML、JSON等响应。列举常用注解如@RequestMapping、@RequestParam、@RequestBody、@PathVariable及其属性。讲解拦截器实现原理和生命周期(preHandle、postHandle、afterCompletion)以及注册方式,并区分对Controller、静态资源和其他Bean的拦截分别使用拦截器、Filter和Spring AOP。

MyBatis & 其他

MyBatis 是半自动 ORM,需自行编写 SQL,灵活但与数据库耦合高;JPA(Hibernate)全自动映射,移植性好但 SQL 可控性弱。MyBatis 支持基本类型、Map、JavaBean 作为参数,使用 collection 实现一对多映射,可选嵌套查询或嵌套结果。# 采用预编译防注入,$ 直接拼接适用于动态列名等特殊场景。XML 通过 namespace 与 Mapper 接口绑定。分页可用插件亦可自行编写,后者更易优化。缓存分为 SqlSession 级别的一级缓存和 SqlSessionFactory 级别的二级缓存。Cookie 存客户端、容量小、易被篡改;Session 存服务器、容量大、适合敏感数据。GET 参数在 URL、可缓存、幂等;POST 参数在 body、不可缓存、非幂等。Spring Boot 可用 ThreadPoolTaskScheduler 实现定时任务,日志可通过 AOP 切面记录。JPA 为标准的 O/R 映射规范,常由 Hibernate 实现。

Redis(一)

Redis是一款基于内存的键值NoSQL,常用于分布式缓存、热点数据存储、计数、分布式锁和消息队列等。它提供字符串、哈希、列表、集合、有序集合等核心数据类型,并在5.0加入Streams。单线程架构通过避免锁竞争、内存操作和IO多路复用实现高吞吐,持久化采用RDB、AOF及RDB‑AOF混合方式。高可用方案有Sentinel自动故障转移和Cluster分片。主从复制使用PSYNC实现全量/增量同步。键可设TTL,Redis采用惰性和定期相结合的过期机制,并提供多种淘汰策略(noeviction、volatile‑lru、allkeys‑lfu 等)以应对内存超限。分布式锁通过SET NX EX + 唯一标识并结合Lua脚本保证原子性。

Redis(二)

Redis Cluster 通过分片实现负载均衡,优势在于突破单机内存、并发和流量瓶颈,劣势包括批量操作、事务、跨槽键及多库等受限。Hash 类型在键值对少且短时使用压缩列表(ziplist),否则采用哈希表(dict)并通过渐进式 rehash 动态扩容/收缩。Zset 根据元素数量和长度选择 ziplist 或字典+跳跃表(skiplist)实现,后者提供 O(logN) 查找效率。利用 Redis 可实现分布式 Session:在用户首次访问时生成令牌并存入 Redis,后续请求通过 Cookie 验证令牌,实现跨节点会话共享。分布式锁则通过 SETNX(或 SET NX EX)在 Redis 中创建唯一键并设定过期时间,确保在多服务器环境下安全获取和释放资源。