- 博客(75)
- 收藏
- 关注
原创 从单机到分布式:互联网系统架构演进全流程
任何大型互联网平台都不是一步建成分布式架构,而是伴随着用户流量、数据量的增长,一步步迭代优化而来。从最原始的单机小系统,到具备 CDN、多级缓存、分库分表、搜索引擎、消息队列、微服务的成熟分布式架构,每一次架构升级,都是为了解决当下业务暴露出的性能、容量、高可用瓶颈。本文结合架构发展以及对应图解,梳理系统架构迭代的全过程。
2026-07-05 13:55:48
403
原创 本地事务与分布式事务详解,不止是数据库事务
原子性 (Atomic):一组 SQL 要么全部执行成功,要么全部回滚,不存在中间状态;一致性 (Consistent):事务执行前后,业务数据约束不变(比如余额不能为负数);隔离性 (Isolate):多个并发事务互相隔离,互不干扰,通过隔离级别控制;持久性 (Durable):事务执行COMMIT提交后,修改永久落盘,宕机不会丢失。原生SQL执行流程BEGIN;-- 开启事务,数据库创建事务快照,所有修改仅存在内存缓冲COMMIT;
2026-06-28 23:28:08
404
原创 分布式ID深度解析:号段模式 vs 雪花算法
为什么单机自增 ID 在分布式环境彻底失效???在单体项目中,我们直接使用数据库自增主键就能保证每条数据唯一。一旦数据量成万、上百万甚至上亿,系统就会发展到因此我们需要:在多机器、多数据库环境下,生成全局不重复、满足高并发、有序友好的数字唯一标识。
2026-06-28 21:21:33
368
原创 Java四大引用:强、软、弱、虚引用
只要强引用链可达,垃圾回收器永远不会回收该对象,哪怕 JVM 内存溢出 OOM 也不会回收。由实现,内存充足时不回收,堆内存即将 OOM 前,GC 会回收所有仅被软引用关联的对象。如果回收完软引用对象后内存依旧不足,才抛出。由只要发生 GC,无论堆内存是否充足,仅被弱引用关联的对象一定会被回收。又称幽灵引用、幻影引用,通过实现,是最弱的引用。get()方法永远返回null,无法通过虚引用获取原始对象;唯一作用:对象被 GC 回收时,将虚引用存入,开发者可监听队列,执行回收前清理工作。
2026-06-24 19:04:52
154
原创 Java8新特性之Stream API保姆级教程
Stream 并非数据存储容器,它是一套集合数据处理流水线工具,将集合 / 数组数据当作流水线上的原料,链式串联过滤、转换、排序、分组等加工步骤,最终输出处理结果。底层依托 Lambda + 四大核心函数式接口(PredicateFunctionConsumerSupplier只描述要做什么,不关心底层循环实现。
2026-06-20 10:35:15
396
原创 更深入的了解类加载机制与类加载器
java开发者继承重写方法实现;适用场景:热部署、代码加密、从网络 / 自定义路径加载类。双亲委派是 JVM 默认的类加载协作机制:当一个类加载器收到加载请求时,优先向上委派给父加载器处理;只有父加载器无法完成加载,当前加载器才会尝试自己加载。注意:这里的 “父子” 是逻辑上下级,并非 Java 类继承关系。
2026-06-09 20:36:34
385
原创 从源码深度解析Java线程池 ThreadPoolExecutor
高 3 位:线程池状态(RUNNING / SHUTDOWN / STOP / TIDYING / TERMINATED)低 29 位:当前工作线程数(workerCount)为什么状态和线程数用用一个变量来表示呢?这是为了避免并发过程中出现不一致,以及可以高效的操作一次就可以修改两个功能===用一个原子变量,无锁维护状态 + 线程数,高性能、无竞争。
2026-06-08 11:40:11
315
原创 JUC同步工具:CountDownLatch深度讲解
是Java并发编程中的一个重要同步工具类,它允许一个或多个线程等待其他线程完成操作后再继续执行;基于倒计时门闩机制实现的工具。
2026-06-06 11:30:03
369
原创 AQS独占模式源码详解全流程
在上一篇文章里面只是提到了AQS的大致框架,这篇主要来根据源码来刨析整个拿锁、排队、等待、挂起、唤醒、释放流程;AQS:Abstract是抽象,抽象是贯穿整个java的,利用抽象来为上层实现框架,解决了很多问题;AQS是JUC锁底层基石,定义了一个框架来实现并发(利用CAS)这个框架主要有三方面特点:① 要有通用性,下层实现透明的同步机制,同时与上层业务解耦 ② 利用CAS原子地修改共享标记位 ③ 如果有的线程必须要获取当前资源那么就必须要有一个等待队列那么基于上一篇文章对AQS的了解来进行一下讲解。
2026-06-04 13:46:40
680
原创 java锁小记
AQS(AbstractQueuedSynchronizer,抽象队列同步器)是整个JUC并发包的底层核心基石,所有显式锁(ReentrantLock、ReentrantReadWriteLock)、同步工具类(CountDownLatch、Semaphore、CyclicBarrier)的底层竞争、排队、阻塞、唤醒逻辑全部基于AQS实现。统一封装并发竞争的通用逻辑,由子类定制加锁、释放锁的专属逻辑。AQS = state同步状态 + CLH双向等待队列 + 模板方法模式。
2026-05-31 09:17:03
512
原创 Java并发容器与框架
将任意长度、无规律的输入数据,通过固定哈希算法,转换为固定长度的哈希值。核心特性:算法固定:相同输入永远得到相同哈希值;均匀分组:无规律数据被均匀打散分配到不同索引位置;可逆溯源:可通过哈希值反向定位原始数据存储位置。所有哈希容器(HashMap、ConcurrentHashMap)的索引定位、数据分组,全部依赖散列算法实现。相较于HashMap:天然线程安全,无数据覆盖、无扩容死循环问题;相较于HashTable:分段锁细化并发粒度,支持多线程并行操作,性能碾压全局锁;
2026-05-31 09:16:03
751
原创 Java线程小记
前台线程(用户线程):业务主线程,JVM必须等待其执行完毕守护线程(后台线程):为前台线程服务,所有前台线程结束,守护线程直接终止GC垃圾回收线程,全程后台运行,程序退出则GC直接退出。定义全局布尔变量作为开关,外部修改开关,线程内部循环判断,安全退出。面试结论:线程终止只有两种方式:run() 方法正常执行完毕run() 内部抛出未捕获异常。
2026-05-30 20:31:18
351
原创 详说缓存四大问题:预热、穿透、雪崩、数据不一致
在高并发业务系统中,缓存是提升接口响应速度、降低数据库压力的核心组件。但缓存并非万能,使用不当会引发各类故障,其中是最常见、最核心的四大问题。
2026-05-30 11:46:43
413
原创 Spring Bean作用域以及生命周期
作用域 = Spring 容器创建 Bean 的「实例数量」和「存活范围」它决定了:整个项目有几个这个 Bean 对象?什么时候创建?什么时候销毁?是否线程共享?实例化:反射/工厂创建原始空对象,只分配内存,无赋值无逻辑;属性赋值:完成DI自动装配,解决依赖关系,触发循环依赖处理;初始化:Aware容器感知 → 自定义初始化逻辑 → AOP动态代理增强,生成成品Bean;销毁:容器关闭时执行销毁回调,优雅释放资源(仅单例Bean生效)。
2026-05-27 18:00:57
736
原创 MyBatis缓存机制
缓存是一种临时数据存储机制,它将频繁访问、查询成本高的数据,存储在读取速度更快的介质(如内存)中,当再次请求相同数据时,直接从缓存中读取,避免重复访问底层数据源(如数据库),从而提升系统响应速度,降低数据库压力。简单来说:缓存就是 “把常用数据存起来,下次直接用,不用再查数据库”。一级缓存也叫本地缓存,是SqlSession作用域:同一个SqlSession会话内;存储介质:内存(底层是HashMap默认状态:强制开启,无法关闭;缓存 Key:由。
2026-05-24 19:32:00
797
原创 并发编程梳理(三)
原子操作:指一个操作不可拆分、不可中断、不可穿插。要么全部执行完毕,要么完全不执行,不会出现执行一半被其他线程抢走CPU的情况。我们代码中普通的 i++、赋值、判断,在计算机底层都会拆分成多条指令,是非原子操作,多线程下一定会出错。为提升硬件效率,CPU引入流水线、指令重排,单线程提速、多线程乱序出错。为解决多线程乱序出错,CPU提供总线锁、缓存锁,实现硬件原子操作。Java基于硬件原子操作封装CAS无锁机制,低并发性能极致优秀,但存在ABA、自旋开销、单变量限制三大缺陷。
2026-05-22 17:24:34
552
原创 一文掌握Spring AOP:从入门到底层原理
AOP =Aspect Oriented Programming(面向切面编程),它是OOP(面向对象编程)的补充。OOP:以「对象」为核心,关注纵向的业务逻辑(用户登录、订单创建)AOP:以「切面」为核心,关注横向的通用逻辑(日志打印、权限校验、事务管理)举个生活例子:你要给项目中 100 个 Service 方法都加上方法执行耗时统计。OOP 做法:每个方法手动写开始 / 结束时间 → 代码冗余、难以维护所有 Service 方法执行前后,自动执行统计逻辑→ 无侵入、解耦、易维护。
2026-05-21 17:56:17
740
原创 梳理并发编程相关知识(一)
很多人一上来就分不清“并发”和“并行”,其实用一句话就能区分,结合生活场景秒懂:同一时间段内,多个任务交替执行。比如一个人同时处理“回复消息”和“写代码”,看似同时做,实则是快速切换,本质是“单CPU多任务”。同一时刻,多个任务同时执行。比如两个人同时写代码,各自独立,本质是“多CPU多任务”。Java中的并发,本质是“线程交替占用CPU”,而并行是“多个线程同时占用不同CPU”。我们日常开发的并发程序,大多是“并发”,目的是提升CPU利用率,避免程序阻塞浪费资源。
2026-05-19 19:42:11
609
原创 深入理解责任链模式:从原理到实战
责任链模式:将多个处理请求的对象连成一条链,当请求发起时,沿着这条链依次传递,每个处理者对象判断自己是否有能力处理该请求。如果能处理,则直接处理并结束流程;如果不能处理,则将请求传递给链上的下一个处理者,直到请求被处理,或到达链的末尾(无人处理)。封装请假请求的核心信息,这里我们简化为“请假天数”,实际开发中可扩展为请假人、请假原因、请假类型等。/*** 请假请求(Request):封装请求信息*/// 请假天数(核心判断依据)// 请假人(可扩展)// 构造方法。
2026-05-17 22:56:30
580
原创 深入理解Cookie与Session:解决HTTP无状态的核心方案
Cookie的本质,是服务器下发给客户端(浏览器)的一段小型文本数据,相当于服务器给浏览器贴的一张“身份小纸条”。这张纸条上记录着用户的简单状态信息(比如登录标识、偏好设置),浏览器会自动保存这张纸条,并且在后续向该服务器发送请求时,自动带上这张纸条,让服务器能识别出你的身份。很多人误以为Cookie是“客户端主动创建”的,其实不然:Cookie的创建权完全在服务器,客户端(浏览器)只负责存储和传递,无权主动创建(除非通过前端JS,但有严格限制)。
2026-05-17 20:08:10
770
原创 一篇文章了解Redis内存淘汰机制与过期Key清理
Redis是内存数据库,内存容量有限(即使是服务器内存,也无法无限制存储数据)。当Redis内存使用量达到配置的“最大内存上限(maxmemory)”时,若再执行写命令(如set、hset),Redis会触发内存淘汰机制,删除一部分符合条件的key,释放内存空间,确保Redis正常运行——这就是所谓的“key内卷”。Redis 淘汰策略由allkeys-(所有 Key)、volatile-(仅设置了过期时间的 Key)淘汰规则:LRU、LFU、TTL、随机、不淘汰1.过期 Key 清理。
2026-05-16 12:38:03
569
原创 深入解析Redis持久化机制
在指定时间点,将内存中的所有数据以快照的形式,压缩后写入二进制文件(默认文件名dump.rdb),Redis重启时,直接加载该文件,将数据恢复到内存中。其底层依赖“写时复制(COW)”机制,确保持久化过程不影响主进程的正常读写。
2026-05-16 11:12:37
597
原创 深入解析Java基础之基础
JVM是一个抽象的、软件层面的“虚拟计算机”,是Java程序运行的底层核心载体,本质上是一段运行在操作系统上的程序,负责将Java字节码解释(或编译)为本地机器码并执行。JRE是运行Java程序所必需的环境集合,面向的是“普通用户”或“部署环境”,只负责运行已编译好的Java程序,不提供任何开发相关的工具。JDK是Java开发必备的完整工具包,面向的是“Java开发者”,不仅包含了运行Java程序的JRE,还提供了编译、调试、监控等开发所需的工具,既能开发Java程序,也能运行Java程序。
2026-05-14 18:26:45
562
原创 Web 全栈如何交互以及计算机网络底层的逻辑是什么?
在我们写servlet项目时,前后端为什么可以交互,如何交互?有时候会出现404错误,这是什么原因?这篇文章主要围绕这些问题来讲解相关知识点。
2026-05-12 12:51:31
925
原创 深入解析Spring依赖注入 DI 的三种方式
Autowired是Spring框架自带的依赖注入注解,其核心作用是:自动装配符合条件的Bean到当前类的属性、方法或构造器中,无需手动创建Bean实例,由Spring容器统一管理和注入。@Autowired可用于字段、构造器、setter方法、方法参数,四种场景各有适用场景,其中构造器注入是Spring官方推荐的方式、而参数注入适用于局部方法需要依赖Bean的场景,灵活性更高。
2026-05-10 22:33:38
768
原创 深入理解Java适配器模式,彻底搞懂设计思想
适配器模式(Adapter Pattern)是结构型设计模式的一种,核心作用是让两个原本不兼容的接口 / 类能够协同工作,就像生活中的电源适配器:国内电器是两脚插头,国外插座是三孔插孔,通过电源适配器就能让两者匹配使用,无需修改电器或插座本身。
2026-05-09 15:48:19
683
原创 深度讲解 AI Agent 完整运行全流程
AI Agent 不是大模型的简单包装,而是一套语义理解→任务规划→技能匹配→协议调度→工具执行→结果整编的完整工程架构体系。看懂这一整套流程,就能更好的理解Agent产品的底层逻辑。
2026-05-08 19:07:18
742
原创 数据库设计:MySQL概念结构设计E-R图
概念结构设计是数据库设计的第一步,作用是:不关心数据库、不关心表、不关心字段类型,只用最直观的方式描述业务里有哪些数据、它们之间是什么关系。E-R 图(实体 - 联系图)2.数据库设计的基本流程概念结构设计是数据库开发的关键阶段,主要任务是将用户需求抽象为信息结构(E-R模型)。需求分析:明确数据范围、用户操作及约束条件。概念设计:通过E-R图描述实体、属性和关系。逻辑设计:将E-R图转换为关系模式(如表结构)。物理设计:优化存储结构、索引等实现细节。
2026-05-07 18:43:23
566
原创 数据库必学的五大核心约束
约束=给数据表加的“规则”为了确保表中的数据的完整性(准确性、正确性),为表添加一些限制。是数据库中表设计的一个最基本规则。使用约束可以使数据更加准确,从而减少冗余数据(脏数据)每一个数据表都必须有一个唯一主键作为数据的唯一标识,设置主键的列不允许为空,主键习惯 id 表示,可以在创建数据时直接指定,也可以通过修改表结构直接添加,设置为主键的列在添加数据时不能重复,即唯一性。唯一约束(可以为空+可以多个)用来保护表中某列数据不允许重复,与主键约束(非空+唯一)类似,但级别没有主键高。
2026-05-07 17:34:23
668
原创 一文搞懂Spring Bean:从概念到配置方式
在Spring框架中,Bean(在中心被托管的对象)是由Spring IoC容器(我们把它想象成一个对象管理中心)实例化、组装和管理的Java对象那和普通的对象有什么区别?本质上和我们用new关键字创建的对象没有任何区别,唯一的不同就是:这个对象的创建、管理、销毁、不再由我们手动控制,而是交给Spring IoC容器来负责为什么要交给这个容器?这就提到我们之前说的IoC的思想:降低耦合性:方便后期维护(例如,改方法名时不需要改很多地方)、统一管理(可以管理对象的生命周期,实现依赖注入)
2026-05-07 16:14:51
566
原创 一篇就懂的Java代理模式解析
就是手动编写代理类对象,编译后直接生成.class文件,并且代理类和目标类要实现同一个接口目标类和代理类都要实现这个接口,保证方法统一/*** 公共接口:租房接口*/// 核心方法:租房只做核心业务:出租自己的房子/*** 目标类:房东(被代理对象)*/@OverrideSystem.out.println("房东:出租房子");包含目标对象,调用核心方法+增强方法/*** 代理类:中介(代理对象)*/// 持有目标对象(房东)// 构造方法传入目标对象@Override。
2026-05-06 19:19:18
752
原创 深入剖析乐观锁背后的原理
乐观锁是一种无锁并发控制思想:默认认为多线程之间很少发生数据竞争不上锁、不阻塞,直接读写共享数据;在提交更新的那一刻若未被修改:更新成功;若已被修改:放弃本次更新,或自旋重试。是CPU 硬件级支持的原子指令,也是 Java 中乐观锁的底层基石。思想就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。
2026-05-05 17:44:21
509
原创 带你了解JVM到底是什么(二)
JMM不是实际的内存区域,而是一套“规范”,定义了多线程之间共享变量的访问规则:所有共享变量(非局部变量)都存放在主内存中;每个线程有自己的工作内存(存储主内存中变量的副本),线程只能读写自己的工作内存;线程操作(读取、赋值)共享变量时,需先从主内存读取到工作内存,修改后再同步回主内存。通俗理解:主内存是“公共仓库”,线程的工作内存是“个人工作台”,线程要操作公共仓库的货物,必须先拿到自己的工作台,修改后再放回公共仓库。(图片来源于网络)
2026-05-05 09:23:36
679
原创 带你了解Collections和Collection!!!
Collection:是接口,是所有单值集合的跟接口(List、Set、Queue都继承它):是工具类,全是静态方法(意味着只需要调用即可,不需要创建对象),专门是用来操作Collection集合,提供各种方便操作:排序、反转、查找......
2026-04-30 21:51:46
559
原创 java基础之拷贝、单例
是一种设计模式,该模式保证在整个应用中,一个类只能有唯一一个实例对象 ,全局共享这一个对象,私有化构造方法,禁止外部 new。这个类被称为单例类。
2026-04-29 21:04:07
721
原创 JAVA基础之反射
Java 反射允许程序在运行时,获取类的完整信息(构造、属性、方法),并且可以操作它们(创建对象、赋值、调用方法),无视 private 修饰符!正常写代码:必须要知道类名、方法名、而且不能访问private反射写代码:不知道具体细节,依旧可以创建对象,调用私有方法、修改私有属性。
2026-04-26 23:08:45
539
原创 从“听懂”到“干活”:带你了解驾驭工程、提示词工程与上下文工程的核心逻辑
在AI技术飞速普及的今天,越来越多的人开始尝试用大模型解决实际问题——可能是让AI写一段代码、整理一份文档,也可能是搭建一个能自主完成复杂任务的智能体。但很多人都会遇到同一个困惑:明明我给AI发了指令,它却总答非所问?聊了几轮之后,它就忘了我最初的要求?好不容易让它听懂了、记住了,却又不知道怎么让它真正“动手干活”?
2026-04-26 21:17:51
634
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅