实现原理:
m_ids
)、最小事务ID(min_trx_id
)、最大事务ID(max_trx_id
)和当前事务ID(creator_trx_id
)。DB_TRX_ID
)和Read View,决定版本是否可见。解决的问题:
SELECT * FROM small_table s
JOIN large_table l ON s.id = l.small_id;
large_table.small_id
上建索引。场景 | 原因 | 示例 |
---|---|---|
函数操作 | 索引列被函数处理,无法匹配 | WHERE YEAR(create_time) = 2024 |
OR 条件 | 若OR条件涉及非索引列,索引失效 | WHERE id = 1 OR name = 'A' |
!= / NOT IN | 跳过索引,全表扫描 | WHERE status != 1 |
模糊匹配 | 左模糊(%abc )无法使用索引 |
WHERE name LIKE '%abc' |
类型转换 | 隐式转换导致索引失效 | WHERE id = '123' (id为int) |
ORDER BY a, b
→ 索引 (a, b)
。CREATE INDEX idx_name_age ON users(name, age);
SELECT name, age FROM users ORDER BY name, age; -- 使用索引
字段 | 含义 | 优化建议 |
---|---|---|
type | 访问类型(ALL < index < range < ref < eq_ref < const) | 优先使用 ref /eq_ref |
key | 实际使用的索引 | 检查是否命中预期索引 |
rows | 预计扫描行数 | 越小越好 |
Extra | 额外信息 | Using filesort (需优化排序)、Using temporary (需优化分组) |
定义:虚拟表,基于SQL查询结果。
优点:
作用:在特定事件(INSERT/UPDATE/DELETE)发生时自动执行。
语法示例:
CREATE TRIGGER before_insert_user
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
SET NEW.create_time = NOW();
END;
使用场景:
存储过程:
SELECT my_function()
)。CALL proc()
| SELECT func()
|实现步骤:
server-id
和 log-bin
。server-id
并连接主库。START SLAVE;
。semi-sync
)减少延迟。SHOW SLAVE STATUS\G
中的 Seconds_Behind_Master
。备份方式:
xtrabackup
):直接复制数据文件,速度快。mysqldump
):导出SQL语句,灵活但慢。mysql -u root < backup.sql
)。死锁条件:
innodb_lock_wait_timeout
)。SHOW ENGINE INNODB STATUS\G
。KILL ;
。实现方式:
CREATE TABLE sales (
id INT,
sale_date DATE
)
PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025)
);
ANALYZE TABLE
更新表统计信息,帮助优化器选择最优执行计划。EXPLAIN
分析,添加缺失的索引。SELECT u.name, o.order_id
FROM users u
JOIN orders o ON u.id = o.user_id;
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders);
建议:优先使用JOIN,尤其在大数据量场景。
作用:
定义:事务中两次查询结果集数量不一致(新增/删除记录)。
解决方案:
SELECT ... FOR UPDATE
锁定范围。在 RabbitMQ 中,消息可靠性保证涉及 生产端、MQ 服务端 和 消费端 的协同配合,核心机制包括:
消息持久化:
deliveryMode=2
(持久化),确保消息写入磁盘而非仅内存。durable=true
),防止队列在 RabbitMQ 重启时丢失。// 声明持久化队列
channel.queueDeclare("my_queue", true, false, false, null);
// 发送持久化消息
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().deliveryMode(2).build();
channel.basicPublish("", "my_queue", props, "Hello, RabbitMQ!".getBytes());
生产者确认(Confirm)机制:
publisher_confirm
,确保消息成功写入队列后才返回 ACK。channel.confirmSelect(); // 启用确认模式
if (!channel.waitForConfirms()) {
// 重试发送消息
}
持久化存储:
高可用架构:
手动确认(ACK)机制:
basic.ack
,确保消息不会被 RabbitMQ 过早删除。DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
try {
processMessage(message); // 处理消息
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); // 手动确认
} catch (Exception e) {
// 记录日志或重试,不确认消息
}
};
channel.basicConsume("my_queue", false, deliverCallback, consumerTag -> {});
幂等性设计:
-- 数据库插入时通过唯一键避免重复
INSERT INTO orders (id, user_id, product) VALUES (?, ?, ?) ON CONFLICT (id) DO NOTHING;
Virtual Host 是 RabbitMQ 中的逻辑隔离单元,用于将不同的应用或用户资源(队列、交换机、绑定关系)隔离开,避免命名冲突和权限泄露。
# 创建 vhost
rabbitmqctl add_vhost /production
# 创建用户并绑定权限
rabbitmqctl add_user dev_user password
rabbitmqctl set_permissions -p /production dev_user ".*" ".*" ".*"
basic.ack
确认消息处理完成。// 关闭自动确认
channel.basicConsume("my_queue", false, deliverCallback, consumerTag -> {});
消费者组是指多个消费者共享同一个队列,通过负载均衡分担消息处理任务。RabbitMQ 通过 轮询调度 将消息分发给组内消费者。
负载均衡:
// 定义两个消费者监听同一队列
@Component
@RabbitListener(queues = "shared_queue")
public class ConsumerA {
@RabbitHandler
public void receive(String message) {
System.out.println("ConsumerA: " + message);
}
}
@Component
@RabbitListener(queues = "shared_queue")
public class ConsumerB {
@RabbitHandler
public void receive(String message) {
System.out.println("ConsumerB: " + message);
}
}
高可用性:
扩展性:
basic.ack
,否则消息可能被重复投递。模块 | 关键点 |
---|---|
消息可靠性 | 持久化(队列/消息)、生产者确认、消费者手动确认、集群镜像、幂等性设计。 |
Virtual Host | 资源隔离、权限管理、环境隔离、租户管理。 |
消息确认模式 | 自动确认(低延迟) vs 手动确认(高可靠性),需结合业务场景选择。 |
消费者组 | 负载均衡、高可用、动态扩展,需配合手动确认和幂等性保障可靠性。 |
SIGHUP
Maven 的三种生命周期(Clean、Default、Site)分别负责项目构建的不同阶段,以下是它们的详细作用和场景:
作用:清理项目,删除之前的构建产物,确保构建环境的整洁。
pre-clean
:在清理前执行,通常用于执行自定义的清理前操作(如备份配置文件)。clean
:删除目标目录(如 target
)中的构建输出文件,确保后续构建从干净的状态开始。post-clean
:在清理后执行,通常用于执行清理后的操作(如恢复备份文件)。典型使用场景:
示例命令:
mvn clean # 执行 clean 生命周期的 clean 阶段
mvn clean package # 先清理,再执行 package 阶段
作用:构建项目,从源代码编译到打包、测试、安装和部署。
validate
:验证项目配置(如 pom.xml
是否正确)。compile
:编译主源代码(src/main/java
)。test
:运行单元测试(src/test/java
)。package
:将编译后的代码打包(如 JAR、WAR)。verify
:验证打包结果是否符合质量标准。install
:将包安装到本地 Maven 仓库(~/.m2/repository
),供其他项目使用。deploy
:将包部署到远程仓库(如 Nexus),供团队共享。典型使用场景:
mvn compile
或 mvn test
用于局部构建和测试。mvn package
或 mvn install
用于生成可分发的包。mvn deploy
将最终包推送到远程仓库。示例命令:
mvn compile # 编译主代码
mvn test # 编译并运行测试
mvn package # 编译、测试并打包
mvn install # 安装到本地仓库
mvn deploy # 部署到远程仓库
作用:生成项目文档和站点信息,用于项目报告和团队协作。
pre-site
:生成文档前的准备操作。site
:生成项目站点文档(如 API 文档、测试报告、项目统计信息)。post-site
:生成文档后的处理(如自定义脚本)。site-deploy
:将文档部署到远程服务器(如 GitHub Pages、Nexus)。典型使用场景:
mvn site
生成 HTML 格式的 API 文档、测试覆盖率报告等。mvn site-deploy
将文档发布到团队内部服务器或公共网站。示例命令:
mvn site # 生成项目文档
mvn site-deploy # 将文档部署到远程服务器
生命周期 | 核心目的 | 典型命令 | 适用场景 |
---|---|---|---|
Clean | 清理构建产物 | mvn clean |
重新构建前、切换环境 |
Default | 构建、测试、打包、部署 | mvn compile , mvn deploy |
日常开发、版本发布 |
Site | 生成和部署项目文档 | mvn site , mvn site-deploy |
项目文档维护、团队协作 |
mvn clean
只执行 Clean 生命周期,不会影响 Default 或 Site。maven-compiler-plugin
绑定到 compile
阶段),用户可通过自定义插件扩展功能。mvn clean package
会依次执行 Clean 生命周期的 clean
阶段和 Default 生命周期的 package
阶段。JVM(Java Virtual Machine)的核心组件包括以下部分:
类加载子系统(Class Loader System)
.class
文件加载到 JVM 中,并验证、解析和初始化类。static
变量)分配内存并设置默认值。
方法(静态代码块和静态变量赋值)。运行时数据区(Runtime Data Areas)
执行引擎(Execution Engine)
本地方法接口(Native Interface)
逃逸分析是 JVM 在 即时编译(JIT)阶段 的一种高级优化技术,用于判断对象的作用域范围,是否“逃逸”出当前方法或线程。
Point x, y
拆分为 int x, int y
)。synchronized
)。-server
)。public void process() {
Point p = new Point(1, 2); // 不逃逸对象
System.out.println(p.x + p.y);
}
JVM 可能将 p
栈上分配,无需堆内存分配。
-XX:MaxPermSize
)。OutOfMemoryError: PermGen space
。-XX:MaxMetaspaceSize
限制。jcmd VM.native_memory
或 jstat -gcmetacapacity
监控元空间占用。JIT(Just-In-Time Compiler) 是 JVM 的即时编译器,将热点字节码编译为本地机器码,提升执行效率。
InvokeCounter
)识别频繁执行的代码。public int sum(int a, int b) {
return a + b; // 热点方法可能被内联
}
JIT 会将 sum
方法内联到调用处,减少方法调用开销。
jstat:统计 JVM 内存和 GC 情况。
jstat -gc <PID> 1000 5 # 每秒打印 GC 统计信息 5 次
jstat -gcutil <PID> 1000 5 # 查看 GC 利用率
jcmd:查看 JVM 状态和触发诊断操作。
jcmd <PID> VM.native_memory summary # 查看堆外内存使用
jcmd <PID> GC.class_histogram # 查看堆内存对象分布
jconsole/VisualVM:图形化监控内存、线程、GC 等。
Arthas(阿里开源):
thread
)。monitor
)。thread -b
)。NMT(Native Memory Tracking):
-XX:NativeMemoryTracking=summary # 基础模式
-XX:NativeMemoryTracking=detail # 详细模式
jcmd <PID> VM.native_memory summary scale=MB
GC 日志分析:
-Xlog:gc*:file=gc.log:time:filecount=5,filesize=10M
MaxGCPauseMillis
(如 200ms)。BLOCKED
或 WAITING
线程占比。synchronized 关键字:
synchronized(this)
)。synchronized(ClassName.class)
)。Lock 接口(ReentrantLock):
lock()
和 unlock()
。ReentrantLock(true)
)。Condition
实现线程间通信(替代 wait/notify
)。volatile 关键字:
Atomic 类(CAS 原理):
Compare And Swap
)。AtomicInteger
、AtomicReference
。BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);
// 生产者
new Thread(() -> {
while (true) {
queue.put("data"); // 阻塞直到队列未满
}
}).start();
// 消费者
new Thread(() -> {
while (true) {
String data = queue.take(); // 阻塞直到队列非空
}
}).start();
jstack:生成线程转储(Thread Dump),分析死锁。
jstack <PID> > thread_dump.txt
Found one Java-level deadlock:
"Thread-1":
waiting to lock monitor 0x00007f8c0000,
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007f8c0001,
which is held by "Thread-1"
Arthas:
thread -b # 查找死锁
jcmd:
jcmd <PID> Thread.print # 查看线程状态
tryLock(timeout)
)。标记-清除(Mark-Sweep)
标记-整理(Mark-Compact)
复制(Copying)
分代收集(Generational Collection)
Serial GC(单线程,适用于单核机器)
Parallel Scavenge GC(多线程,吞吐优先)
CMS GC(并发标记清除,低延迟)
CMSInitiatingOccupancyFraction
。G1 GC(Garbage-First,适用于大堆内存)
-XX:+UseG1GC # 启用 G1
-XX:MaxGCPauseMillis=200 # 控制最大停顿时间
-XX:G1HeapRegionSize=4M # 区域大小
ZGC/Shenandoah(低延迟,毫秒级停顿)
Executor 框架是 Java 并发编程的核心工具,通过解耦任务的提交与执行,提供高效、灵活的多线程解决方案。其核心接口和实现包括:
Executor
execute(Runnable command)
方法,用于执行提交的任务。ExecutorService
Executor
,提供更丰富的功能:
submit(Runnable/Callable)
)。shutdown()
、shutdownNow()
)。isShutdown()
、awaitTermination()
)。ScheduledExecutorService
schedule()
、scheduleAtFixedRate()
)。线程池实现:
ThreadPoolExecutor
:核心线程池,支持自定义参数(核心线程数、最大线程数、任务队列等)。ScheduledThreadPoolExecutor
:支持定时任务的线程池。优势:
shutdown()
或 shutdownNow()
安全终止线程池。示例:
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> System.out.println("Task executed"));
executor.shutdown();
JUC(java.util.concurrent
)是 Java 并发编程的核心包,提供以下组件:
CountDownLatch
:等待多个线程完成。CyclicBarrier
:让线程互相等待到达屏障点。Semaphore
:控制资源访问数量。Atomic
系列):基于 CAS 实现无锁操作(如 AtomicInteger
)。ConcurrentHashMap
:线程安全的哈希表。CopyOnWriteArrayList
:写时复制的列表。ArrayBlockingQueue
:有界队列。LinkedBlockingQueue
:无界或有界队列。SynchronousQueue
:无缓冲队列。核心目标:
Callable
call()
方法(有返回值)。Runnable
的区别:支持返回值和抛出异常。Future
get()
:获取任务结果(阻塞直到完成)。cancel()
:取消任务。isDone()
:判断任务是否完成。使用示例:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(() -> {
return 42;
});
System.out.println(future.get()); // 输出 42
executor.shutdown();
作用:让一个或多个线程等待其他线程完成操作。
典型场景:主线程等待多个子线程完成初始化。
示例:
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
new Thread(() -> {
// 模拟子线程工作
latch.countDown();
}).start();
}
latch.await(); // 主线程等待
System.out.println("All threads completed");
作用:让一组线程互相等待,直到所有线程到达屏障点。
典型场景:多线程协同计算(如赛跑选手同时起跑)。
示例:
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All arrived!"));
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
barrier.await(); // 等待其他线程
} catch (Exception e) {}
}).start();
}
核心原理:基于 CAS(Compare and Swap) 实现无锁操作。
常用类:
AtomicInteger
:原子整数操作。AtomicReference
:原子引用操作。AtomicLong
:原子长整型操作。应用场景:
AtomicBoolean
)。示例:
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet(); // 原子递增
ArrayBlockingQueue
:有界队列,基于数组。LinkedBlockingQueue
:无界或有界队列,基于链表。PriorityBlockingQueue
:支持优先级排序的无界队列。SynchronousQueue
:无缓冲队列(直接传递)。DelayQueue
:元素需延迟到期后才能取出。核心作用:为同步组件(如 ReentrantLock
、Semaphore
)提供基础实现。
关键特性:
state
变量控制资源状态(如锁的持有)。ReentrantLock
):仅允许一个线程持有锁。CountDownLatch
):允许多个线程同时访问。实现原理:
特性 | ConcurrentHashMap | Hashtable |
---|---|---|
线程安全机制 | 分段锁(JDK 8 前)或 CAS+synchronized(JDK 8+) | 全局锁(synchronized 方法) |
性能 | 高(并发读写效率高) | 低(所有操作都加锁) |
迭代器 | 弱一致性(不会抛异常) | 强一致性(可能抛 ConcurrentModificationException ) |
是否支持 null | 不支持 | 支持 |
扩容机制 | 动态扩容(并发进行) | 需要手动扩容 |
适用场景:
ConcurrentHashMap
:高并发读写场景(如缓存)。Hashtable
:遗留代码或低并发场景。