- 博客(72)
- 收藏
- 关注
原创 让小白一眼爱上的Java 线程池入门与面试
这与 newCachedThreadPool 行为类似,区别是 newCachedThreadPool 的 keepAliveTime=60s(临时线程存活 60 秒),而如果这里自己设 corePoolSize=0 + SynchronousQueue + keepAliveTime=0,那临时线程干完活就立刻销毁了,几乎等于来一个任务就 new 一个线程、用完就销毁,性能极差。get() 阻塞的是外面的线程,不是池子里的线程,池子里的活跃线程数已经是空闲状态了。话术:先创建临时线程。
2026-07-07 20:06:31
339
原创 Seata AT 模式 —— 分布式事务
版本要求:Seata 2.6.0+ 场景贯穿:电商系统「下单功能」—— 库存扣减 + 积分扣减 + 订单创建的一致性保障。
2026-07-07 20:02:06
595
原创 Spring AOP面向切面编程-从注解到实战
/ 匹配加了 @LogAnnotation 注解的方法📋 需求描述:用一个@Loggable注解标注在需要记录完整入参+出参+耗时的方法上,自动输出日志。💻 实现代码// 1. 自定义注解// 业务描述// 是否打印参数// 是否打印返回值// 2. 切面实现@Aspect@Component@Slf4j// 获取注解信息// 构建日志.append(" | 方法: ").append(methodName);
2026-07-06 21:26:08
590
原创 Redisson分布式利器-常用功能入门与实践
一句话定义:Redisson 是 Redis 官方推荐的 Java 客户端之一(与 Jedis、Lettuce 并列),它最大的亮点是把 Redis 的数据结构「翻译」成了 Java 开发者熟悉的并发工具和集合类。定位对比客户端定位适合场景Jedis底层 Redis 客户端,API 贴近 Redis 命令对 Redis 做基础 CRUDLettuce异步/响应式 Redis 客户端高并发、响应式架构Redisson分布式工具集,封装了锁、队列、限流等分布式应用开发。
2026-07-06 21:12:14
464
原创 Seata AT模式下的undo_log流转
SQL 类型回滚操作原理INSERTDELETE把插入的行删掉DELETEINSERT用前镜像把删掉的行插回去UPDATEUPDATE用前镜像把值恢复回去。
2026-07-05 20:48:33
243
原创 MySQL 数据库连接池调优实战
维度要点一句话记住连接数不是越多越好找到拐点,过剩反降调优方法Druid 监控 + JMeter 压测线上看数据,压测验证配套优化批量 INSERT + 索引先优化 SQL,再调连接池基准公式只是起点压测找到最优值。
2026-07-05 20:44:16
367
原创 报废审批流规则引擎设计——责任链模式完整实现
维度要点一句话记住核心模式责任链每个 Handler 独立判断,能批就批,不能就传编排方式@Order + Spring 注入不改代码调顺序金额比较不是 equals,是 compareTo多维度Map 维护多链不同资产走不同链兜底末节点 canApprove=true不漏单。
2026-07-04 15:27:14
210
原创 MyBatis-Plus 批量操作与 rewriteBatchedStatements 优化
维度要点一句话记住默认行为saveBatch 是循环单行 INSERT不是多值 INSERT,是"批量提交"优化方案加一个参数,效果天差地别备选方案手写 foreach XML灵活但有代码量常见坑误以为 saveBatch 就是多值 INSERT先搞清默认行为再优化。
2026-07-04 15:19:03
458
原创 事务消息 vs Saga 编排:概念辨析与选型指南
概念一句话记住事务消息一个服务内,写 DB 和发 MQ 要原子Saga多个服务间,操作序列要一致本地消息表把"发消息"变成"写 DB",更简单可控选型原则强一致用 Seata,最终一致选消息表或 Saga。
2026-07-03 16:45:47
421
原创 高并发压测与性能优化实战
维度要点一句话记住工具Druid 看线上,JMeter 做对比压测并发峰值 × 1.5~2验证冗余,不是打崩优化顺序SQL → 连接池 → 架构先解决慢查询,再调连接池数据来源先说工具再说值"Druid 监控显示……"
2026-07-03 16:42:02
492
原创 Spring Security 过滤链异常捕获:为什么 JWT 过滤器的异常全局 @RestControllerAdvice 抓不到?
Filter 异常 → Tomcat 处理 | Controller 异常 → @RestControllerAdvice 处理,两者不在同一个层级,Filter 异常走不到全局异常处理器。
2026-07-02 15:20:58
492
原创 uni-app 入门完整指南(面试级)
uni-app 是由DCloud(数字天堂)公司开发并开源的一个前端框架,使用Vue.js 语法编写代码,可以一套代码编译到多个平台运行。
2026-07-02 15:17:19
294
原创 一、ThreadPoolExecutor vs ThreadPoolTaskExecutor
场景用什么Spring Boot项目@Async通用Java项目、工具类库需要动态调整线程数/监控ThreadPoolTaskExecutor是Spring对JDK原生ThreadPoolExecutor的封装。内部还是ThreadPoolExecutor,但额外提供了生命周期管理、线程名前缀、任务装饰器、@Async集成等功能。Spring项目推荐用ThreadPoolTaskExecutor,通用Java项目用ThreadPoolExecutor。
2026-07-01 09:16:37
631
原创 JVM 调优入门与面试
实际项目中的模板通常是:堆设物理内存的 60-70%,保留一部分给元空间和系统,G1 设目标停顿 200ms。话术:永久代是 JDK 7 及之前的方案,在堆内存里划了一块固定大小,类多了容易 OOM。JDK 8 改成了元空间,用的是本地内存(堆外),默认只受物理内存限制,不会轻易 OOM。话术:先做监控再调优。第一步是加 GC 日志参数,用 jstat 看 GC 频率和耗时,jmap 看堆使用情况。Java 8 之前叫永久代(PermGen),之后改元空间(MetaSpace),从堆移到了本地内存。
2026-07-01 09:11:44
309
原创 Java 动态代理原理入门与面试
代理 = 中介 / 帮你办事的人你不想亲自做一件事,找个人帮你做,但你还是能控制他做什么、怎么做。你(目标对象)→ 代理(中介)→ 实际办事↑你可以在这里加额外操作(记录日志、权限校验、事务管理)话术:动态代理不需要手写代理类,在运行时通过反射或字节码技术自动生成。静态代理每个目标类都要写一个代理类,10 个接口写 10 个,维护成本高。动态代理只需要一个处理器,所有方法调用都走同一个处理器,通用性强。JDK 动态代理基于反射,CGLIB 基于字节码生成子类。
2026-06-30 09:57:41
898
原创 Jackson 入门
Q1:Jackson 的序列化原理是什么?话术:Jackson 通过反射获取对象的 getter 方法,根据 getter 的名字推断出 JSON 字段名(比如 getName() → name),调 getter 拿到值,拼成 JSON 字符串。反序列化相反:先调无参构造器创建对象,然后根据 JSON 字段名找对应的 setter,调 setter 把值填进去。整个过程通过 ObjectMapper 统一调度。Q2:Jackson 和 Fastjson 比,为什么企业选 Jackson?话术:三个原因。
2026-06-30 08:29:20
256
原创 @Transactional 在微服务中失效了?Spring 事务 + Sentinel 兜底机制全解析
事务跟着连接走,单体一个微服务多个;Sentinel 跟着声明走,fallback 兜异常,blockHandler 管规则。
2026-06-29 14:17:39
586
原创 Seata AT 模式 undo_log 表分析
SQL 类型回滚操作原理INSERTDELETE把插入的行删掉DELETEINSERT用前镜像把删掉的行插回去UPDATEUPDATE用前镜像把值恢复回去。
2026-06-29 14:15:07
365
原创 @Transactional 在微服务中失效了?Spring 事务 + Sentinel 兜底机制全解析
事务跟着连接走,单体一个微服务多个;Sentinel 跟着声明走,fallback 兜异常,blockHandler 管规则。
2026-06-28 18:05:08
368
原创 WebSocket 从零到能跑:Java 开发者版
WebSocket 是全双工长连接协议,解决了 HTTP 轮询的延迟和资源浪费问题。在 Spring Boot 中,通过开启,注册处理连接、消息、关闭三个核心事件。生产环境要注意线程安全(ConcurrentHashMap)、心跳保活、连接数限制和鉴权。我们在牧原 MES 项目中用 WebSocket 实现了传感器异常数据的实时推送,看板页面毫秒级收到告警。
2026-06-28 17:57:52
362
原创 ThreadPoolTaskExecutor 使用案例
方式代码量能拿结果能捕获异常能批量提交适用场景@Async最少❌❌(丢失)❌发通知、写日志少✅✅✅并行查询、需要组装结果手动submit多✅✅✅超时控制、批量提交、导出最简单的是 @Async 注解,在配置类里定义好线程池Bean,业务方法上加就行,Spring自动异步执行。适合发通知、写日志这种不需要结果的场景。需要拿结果的用 @Async + CompletableFuture,方法返回CompletableFuture,调用方可以.get()拿结果。
2026-06-27 15:48:04
170
原创 JUC 包详解
JUC包的简称,Java 5 引入的标准并发工具包。面试话术:JUC 是 Java 提供的一套开箱即用的并发编程工具,覆盖了并发集合、锁、线程同步工具和线程池四大领域,让我们不用自己造轮子就能写出线程安全的代码。
2026-06-26 16:22:48
222
原创 延迟双删的使用与注意事项
延迟双删是保证Redis与MySQL最终一致性的一种简单策略。核心步骤:先删除缓存,再更新数据库,然后休眠一段时间(通常大于读请求耗时),最后再删除一次缓存。作用:消除在"先删缓存后更新数据库"过程中,由于并发读请求把旧数据写回缓存导致的脏数据问题。局限性:固定休眠时间难以精确控制,且会阻塞写操作。生产环境中更推荐使用binlog异步删除(Canal)或消息队列方案。
2026-06-26 14:46:54
262
原创 TDengine — 原理 + 应用 + 实战案例
原理:Prometheus 采集的指标数据直接写入 TDengine,Grafana 再从 TDengine 查询,实现采集和存储解耦,解决 Prometheus 单机存储瓶颈。— 超级表将设备元数据(标签)和数据分离,同一设备的数据物理上连续存储,写入时顺序追加,天然避免了随机 IO。存储成本低,查的时候 IO 量也少。- url: "http://你的服务器:6041/prometheus/v1/write?- url: "http://你的服务器:6041/prometheus/v1/read?
2026-06-25 14:37:03
410
原创 SSE(Server-Sent Events)快速入门:从零到部署一个实时推送服务
是 W3C 标准,HTML5 的一部分。浏览器通过API 建立一个持久的 HTTP 连接,服务器通过这个连接持续推送文本数据。SSE 是服务器单向推,一条 HTTP 连接永不关。浏览器内置自动重连,Spring 一个注解就能用。
2026-06-25 14:25:09
688
原创 OutBox模式详解:保障本地事务与消息发送原子性的“黄金方案“
OutBox 模式(事务性发件箱,Transactional Outbox)的核心思想是:不直接在本地事务里发消息,而是在同一个事务里写业务表和 outbox 消息表。事务提交后,由另一个独立的进程轮询 outbox 表,把消息发到真正的 MQ。概念一句话OutBox 解决的问题保证本地事务和消息发送到 MQ 的原子性不解决的问题消费者能否成功消费(那是 MQ 和幂等的范围)核心机制同事务写 outbox 表 + 独立进程转发关键字段status=0(待发送),不是 1推荐升级。
2026-06-24 15:22:20
891
原创 JVM 内存调优的方向
实际项目中的模板通常是:堆设物理内存的 60-70%,保留一部分给元空间和系统,G1 设目标停顿 200ms。话术:永久代是 JDK 7 及之前的方案,在堆内存里划了一块固定大小,类多了容易 OOM。JDK 8 改成了元空间,用的是本地内存(堆外),默认只受物理内存限制,不会轻易 OOM。话术:先做监控再调优。第一步是加 GC 日志参数,用 jstat 看 GC 频率和耗时,jmap 看堆使用情况。Java 8 之前叫永久代(PermGen),之后改元空间(MetaSpace),从堆移到了本地内存。
2026-06-24 15:04:49
611
原创 Spring Boot常用注解全解
六大类 + 一条主线:组件注册:@Component 家族 → 谁管容器依赖注入:@Autowired → 怎么装配Web 层:@RestController 家族 → 怎么暴露接口配置属性:@Value / @ConfigurationProperties → 怎么读配置条件控制:@Conditional / @Profile → 什么时候生效AOP/事务:@Transactional / @Async → 额外能力。
2026-06-23 12:38:11
247
原创 Spring Cloud Gateway 快速入门:路由、断言、过滤器一次搞懂
*** 计时过滤器:记录请求处理耗时* 在 yaml 中配置:filters: - Timer*/@Component// 不需要额外配置@Override@Override// ══════ 前置:记开始时间 ══════System.out.println("[前置] 请求来了: " + path);// ══════ 放行:交给下一个过滤器 ══════// ══════ 后置:响应回来再执行 ══════。
2026-06-23 11:53:12
484
原创 Spring Boot自动配置原理
自动配置 = Spring Boot 提前写好的 @Bean 配置类,按需生效,无需手动注册。自动配置是 Spring Boot 实现「约定大于配置(Convention over Configuration)」的核心机制。// 1. 自动配置类@Bean// 2. 配置属性// 3. 注册自动配置。
2026-06-23 11:46:08
311
原创 Spring Security 过滤链流程:7 大核心过滤器执行顺序详解
Spring Security 本质上是一个过滤器链每个请求进来后,像流水线上的产品一样,逐个经过每个过滤器。只要有一个过滤器决定「这个请求不合法」,请求就到此为止。请求 → Filter1 → Filter2 → Filter3 → ... → Controller过滤器顺序决定异常归宿:自定义过滤器放在后面,抛出的认证异常才能被统一捕获;放在前面,异常直接冲到 Tomcat 返回 500。
2026-06-23 11:37:42
627
原创 Spring Bean 生命周期:搞懂这 8 步,面试再也不怕被问
new出来(空的)↓填依赖(@Autowired生效)↓告诉我你是谁(Aware)↓初始化前(BeanPostProcessor ✋)↓@PostConstruct → 准备资源afterPropertiesSet → 检查配置init-method → 加载缓存↓初始化后(AOP代理就在这里!🤖)↓=== 可以用了!调业务方法 ===↓容器关闭 → @PreDestroy → destroy → destroy-method → 释放资源。
2026-06-23 10:42:40
431
原创 MyBatis-Plus selectBatchIds:Collection 类型参数到底怎么传值?
知识点一句话总结参数传什么传List<Long>底层原理List 实现了 Collection,基本类型实现了 Serializable前端传参JSON 数组(POST)或逗号字符串(GET)空值校验必须做,否则报错分批查询ID 超过 1000 时用 Guava分批。
2026-06-18 09:26:05
236
原创 JwtAuthenticationFilter 详解:逐行拆解 Spring Security + JWT 的核心过滤器
是 Spring Security 的安全上下文容器。每个请求都绑定一个独立的上下文,用来存放当前请求的认证信息。JWT 过滤器 = 提取 Token → 条件守卫 → 解析 Claims → 封装 Authentication → 塞入 SecurityContext → 放行,异常转换为 BadCredentialsException 后统一处理。Token 为 null → 跳过(登录请求)Token 不为 null + 上下文已有认证 → 跳过(防重复)
2026-06-18 09:21:34
568
原创 Jenkins 初始化与自动部署:从零搭建 CI/CD 流水线
阶段操作对应原理核心认知Jenkins 是自动化调度引擎通过插件扩展能力初始化Docker 部署 + 临时密码 + 推荐插件第一道安全门 + 定义能力边界凭证管理添加 Git/Docker Hub/SSH 凭证安全集中管理敏感信息Pipeline创建 Jenkinsfile触发器WebhookGit 事件回调 Jenkins构建流程流水线定义做什么后置通知post 块配置邮件构建完成收尾。
2026-06-18 09:10:54
373
原创 从零到一:Docker Compose 使用详解,告别手动启动多个容器的痛苦
每个service对应一个或多个容器。services:nginx:ports:- "80:80"services:backend:build: ./backend # 指定 Dockerfile 目录# build:# context: ./backend # 构建上下文# dockerfile: Dockerfile.prod # 指定 Dockerfileimage: myapp:latest # 构建后镜像名build和image。
2026-06-17 16:47:28
858
原创 CAS锁加锁过程详解:从“第一次获取预期值“到自旋成功
CAS(Compare-And-Swap,比较并交换)是一条 CPU 原子指令。if (内存当前值 == 预期值) {内存当前值 = 新值;} else {整个操作在硬件层面是原子的,不会被线程调度打断。关键点一句话第一次获取预期值在第一次 CAS 之前,读取 volatile state 的那一瞬间每次自旋都会重新读每轮循环都重新获取预期值,不会用旧的CAS 核心只有当前值等于预期值时才更新,保证"无竞争才修改"自旋锁本质忙等 + 不断 CAS,适合短临界区ABA 问题用解决。
2026-06-17 16:40:38
323
原创 CAP与BASE理论及案例详解:分布式系统的“不可能三角“与工程妥协
概念一句话CAP分布式系统只能在 CP 或 AP 中选一个BASEAP 架构的工程实现:基本可用 + 软状态 + 最终一致2PC/3PC强一致但性能差的"数据库级别方案"TCC性能好的"业务级别方案",开发成本高Saga长流程的"补偿型方案"事务消息最高性能的"最终一致性方案"
2026-06-17 16:04:14
419
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅