自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 彻底搞懂Spring AOP:概念与实战

Spring AOP通过动态代理技术,在不修改原有代码的情况下,为程序添加额外的功能。它特别适合处理横切关注点,如日志、事务、安全、缓存等。理解AOP的核心概念(切面、切点、通知)和实际应用场景,能帮助我们编写更清晰、更易维护的代码。

2025-12-01 21:51:54 362

原创 MyBatis设计观——映射思想、动态SQL的边界与可维护性考量

MyBatis的扩展机制允许开发者定制框架行为。插件less。

2025-12-01 21:49:04 308

原创 一文看懂!Maven 工程与打包后的目录映射关系

我在 src/main/resources 下写的 application.yml,程序运行起来后到底去哪找它?为什么我的 Mapper XML 文件明明在工程里,打包后却不见了?经常听到的Classpath(类路径),到底指的是哪里?Maven 遵循“约定优于配置”的原则,但如果我们不了解这个“约定”,开发时就会踩坑。今天我们就来拆解一下 Maven 项目从源码到JAR包的映射关系。

2025-11-30 21:50:48 608

原创 ThreadLocal 源码深度解析:JDK 设计者的“妥协”与“智慧”

ThreadLocal 的源码设计是一场关于生命周期管理如果不作为(全强引用):会导致 ThreadLocal 对象本身的泄漏(Key 泄漏)。引入弱引用:解决了 Key 泄漏,但导致了 Value 的游离。最终的智慧:JDK 选择牺牲 Value 的安全性(可能泄漏)来换取 Key 的自动管理。因为它认为Value 的生命周期理应由开发者在业务逻辑中显式控制。作为开发者,理解了这一层“妥协”,我们才能更安全地驾驭这个并发利器。

2025-11-30 21:47:42 339

原创 回收系统架构演进实战:与Cursor结对扫清系统混沌

这篇文章分享的是我们正在进行的探索,而非一个"完美的成功案例"。我们的重构之旅才走了一小步,还有很多坑要踩,很多问题要解决。但我们选择边做边分享真实的经验比完美的故事更有价值。愿你在AI时代,既能拥抱新工具提升效率,又能保持对代码质量的追求、对架构美感的坚持。

2025-11-29 21:52:07 772

原创 Redis:大数据中如何抗住2000W的QPS

上面讲了,JedisCluster的connectionHandler属性的cache属性的slots属性,建立了slot与JedisPool的关系,但是JedisCluster中没有对外暴露cache。万幸的是,cache是protected,而不是private。图片也就是说,JedisClusterConnectionHandler的子类可以获得cache,所以实现子类来获取slots。图片。

2025-11-29 21:48:07 758

原创 Spring Boot模板引擎在后端开发中的实战应用

Spring Boot模板引擎为后端开发提供了强大的自动化生成能力,有效解决了重复性工作的痛点,通过掌握Spring Boot模板引擎,开发者能够构建高效的自动化工具链,将更多精力投入到业务逻辑的实现中,提升整体开发效率和代码质量。

2025-11-28 21:57:17 751

原创 高性能多级网关与多级缓存架构落地实战

场景技巧缓存雪崩设置随机 TTL(如基础值 ± 10%)缓存穿透布隆过滤器 + 空值缓存(TTL 短)热点 Key本地缓存 + 多副本分散压力大 Value压缩存储(如 Snappy)或拆分为多个 Key网关性能异步非阻塞(Reactor 模型)、连接池复用按需分层:小型系统可能只需一级;一致性分级:明确哪些数据可容忍短暂不一致;运维先行:架构越复杂,对监控、告警、自愈能力要求越高。掌握这套从理论到部署的完整方法论,你便拥有了构建下一代高可用系统的“架构罗盘”。

2025-11-28 21:52:59 725

原创 Java 中日期格式化的潜在问题

在一个电商系统中,需要将用户下单时间以特定格式展示给用户,同时在后台也会基于这个格式化后的时间进行一些数据统计和分析。开发人员使用 SimpleDateFormat 类对日期进行格式化操作。

2025-11-27 21:55:08 220

原创 告别Redis瓶颈:Caffeine本地缓存优化实战指南

在构建高性能、高可用的Web应用时,缓存是绕不开的关键技术。它能够将热点数据存储在距离计算更近的地方,极大地减少数据访问延迟,提高系统吞吐量。Redis、Memcached等分布式缓存因其强大的功能和共享特性而广受欢迎。然而,在面对极高并发请求时,即使是Redis也可能成为性能瓶颈。每一次网络往返带来的毫秒级延迟,在海量请求下累积起来,足以拖慢整个系统的响应速度。此外,热点Key的集中访问也可能瞬间压垮Redis实例。此时,Java 世界中,Caffeine 已经是事实上的本地缓存首选,它不仅性能优秀,还在

2025-11-27 21:52:40 842

原创 Springboot对接mqtt

在Spring Boot中对接MQTT协议,可以使用Eclipse Paho客户端和Spring Integration MQTT模块。

2025-11-26 21:55:49 789

原创 支付请求幂等性设计:从原理到落地,杜绝重复扣款

同一操作无论执行多少次,最终结果都是一致的。同一笔订单,无论用户发起多少次支付请求,都只扣一次款;同一笔支付回调,无论第三方(如微信支付、支付宝)重复通知多少次,都只更新一次订单状态;重复操作不会产生额外的业务影响(如重复生成支付记录、重复发送扣款短信)。支付幂等性的本质是 “用唯一标识锁定操作,用状态校验控制流程”—— 无论重复请求来自用户、网络还是系统,只要通过 “唯一标识判断是否已处理”,就能保证结果一致。设计时需遵循 “简单优先,兼顾场景。

2025-11-26 21:50:13 211

原创 Spring Boot 整合 Zookeeper实现分布式锁?

在 Spring Boot 中实现分布式锁通常可以利用 ZooKeeper 来实现。以下是整合 Spring Boot 和 ZooKeeper 实现分布式锁的基本步骤。通过以上步骤,你就可以在 Spring Boot 应用程序中使用 ZooKeeper 实现分布式锁。这样可以确保在分布式环境下对共享资源的访问是线程安全的。

2025-11-24 21:54:03 179

原创 从 JDK1.2 到 JDK21:ThreadLocal的进化解决了什么问题

JDK 版本变化点影响1.2基本实现存在严重泄漏风险1.3-1.4Bug 修复稳定性增强5key 改为弱引用避免 key 泄漏,但 value 泄漏依旧6加强化清理逻辑降低内存泄漏风险7进一步优化冲突处理性能提升8成熟实现,清理更激进标准实现,被行业普遍使用9+易用性提升(withInitial)开发体验增强21虚拟线程支持稳定泄漏风险显著降低。

2025-11-24 21:50:07 619

原创 synchronized 的底层原理及优化机制

原子性指一个操作或一组操作,要么全部执行且执行过程不被打断,要么全部不执行(不可分割)。比如 i++ 本质是「读取 i → 加 1 → 写入 i」三个步骤,若不加同步,多线程环境下可能被其他线程打断,导致结果错误。可见性指一个线程修改了共享变量的值后,其他线程能立刻感知到这个修改。若没有可见性保障,线程 A 修改的变量可能只存在于自己的工作内存中,未同步到主内存,线程 B 读取的仍是主内存中旧值。有序性指程序执行的顺序与代码编写的顺序一致,避免因「指令重排序」导致的多线程执行混乱。

2025-11-23 21:49:12 559

原创 不懂汇编的后端不是一个好的开发

在AI能够生成代码的今天,我们可能会问:还有必要学习这种底层知识吗?正因为AI擅长生成高级代码,理解底层的开发者才更加珍贵。诊断一个只有在生产环境出现的性能问题优化一个已经高度优化的关键路径设计一个既优雅又高效的系统架构汇编知识是你的超能力在别人看到魔法的地方看到机制在别人满足于表象的地方探究本质在别人束手无策的地方找到出路后端开发的真正高手,既能在架构层面驾驭分布式系统的复杂性,又能在底层理解每个指令、每个字节的代价。这种全栈的深度理解,让你在技术领域中立于不败之地。

2025-11-23 21:46:47 594

原创 一文搞懂!分布式锁工具类

在多节点部署、事件回调或定时任务并发执行的场景中,需要同一份业务数据只被处理一次,否则会导致重复推送、资源竞争或脏数据。传统 synchronized 或数据库锁难以满足跨进程、跨机器的互斥需求。通常的做法都是使用Redisson 加一个分布式锁。每次加分布式锁要写一堆代码,特别的麻烦,而且由于不断有新人进组,导致加分布式锁的代码并不规范,会导致加锁的异常处理存在安全风险,因此就封装了一个工具类给项目组成员使用,通过这个工具类,一来可以避免每次加锁写很多的代码,二来通过工具类可以保证加锁的安全性。

2025-11-21 21:53:21 708

原创 Spring Boot 4.0 正式发布,真学不动了!

Spring Boot 4.0.0 正式发布,基于 Spring Framework 7.0,全面支持 Java 25(含虚拟线程优化)。核心新特性包括:HTTP Service Clients 简化远程调用;原生 API 版本管理;全面采用 JSpecify 空安全体系(默认非空,编译期防 NPE);关键依赖升级至 Jackson 3.0、Tomcat 11、Hibernate 7.1 等;支持 Gradle 9;Redis 静态主从配置;移除 Undertow。

2025-11-21 21:47:54 638

原创 秒杀库存扣减用redis原子自增的巨坑

Lua 脚本的本质不仅仅是逻辑判断,更是为了“原子性”和“减少无效写操作”。特性Lua 脚本方案DECR + INCR 补偿方案原子性完全原子(要么全做,要么不做)无原子性(两个独立步骤,中间可能断开)故障后果即使服务崩了,库存依然准确服务崩了 = 库存永久变负Redis 写压力库存不足时,0 写操作库存不足时,2倍 写操作(最致命)推荐指数⭐⭐⭐⭐⭐☠️ (绝对禁止)所以,宁愿多写几行 Lua 脚本代码,也不要为了省事用 DECR 后再 INCR,风险成本太高了。

2025-11-20 21:50:13 275

原创 包冲突排查指南:从发现到解决的全流程实战

先定位根源:用依赖树、类加载日志找到冲突的包来源和版本,不盲目排除依赖;优先简单方案:排除冲突依赖 > 强制指定版本 > 调整顺序 > 类加载隔离,尽量选择侵入性低的方案;兼顾兼容性:解决冲突时,需验证原有功能是否正常,避免 “解决一个冲突,引入另一个问题”;长效预防:通过统一版本、清理依赖、CI 检测,从源头减少冲突发生。包冲突的本质是 “依赖管理的混乱”,只要规范依赖引入、掌握工具使用,就能快速解决绝大多数问题。

2025-11-20 21:45:59 642

原创 IDEA + Maven 实战:如何优雅地切换 Dev 和 Prod 环境进行打包?

通过安全性提升:避免了手动修改配置导致的生产事故。效率提升:IDEA 图形化勾选,一键切换。标准化:无论是本地运行还是服务器构建,都统一管理。建议根据你的项目类型(普通 Maven 项目选方案一,Spring Boot 选方案二)尽快接入这套流程。

2025-11-19 20:39:18 626

原创 MySql 的 VARCHAR 和 TEXT 怎么选?大厂都在用的文本存储方案

在MySQL中,TEXT类型是用来存储大文本数据的数据类型。TINYTEXT:最大长度 255 字符TEXT:最大长度 65,535 字符MEDIUMTEXT:最大长度 16,777,215 字符LONGTEXT:最大长度 4,294,967,295 字符1. 内容长度通常超过4000字符博客文章、新闻正文产品详细描述(富文本格式)论坛长帖子、文档内容2. 内容长度不确定,但可能很大用户生成的富文本内容系统日志的详细上下文邮件模板和通知内容3. 内容不参与频繁查询和排序。

2025-11-18 21:56:19 244

原创 订单超时自动取消:从业务场景到技术落地的完整设计方案-

订单超时自动取消功能的设计,核心不是 “选哪种技术方案”,而是 “确保一致性与可靠性取消前严格校验订单状态,防误判;取消中用事务保障 “状态修改 + 资源回补” 原子性,防资损;取消后完善监控与日志,防问题不可追溯。最终,方案需适配自身业务规模与实时性要求:中小业务用 Redis 快速落地,中大规模用定时任务或延迟队列保障可靠,核心是 “不追求最复杂的技术,只选最适合的方案”。

2025-11-18 21:49:34 298

原创 深入理解Spring核心原理:Bean作用域、生命周期与自动配置完全指南

java// 线程级别作用域 configurer.setScopes(scopes);} } @Service @Scope("learning") // 现在每个线程都有自己的实例 public class LearningService { // 这个Bean在每个线程中都是独立的 }

2025-11-17 21:46:02 733

原创 深入理解 Spring Bean 生命周期:从实例化到销毁

在 Spring 框架中,Bean 的生命周期是理解容器管理机制的核心。本文将通过图示和代码示例,详细解析 Spring Bean 从创建到销毁的完整流程,并解答常见疑问:是否可以在初始化前跳过属性赋值?

2025-11-17 21:42:39 790

原创 解决访问 https 网站时,后端重定向或获取 URL 变成 http 的问题?

一种常见的服务部署架构是 Nginx 反向代理后端 Java 应用服务器,Nginx 监听 443 端口处理 https 请求,然后转发给后端服务器。ini} }即:客户端与 Nginx 之间是 https,Nginx 与后端 Java 应用服务器之间是 http。要解决这些问题,可以通过 Nginx 配置 + 少量后端代码修改来实现。

2025-11-14 21:50:43 693

原创 美团面试:接口被恶意狂刷,怎么办???

自定义一注解AccessLimit**。java@Retention(RUNTIME) @Target(METHOD) public @interface AccessLimit { //次数上限 int maxCount();//是否需要登录 boolean needLogin()default false;关于接口防刷,如果在面试中被问到,至少还是能说个123了。也建议大家手动试试,自己搞出来了更带劲儿。

2025-11-14 21:48:29 483

原创 java内存泄漏问题排查与JVM调优

Java语言本身支持垃圾自动回收,在日常编程中我们几乎没有关注过对象回收的问题。解决内存泄漏可能停留在八股文上。今天分享一次项目中内存泄漏的排查流程到最终解决。

2025-11-13 21:33:48 1007

原创 5分钟上手!MyBatis-Plus 让你开发效率翻倍!

工具是为人服务的,选择适合自己项目的技术栈才是最重要的。MyBatis-Plus 在大多数业务场景下都能显著提升开发效率,值得大家深入学习和使用。

2025-11-13 21:32:21 536

原创 Redis主从同步以及Redis-Shake数据同步实战

项目在进行上云,原先redis是自建的,现需要对自建的redis中的数据迁移到云上的redis中,遂调研当前有哪些工具支持redis的全量部署数据的迁移和增量数据迁移。

2025-11-12 21:56:20 997

原创 在微服务架构下,如何结合Spring Cloud实现动态数据源的路由管理

这是Spring框架提供的基础能力,非常适合需要精细控制路由逻辑的场景,例如根据登录用户信息或特定的业务规则来选择数据库。实现步骤定义数据源上下文持有者:使用来确保每个线程的数据源选择是隔离的,这是实现动态路由的核心。typescript体验AI代码助手代码解读复制代码} }创建动态路由数据源:继承并重写方法。scala体验AI代码助手代码解读复制代码。

2025-11-12 21:53:18 835

原创 SpringBoot 2.x 和 3.x 的核心区别,这些变化你必须知道

特性最低 Java 版本Java 8Java 17包名javax.*jakarta.*原生镜像不支持原生支持继承 WebSecurityConfigurerAdapter使用DSL 配置云原生支持/health未来支持逐渐停止主推版本SpringBoot3.x不是可选项,而是Java 开发现代化的必经之路。早点了解,早点准备,别等到公司要求升级时,你还在问“javax和jakarta有啥区别?另外SpringBoot4.x很快就发布正式版了,可以关注一下。

2025-11-11 21:38:03 498

原创 Spring是Java语境下的“最优解”的原因与启示

这并非Spring本身不好,而是因为。评价Spring在非Java语境下的复杂性,需要跳出Java的世界观。

2025-11-10 15:53:23 888

原创 深入理解ThreadLocal:从原理到架构实践的全面解析

始终手动清理:无论使用ThreadLocal还是TTL,都应在finally块中调用remove()方法避免存储大对象:ThreadLocal中存储大对象可能导致内存占用过高,尤其在核心线程长期运行的场景谨慎使用静态ThreadLocal:静态实例生命周期与类相同,更容易引发内存泄漏线程池必须配合TTL:在任何使用线程池的场景,若需传递上下文,TTL是目前最成熟的解决方案监控与告警:通过JVM监控工具(如VisualVM)定期检查ThreadLocal的使用情况,防止滥用。

2025-11-10 15:50:59 827

原创 深入理解ThreadLocal:从原理到架构实践的全面解析

始终手动清理:无论使用ThreadLocal还是TTL,都应在finally块中调用remove()方法避免存储大对象:ThreadLocal中存储大对象可能导致内存占用过高,尤其在核心线程长期运行的场景谨慎使用静态ThreadLocal:静态实例生命周期与类相同,更容易引发内存泄漏线程池必须配合TTL:在任何使用线程池的场景,若需传递上下文,TTL是目前最成熟的解决方案监控与告警:通过JVM监控工具(如VisualVM)定期检查ThreadLocal的使用情况,防止滥用。

2025-11-10 15:49:56 683

原创 Spring Boot 热启动配置实战:从手动重启到秒级反馈

目标工具效果快速反馈DevTools简单集成零延迟热替换JRebel商业版免费接近 JRebel 体验稳定方案自动化与 CI 集成持续同步。

2025-11-09 21:48:37 897

原创 如何解决Spring Boot与其他框架集成时的版本冲突问题?

问题:自定义框架的 Bean(如 DataSource、DispatcherServlet)与 Spring Boot 自动配置的 Bean 重名或功能冲突,导致启动失败(如 NoUniqueBeanDefinitionException)。解决方法:禁用冲突的自动配置arduino体验AI代码助手代码解读复制代码。

2025-11-09 21:34:55 770

原创 一个经典案例深入剖析Java并发中的“可见性”陷阱

共享可变状态必须考虑线程安全;volatile不只是“防重排序”,更是建立的轻量级工具;一个 volatile flag,可带动一批普通变量的可见性——这是高效并发设计的基石;测试多线程bug不能靠“跑几次没事”,而要靠理论保证。

2025-11-07 21:41:36 555

原创 SMB协议实现对远程 Windows 共享服务器或 Samba 服务的文件读取

代码段设计决策为什么重要路径两端标准化dirUrl.endsWith("/") 检查目录 URL 标准化确保 listFiles() 能正确识别目录精确计算相对路径保持原始目录结构不丢失文件类型匹配处理大小写不敏感的文件名流资源自动关闭防止文件句柄泄漏独立文件异常捕获错误隔离保证单个文件失败不影响整体任务核心工程哲学:在 SMB 传输中,路径格式和错误隔离是决定系统是否能稳定运行的两个关键因素。

2025-11-07 21:40:11 847

原创 浅谈java中的悲观锁,乐观锁以及CAS操作

所谓原子性,就是一个(一系列)操作,要么全都执行,要么全都不执行,不能执行到中间某种状态就结束,同时对于外界(其它)来看,要么就是看到执行前的结果,要么就是执行后的结果,不能看到中间状态。CAS 是一种思路,也是乐观锁的一种实现方式,除此之外,还可以通过数据库主键控制,数据库版本号等方式来实现,但是本质都差不多,就是在写入时进行原子级别的比较并写入。如果并发没发生,我直接操作有没有锁无所谓,如果并发发生了,我看下对我的影响,如果对我有影响,我就认为这次操作失败了,重新操作试下。都有典型的加锁解锁操作。

2025-11-06 16:16:58 457

空空如也

空空如也

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

TA关注的人

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