自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 收藏
  • 关注

原创 分页为什么越翻越慢:offset 陷阱、seek 分页与索引排序优化

目标:你能把“分页慢”讲成一个可解释的 IO 模型,并掌握可落地的改造:seek 分页、覆盖索引、延迟关联。

2026-04-04 14:41:31 154

原创 事务隔离级别与一致性:从现象到实现(MVCC 与当前读)

对照点:RC 允许“同一事务内两次快照读看到不同提交结果”,因为每次读可能生成新的 Read View。这会在 RR 下对范围加 next-key 锁,阻止 T2 插入落在范围内的新行。对照点:RR 的快照读更像“拍了一张照片”,后面继续看这张照片,直到事务结束。直觉:你要修改数据,就必须看“现在的真实值”,并锁住它防止并发写。面试关键不是背表格,而是能举例。

2026-04-03 12:52:52 300

原创 MySQL 锁等待与死锁进阶:怎么看等待、怎么降冲突(工程化套路)

降冲突的核心是三点:缩短事务时间(把 RPC/计算移出事务)、缩小锁范围(用合适索引让 where 精确命中、减少扫描行数)、以及统一加锁顺序避免交叉等待。对于不可避免的死锁可做幂等重试和退避,但根因还是要从事务边界、索引和批量操作策略上治理。线上遇到 SQL 慢我会先区分是执行慢还是等锁慢:如果 CPU 不高但连接堆积、RT 飙升,很可能是锁等待。InnoDB 会检测到环,并选择回滚“代价较小”的事务(通常是修改行少的)。事务 1:先更新 A 再更新 B。事务 2:先更新 B 再更新 A。

2026-04-03 12:51:54 304

原创 回表为什么慢:二级索引到聚簇索引、覆盖索引与“延迟关联”

与。

2026-04-03 12:51:07 313

原创 联合索引设计:最左前缀、选择性、覆盖索引与落地方法

目标:你能把“联合索引怎么建”讲成一套可执行的方法,而不是背一句“where 用得多的放前面”。

2026-04-03 12:50:31 367

原创 MySQL `EXPLAIN`:看懂执行计划、判断索引是否生效与排错套路

目标:你不仅能背出。

2026-04-03 12:48:58 407

原创 B+ 树范围查询为什么快:页分裂/合并、索引设计与 SQL 写法优化

目标:你能把“B+ 树适合范围查询”落到数据库实现细节:叶子链表、页(page)组织、页分裂/合并,以及这些细节如何影响索引设计和 SQL 写法。

2026-04-01 14:33:34 324

原创 数据库索引为什么选 B+ 树:InnoDB 聚簇索引、回表与覆盖索引

目标:你能把“B+ 树适合索引”讲到 InnoDB 的具体实现:页、聚簇索引、二级索引、回表、覆盖索引,以及这些机制如何影响 SQL 写法与性能。

2026-04-01 14:33:02 486

原创 B 树与 B+ 树从零理解:阶、节点结构与查找/插入/删除

目标:你能从“为什么要多路平衡树”讲起,把 B 树/B+ 树的、以及插入删除的讲清楚。

2026-04-01 14:32:32 388

原创 JVM GC 调优:内存指标、泄漏排查与线上自救

目标:你能把 GC 调优说清楚为“以指标为导向的系统工程”,并掌握线上常见故障(频繁 Full GC、OOM、吞吐下降)的排查套路。

2026-04-01 13:52:20 396

原创 MyBatis 性能优化:批处理、分页、缓存与慢 SQL 定位

MyBatis性能优化需分层处理:优先检查SQL/索引设计,其次是连接池/DB负载问题,最后才是MyBatis使用方式。常见问题包括N+1查询(通过join/IN批量解决)、错误分页(确保SQL带limit)和批处理不当(控制批次大小)。缓存方面,一级缓存作用有限,二级缓存需谨慎使用。定位慢SQL要结合应用日志、DB执行计划和链路追踪。优化核心在于减少网络往返、控制内存使用和确保SQL高效执行。

2026-03-31 19:14:43 495

原创 Spring Boot 启动链路:自动装配、条件注解与排错方法论

摘要: Spring Boot自动装配通过@Configuration模块和条件注解(如@ConditionalOnClass)实现,启动流程分为环境准备、容器创建、Bean定义加载和容器刷新四个阶段。排查问题时: 配置不生效:检查Environment中的配置键、@ConfigurationProperties绑定状态及条件匹配; Bean冲突:通过排除自动配置或调整Bean定义解决同名问题; 注入缺失:验证依赖路径、配置开关及包扫描范围。 关键技巧包括查看条件评估报告、日志匹配结果及最小化复现。核心逻辑

2026-03-31 19:13:52 697

原创 Java 内存模型(JMM):happens-before、可见性与有序性怎么落到实战

目标:你能解释清楚为什么会出现“明明赋值了但另一个线程看不到”、为什么会出现“指令重排导致半初始化对象”、以及分别在解决什么问题。

2026-03-31 19:13:21 345

原创 Java 线程池:参数语义、拒绝策略与线上稳定性排查

TimeUnitworkQueuehandler(拒绝策略)打点(线程池名、队列长度、活动线程、拒绝次数)快速失败并返回可理解的错误码必要时触发降级。

2026-03-31 19:12:37 314

原创 缓存一致性:Cache Aside、双删/延迟双删、穿透/击穿/雪崩与 CDC

读:cache hit -> 返回;miss -> 查 DB -> 回填 cache写:先写 DB -> 再删 cache为什么写时不“更新缓存”?更新缓存需要你构造完整的新值,容易遗漏字段并发下更新顺序更难保证直接删让后续读走 DB 回填,逻辑更简单一旦污染,就可能永久错误重要 key 必须有 TTLTTL 分散(加随机抖动)避免同时过期。

2026-03-31 11:18:40 188

原创 Redis 分布式锁:SET NX、过期时间、续租、可重入、Redlock 与坑

Redis 分布式锁的正确核心是 SET NX PX 原子加锁、value 用 token 标识 owner,并用 Lua 脚本校验 token 后再删保证原子释放,同时用过期时间做崩溃兜底。难点在于业务耗时不确定,TTL 太短会导致锁过期并发进入,因此需要合理 TTL 或续租,同时临界区必须做幂等。Redlock 通过多数派提升容错,但仍有网络分区与暂停等边界,强一致场景更应优先选择 ZK/etcd 或数据库方案。Q:Redis 锁为什么要 token?Q:Redis 锁能保证强一致吗?

2026-03-30 11:08:45 331

原创 Redis 持久化与高可用:RDB/AOF、主从复制、哨兵与一致性取舍

Redis 的面试不止问“快”,更问“丢不丢、挂不挂、怎么恢复”。

2026-03-30 11:07:52 494

原创 Spring 事务:传播行为、失效场景、回滚规则与最佳实践

Spring 事务本质是 AOP 代理在方法边界自动管理 JDBC 事务,最常见失效是自调用绕过代理。传播行为里 REQUIRED 默认加入或新建事务,REQUIRES_NEW 会挂起外层并开启独立事务,NESTED 基于保存点做部分回滚。线上问题优先检查代理调用路径、异常是否被吞、传播行为与多数据源绑定,再结合锁等待/慢 SQL 判断是否长事务导致抖动。:把需要事务的方法挪到另一个 Service,让调用经过代理(最推荐):通过注入自身的代理对象来调用(需要小心循环依赖与可读性)现象 1:数据没回滚。

2026-03-30 11:07:08 332

原创 MySQL 锁与死锁:行锁、间隙锁、Next-Key Lock 与排查手册

InnoDB 为保证事务语义会在索引上加锁,常见有记录锁、间隙锁和 Next-Key Lock。RR 下范围当前读/修改为了防止范围内插入破坏语义,可能加 Next-Key 锁导致锁范围变大。死锁通常来自锁顺序不一致或索引缺失导致锁集合扩大,线上先用 processlist/innodb status/performance_schema 找到阻塞链和死锁双方,再通过固定更新顺序、缩短事务、补索引来根治。Q:Next-Key Lock 是什么?Q:InnoDB 的锁锁在哪里?Q:死锁怎么降低概率?

2026-03-30 11:06:36 460

原创 SQL 事务主线:ACID、隔离级别、MVCC 与一致性读

事务的核心是并发下的正确性,隔离级别描述的是并发读写会看到什么现象。InnoDB 的普通查询主要用 MVCC 做一致性读,通过版本链和 Read View 在 RC/RR 下提供快照语义;但只要涉及修改或当前读,就必须依赖行锁、间隙锁等机制保证语义。线上读不一致优先检查隔离级别与快照/当前读混用;线上卡顿优先看锁等待与死锁信息。Q:RR 为什么普通 SELECT 能可重复?Q:幻读和不可重复读怎么区分?Q:什么时候一定会加锁?

2026-03-30 11:04:53 348

原创 AQS 共享模式(Shared):`tryAcquireShared` 的返回值语义、传播唤醒(propagate)与 `Semaphore/CountDownLatch`

独占模式(Exclusive)更像“厕所只有一个坑位”;共享模式(Shared)更像“会议室有 N 个座位/门禁要等人到齐”。这篇只讲共享模式最核心、也最容易被问懵的 3 件事:statestate。

2026-03-29 23:31:31 304

原创 AQS:公平/非公平、自旋与阻塞(park)的取舍、适用场景与常见坑

这篇把这些问题讲透。parking。

2026-03-29 23:22:33 404

原创 AQS 的 CLH 同步队列:入队/出队、park/unpark 与“公平性”从哪来

AQS 使用的是。

2026-03-29 23:21:51 341

原创 AQS 的 `state`:volatile + CAS 如何撑起原子性与可见性

AQS的核心机制围绕volatile int state展开,通过CAS原子操作控制同步状态。volatile保证状态可见性,CAS确保状态更新的原子性。获取资源时先尝试快速CAS修改state,失败则进入队列阻塞(避免无休止自旋)。不同同步器(如ReentrantLock、Semaphore)可自定义state含义。关键点包括:volatile解决可见性但非原子性;CAS失败触发排队而非持续自旋;AQS提供通用模板而由子类定义具体语义。典型实现需重写tryAcquire/tryRelease方法,结合CA

2026-03-29 23:21:05 381

原创 AQS 总览:为什么 JUC 的锁都离不开它

AQS是JUC中的同步器框架,通过volatile state管理同步状态,CLH队列实现线程排队,LockSupport完成阻塞/唤醒。上层同步器只需实现tryAcquire/tryRelease等规则方法,AQS自动处理排队、取消等复杂逻辑。支持公平/非公平两种模式:公平锁按队列顺序获取,非公平锁允许插队竞争。当线程获取失败时进入队列,被唤醒后仍需重新竞争state。这种设计将同步状态管理与线程调度解耦,为ReentrantLock等并发工具提供了可靠基础实现。

2026-03-29 23:17:16 762

原创 大型系统构建与性能优化:缓存、负载均衡、分库分表与会话方案

性能优化先找瓶颈:IO > CPU架构扩展靠分层与集群缓存提速但引入一致性问题会话管理:Token + Redis 更适合集群。

2026-03-28 23:41:13 190

原创 高维问题如何“降维计算”:矩阵映射、卷积与拆分汇总

降维计算核心是:拆分 -> 局部计算 -> 汇总矩阵负责组织多变量映射卷积是局部计算的经典代表。

2026-03-28 23:40:30 193

原创 多因素最优解到梯度下降:AI 训练的数学主线

单因素:函数像一条曲线(你在“线”上找最低点)多因素:函数像曲面/超曲面(你在“面/空间”里找最低点)变量越多,空间维度越高,最优解仍然是“让目标函数最小/最大”的点。训练 = 多因素最优解梯度 = 最陡方向梯度下降 = 沿着让损失最快下降的方向更新参数GPU = 把大规模矩阵计算并行化。

2026-03-28 23:39:59 239

原创 JMM、volatile 与 CAS:可见性/有序性/原子性、ABA 与性能取舍

摘要:Java并发编程的核心在于正确理解JMM内存模型、volatile和CAS机制。JMM通过happens-before规则解决CPU优化与程序可见性的矛盾;volatile保证可见性和有序性,但不保证原子性,适用于状态标记;CAS实现无锁原子操作,但存在ABA问题和自旋开销。工程实践中,volatile解决可见性问题,CAS/锁解决原子性问题,高并发计数推荐使用LongAdder。排查并发问题时需检查happens-before关系,典型模式组合使用volatile和CAS可有效提升并发性能。

2026-03-24 21:41:39 555

原创 CAS 原理与问题全景:ABA、自旋、原子类与 synchronized 对比(含选型与排查)

摘要:CAS(Compare And Swap)是Java并发编程的核心原子操作,通过硬件指令实现"比较-交换"的原子性。它能解决count++的线程安全问题,但也存在自旋开销、ABA问题、单变量限制等缺陷。针对不同场景,AtomicInteger适合低并发计数,LongAdder擅长高并发统计,复杂操作需用锁。选型关键在于冲突程度和操作复杂度:低冲突短操作用CAS,高冲突或复杂逻辑用synchronized。线上排查CAS热点问题需关注CPU飙高和单点竞争情况,可通过分片或限流优化。

2026-03-24 21:41:18 499

原创 CompletableFuture:线程池选择、异常链路、组合模式与最佳实践

本文总结了Java中CompletableFuture的最佳实践与常见陷阱。核心要点包括:必须使用自建业务线程池而非默认公共池,区分CPU/IO任务类型选择合适线程池;介绍了thenApply、allOf等常用组合模式;强调异常处理(exceptionally/handle)和超时控制(orTimeout)的重要性;提供了并行聚合+超时+降级的工程模板;列举了join异常、线程池耗尽等常见问题;最后给出排查指标和面试表达要点。关键在于合理控制并行度、确保异常可观测、匹配下游承载能力,实现高效可靠的异步编排。

2026-03-23 09:07:53 258

原创 并发容器:CHM、CopyOnWrite、阻塞队列的选型与常见坑

并发容器选型需结合读写比例与一致性需求。ConcurrentHashMap通过CAS+桶级锁实现高并发,但存在弱一致性问题;CopyOnWriteArrayList适合读多写少场景,但写操作成本高;BlockingQueue是线程协作核心组件,需注意有界队列选择以避免堆积。常见问题包括热点key竞争、写放大和无界队列OOM等。面试要点在于理解不同容器的适用场景与实现原理,如CHM的锁粒度优化、CopyOnWrite的读写分离特性等。正确选型需权衡性能、一致性与内存压力。

2026-03-23 09:05:49 347

原创 死锁与锁竞争排查:jstack / Arthas、锁顺序与典型案例

线上并发问题主要分为死锁和热点锁竞争两类。死锁表现为线程互相等待导致系统卡死,可通过jstack直接定位;热点锁竞争则表现为延迟抖动和吞吐下降。排查步骤包括:1)定性判断问题类型;2)使用jstack或Arthas定位具体锁和业务方法;3)通过缩小临界区、锁分离、统一锁顺序等方法修复。关键工具是jstack抓取三次线程栈对比分析,修复原则是优化锁粒度、顺序和分离。面试中需清晰区分两类问题并掌握排查思路。

2026-03-23 09:04:40 518

原创 ThreadLocal 机制:弱引用 Entry、内存泄漏、线程池复用与线上排查

ThreadLocal是解决线程上下文传递问题的工具,但其使用存在风险。关键点在于:数据实际存储在Thread的ThreadLocalMap中,Entry的Key是ThreadLocal的弱引用,Value是强引用。线程池复用场景下,未remove会导致跨请求数据污染和内存泄漏(Value被强引用无法回收)。正确做法是在try-finally中remove,或通过包装任务确保清理。排查问题时需关注线程池复用、finally清理及内存引用链。ThreadLocal适合传递TraceId等上下文信息,但不适合跨

2026-03-23 09:04:02 330

原创 线程池机制:参数语义、队列与拒绝策略、线上排查与调优

线程池是并发编程的核心组件,合理使用可提升性能,配置不当则可能导致服务崩溃。关键点包括:1) 线程池通过核心参数(corePoolSize、maximumPoolSize、队列等)控制并发;2) 无界队列易引发OOM和延迟问题,推荐有界队列;3) 执行流程遵循"核心线程→队列→非核心线程→拒绝策略";4) 拒绝策略需谨慎选择,CallerRunsPolicy可形成背压;5) 线上问题排查需关注线程状态、队列大小和拒绝次数。工程实践中,线程池应作为"背压装置"而非&qu

2026-03-22 21:55:35 317

原创 ReentrantLock 与 Condition:公平/非公平、可中断/超时与最佳实践

摘要:ReentrantLock是比synchronized更灵活的工程级锁,支持公平/非公平、可中断、超时获取和多条件队列。优先使用synchronized的场景包括短临界区和简单需求,而需要精细控制时选用ReentrantLock。核心方法包括lock()、tryLock()和lockInterruptibly(),必须配合finally中的unlock()。Condition可实现精准唤醒,需注意await()会释放锁并用while防止虚假唤醒。常见问题包括忘记解锁和滥用signalAll。排查锁竞争

2026-03-22 21:55:00 308

原创 AQS 原理主线:state、CLH 队列、独占/共享与实战排查

AQS(AbstractQueuedSynchronizer)是Java并发编程的核心框架,通过状态管理(state)和线程排队机制(CLH变体队列)实现同步功能。它提供了独占(如ReentrantLock)和共享(如CountDownLatch、Semaphore)两种模式,将通用的"获取-排队-阻塞-唤醒"流程封装为模板方法,而将状态语义定义留给子类实现。AQS采用CAS+队列的设计,无竞争时快速通过CAS操作,竞争激烈时通过队列避免CPU浪费。线上排查锁竞争时可关注线程的parki

2026-03-22 21:54:31 392

原创 synchronized到底锁的是什么:对象头 Mark Word、Monitor、锁升级与排查

本文深入解析Java中synchronized关键字的实现原理与使用要点。主要内容包括:1) synchronized本质上是对对象Monitor的控制,锁对象决定互斥范围;2) 三种使用方式(实例方法、静态方法、代码块)对应的锁对象差异;3) JVM实现机制,包括对象头、Mark Word与Monitor的关系;4) 锁升级过程(偏向锁→轻量锁→重量锁)及其触发条件;5) 常见错误用法与最佳实践;6) 线上锁竞争问题的排查方法,如分析线程状态、使用jstack定位锁持有者。文章强调理解锁对象选择的重要性,

2026-03-22 21:46:25 439

原创 JVM 类加载机制:双亲委派模型、打破场景与排查思路

文章摘要:本文深入解析Java类加载机制,重点阐述双亲委派模型及其工程意义。首先介绍三类核心加载器(Bootstrap、Platform、AppClassLoader),详细拆解加载流程的三步骤(查缓存、向上委派、向下尝试)。分析双亲委派的价值在于保护核心类库安全和避免类型不一致,同时解释SPI和Tomcat打破委派的必要性。针对线上常见的类加载异常(ClassNotFoundException、NoSuchMethodError等),提供排查思路和验证方法。全文贯穿"从理论到实践"的主

2026-03-22 21:41:51 390

原创 Axios 二次封装:拦截器、统一错误处理与文件下载

本文介绍了Axios二次封装的实用思路,解决前端项目中接口管理的常见痛点。通过请求实例+拦截器+统一错误处理的方案,实现了自动注入token、集中处理401/500错误、统一文件下载逻辑等功能。重点包括:请求拦截器自动添加token,响应拦截器统一处理业务码和HTTP异常,以及blob文件下载的兼容性处理。这种封装方式将通用逻辑从业务代码中剥离,使开发者只需关注业务成功/失败状态,提升开发效率和代码可维护性。

2026-03-21 22:29:17 384

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除