自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SQL 性能避坑:为什么阿里强制禁用 ORDER BY RAND()?

那这几种方案怎么选?你的场景推荐方案理由数据量 < 10W方案一(应用层 Shuffle)开发最快,逻辑最简单,随机性最完美。数据量 > 10W,ID连续方案四(索引跳跃)既不用维护缓存,又能享受极致性能。数据量 > 10W,允许连续方案二(Limit Offset)性能不错,通用性强,是个老实人。数据量 > 10W,要求打散方案三(多次查询)在性能和随机性之间找到了平衡点。高并发 / 追求极致方案五(Redis Set)工业界标准答案,虽然稍微麻烦点,但真香。想被辞退。

2026-01-09 15:56:27 293

原创 Java中String类(StringBuffer、StringBuilder)相关

操作少量数据:用 String。单线程下操作大量字符串:用 StringBuilder。多线程下操作大量字符串:用 StringBuffer。判断内容相等:务必使用 equals() 而不是 ==。

2026-01-09 15:55:37 110

原创 JVM 堆内存分代

都会优先分配到 Eden 区(除非是超大对象直接进入老年代)。不同存活周期的对象放在不同区域,用不同算法回收,保证。(伊甸园区):新对象的 "默认出生地",(幸存者区0,占新生代。(幸存者区1,占新生代。今天我们一起来聊一聊。(伊甸园区,占新生代。

2026-01-09 15:54:34 114

原创 MySQL主从数据一致性的终极武器:pt-table-checksum实战

与的组合拳,是保障MySQL主从架构数据生命线的核心工具,也是每个MySQL DBA吃饭的家伙。掌握它,不是为了炫技,而是为了在出现问题时,我们能有条不紊、有理有据地解决问题。MD5。

2026-01-09 15:15:30 384

原创 SpringBoot自动配置原理

于是:SpringBoot来了,它可以自动完成配置,创建并注入需要的Bean,不需要我们自己去创建了,若有的创建Bean的工作都由提供服务的服务者去创建,他们自己实现的,当然更清楚怎么用,怎么创建系列Bean。它会去扫描classpath下的META-INF/services目录下的文件,文件名是抽象层的全限定名,例如java.sql.Driver,文件内容是服务提供的具体实现类。当然,技术在不断发展,很多时候,我们再设计的时候并不能考虑到那么多,例如响应式编程,那也是发展了很多年,才有。

2026-01-08 14:09:41 725

原创 Spring Event 别瞎用!从我司的悲剧中,我总结了6条最佳实践

这个场景下,使用 Spring Event 发布事件,Spring 无法正常广播事件,一定会出现异常,导致处理失败!在这个场景中,我们需要处理履约完成、退款完成、订单过期等事件,并且每个事件都有一些独立的业务逻辑,每一个业务场景都属于最终一致性的场景。Spring 不知道哪些订阅者成功,哪些订阅者失败,下一次重试时,会全部执行所有的订阅者。使用 SpringEvent 之前,一定要先治理服务,确保服务关闭时,先切断入口流量(Http、MQ、RPC),然后再关闭服务,关闭 Spring 上下文!

2026-01-08 14:04:22 144

原创 springboot优雅关机方案分享:逻辑实现

前两次分享,我们已经介绍过了k8sSIGTERM监听逻辑预关机逻辑各个组件的关机逻辑和监控逻辑第一篇:先弄懂 K8s 是怎么关机的带大家梳理了 K8s 节点和 Pod 关闭的基本流程。了解了它的“套路”,咱们自己设计方案时才能心里有底。第二篇:咱们的方案长啥样?知道了 K8s 的流程,那我们的 Spring Boot 服务该怎么配合着“优雅退场”呢?这一篇就讲了咱们的整体设计思路,关机要分几步、每一步要注意啥,都给大家掰扯明白了。第三篇:动手!把代码写出来光说不练假把式。

2026-01-08 13:59:45 471

原创 线上Nginx频繁502,排查3小时发现是这个配置的问题

客户端 → SYN → 服务端(半连接队列)服务端 → SYN+ACK → 客户端客户端 → ACK → 服务端(全连接队列/accept队列)应用程序 accept() → 取出连接当accept队列满了,新的完成三次握手的连接无法进入队列,客户端会收到超时或RST。502原因排查方向后端处理慢或连接队列满后端服务没启动所有后端都不可用后端主动断开连接这次的坑:后端服务看起来正常,但accept队列满了,新连接进不来。教训系统默认的太小,生产环境必须调大Nginx配置。

2026-01-08 13:56:37 534

原创 MySQL性能的定海神针:万字长文带你盘透 innodb_buffer_pool_size

兄弟们,无疑是MySQL性能调优的“第一关”,也是最重要的一关。把它设置好,基本上你的MySQL性能就成功了一半。但记住,参数调优是一个持续观察、测量、调整的闭环过程,没有一劳永逸的“万金油”配置。今天你算出来44G是合理的,可能下个月业务量翻倍,数据量暴增,这个值就需要重新评估。我希望这篇文章,不仅是让你学会如何“抄作业”,把参数配对。更重要的是,让你理解参数背后的原理,掌握科学的分析方法。这样,无论你未来遇到多么复杂的性能问题,都能具备独立分析和解决的底气。

2026-01-07 15:55:43 707

原创 DataSyncManager 详解与 Spring Boot 迁移指南

/ 1. 获取分布式锁(Redis,key = "sync:lock:" + deviceId)// 3. 异步提交到 SyncTaskProcessor(或直接调用 FeignClient)的企业级数据同步服务,服务于 IoT 设备、边缘计算节点或跨系统数据对账场景。二、Android 版 DataSyncManager 核心设计解析。三、能否迁移到 Spring Boot?的设计哲学,用 Spring 生态重新实现。四、Spring Boot 迁移方案设计。五、Spring Boot 实现示例。

2026-01-07 15:53:57 787

原创 Vavr:让Java拥抱函数式编程的利器

在Java开发中,你是否经常为空指针异常而烦恼?是否觉得传统的异常处理try-catch代码冗长难看?是否羡慕Scala、Kotlin等语言的函数式编程特性?今天,我要向大家介绍一个强大的Java函数式编程库——Vavr(原名Javaslang),它将为你的Java代码带来革命性的改变。Vavr是一个面向Java 8+的函数式编程库,它提供了持久化的数据结构和函数式控制结构,让Java开发者能够编写更加简洁、安全、优雅的代码。架构体系✅ Option - 告别空指针异常。

2026-01-07 15:37:33 605

原创 MySQL主从数据一致性的终极武器:pt-table-checksum实战

与的组合拳,是保障MySQL主从架构数据生命线的核心工具,也是每个MySQL DBA吃饭的家伙。掌握它,不是为了炫技,而是为了在出现问题时,我们能有条不紊、有理有据地解决问题。MD5。

2026-01-07 15:36:38 754

原创 SQL 调优全解:从 20 s 到 200 ms 的 6 步实战笔记

索引是根基,改写是利器,架构是护城河,监控是生命线。

2026-01-06 15:04:43 864

原创 SpringBoot实现隐式参数注入

在 Controller 层获取用户信息在 Service 层进行权限验证在某些业务逻辑中记录操作日志每一个环节都需要知道"当前用户是谁",看看目前常用的解决方案。通过 Spring MVC 的 HandlerMethodArgumentResolver我们实现了一个可以"跨 Filter 与 Controller 传参"的技术实现方案。

2026-01-06 15:03:05 580

原创 深入解析 Guava Cache- 从基本用法、回收策略、刷新策略到实现原理

通过解析 Guava Cache 的实现原理,我们发现 Guava LocalCache 与 ConcurrentHashMap 有以下不同:ConcurrentHashMap ”分段控制并发“是隐式的(实现中没有Segment对象),而 LocalCache 是显式的。在 JDK 1.8 之后,ConcurrentHashMap 采用实现:当 put 的元素在哈希桶数组中不存在时,直接 CAS 进行写操作;在发生哈希冲突的情况下使用 synchronized 锁定头节点。

2026-01-06 14:45:15 676

原创 多年以后,PageHelper 又深深给我上了一课!

关于PageHelper的介绍就这么多,真的是折磨我好几天,要不是项目紧急,来不及替换,我一定不会使用这个组件。莫名其妙的就会有个方法出现问题,一通排查,发现都是这个PageHelper导致的。虽然我已经全局搜索使用的地方,保证startPage()后紧跟sql命令,但是仍然有嫌犯潜逃,只能在有问题的方法使用clearPage()来打补丁。

2026-01-06 14:19:42 553

原创 享元模式深度解析:看Java如何优雅节省内存

在当今互联网高并发场景下,系统性能优化已成为每个开发者必须面对的挑战。你是否遇到过这样的问题:创建大量相似对象导致内存暴涨?频繁创建销毁对象引发GC频繁?今天,我们将深入探讨一个经典而强大的设计模式——享元模式(,看它如何在JDK源码、各大开源框架中大显身手,帮助我们优雅地解决这些难题。通过共享技术有效支持大量细粒度对象的复用。简单来说,就是将对象的状态分为内部状态和外部状态内部状态(Intrinsic State):存储在享元对象内部,不会随环境改变而改变,可以共享。

2026-01-05 16:54:36 552

原创 全网最全 Java 数据库优化硬核指南:架构、SQL、索引、监控一站搞定

生产事故警示录数据库优化是一个涉及架构、设计、编码、配置的全方位工程。架构层面:读写分离、分库分表是应对大数据量、高并发的根本性解决方案SQL 层面:编写高效的查询语句,避免全表扫描和不必要的数据传输索引层面:合理设计索引,遵循最左前缀原则,避免索引失效监控层面:持续分析慢查询,利用 EXPLAIN 洞察执行计划规范层面:资源及时释放,事务尽量短小,字符集保持一致数据库优化没有银弹,需要结合具体的业务场景、数据规模、访问模式进行针对性调优。持续的监控、分析和优化是保障数据库性能的关键。

2026-01-05 16:53:43 682

原创 Java CompletableFuture 接口与原理详解

是 Java 8 引入的一个强大且灵活的异步编程工具类,位于 包中。它同时实现了 和 两个接口,不仅支持获取异步计算结果,还提供了丰富的链式调用、组合、异常处理等能力,是构建高性能、非阻塞、响应式应用的核心组件之一。 核心接口包括:创建、链式调用、组合、异常处理、聚合、执行策略控制等。异步执行(有返回值)异步执行(无返回值)可传入自定义线程池链式转换与消费(单阶段) – 转换结果(同步) – 异步转换(新线程) – 消费结果(无返回)

2026-01-05 16:52:21 665

原创 京东一面:接口性能优化,有哪些经验和手段

其实这种问法,最好是你结合曾经做过的优化案例来说,然后再补充一些常见的优化手段,那就比较完美啦。

2026-01-05 16:51:43 750

原创 Spring Gateway动态路由

所以所有RouteDefinitionRepository也会被CompositeRouteDefinitionLocator拿到,然后给RouteDefinitionRouteLocator,最终给了CachingRouteLocator,而CachingRouteLocator最后到RoutePredicateHandlerMapping实际使用的RouteLocator。会扫描redis中所有以routedefinition_为前缀的key都值,然后转换为RouteDefinition。

2026-01-04 15:35:52 719

原创 Java 低代码平台的“动态引擎”:Liquor

在 Java 低代码平台中,充当了运行时和。它弥合了“配置”与“高性能 Java 运行时”之间的鸿沟。它解决了 Java 生态中热更新、高性能、强类型三者难以兼得的根本矛盾。Liquor (动态编译后)就是 Java 原生运行,比一般的 JVM 脚本(或表达式)性能高 “20倍” 左右。

2026-01-04 15:24:48 820

原创 MySQL性能的定海神针:万字长文带你盘透 innodb_buffer_pool_size

兄弟们,无疑是MySQL性能调优的“第一关”,也是最重要的一关。把它设置好,基本上你的MySQL性能就成功了一半。但记住,参数调优是一个持续观察、测量、调整的闭环过程,没有一劳永逸的“万金油”配置。今天你算出来44G是合理的,可能下个月业务量翻倍,数据量暴增,这个值就需要重新评估。我希望这篇文章,不仅是让你学会如何“抄作业”,把参数配对。更重要的是,让你理解参数背后的原理,掌握科学的分析方法。这样,无论你未来遇到多么复杂的性能问题,都能具备独立分析和解决的底气。

2026-01-04 15:19:29 374

原创 MyBatis反射模块详解

ObjectFactory - 对象工厂,负责创建对象实例PropertyTokenizer - 属性分词器,解析嵌套属性表达式PropertyCopier - 属性复制器,实现对象属性复制Reflector - 反射器,缓存类的反射信息MetaClass - 元数据类,封装ReflectorMetaObject - 元对象,提供统一的属性访问接口。

2026-01-04 14:26:29 922

原创 同事查日志太慢,我现场教他一套 awk、tail、grep、sed 组合拳

昨天临下班,生产环境出现了一个偶发的报错预警。旁边的同事正~~准备排查,只见他输入命令 一个 2GB 大小文本啊,日志哗哗刷啥也看不清,crtl + c 也停不下来了,最后轻轻的关闭连接,又重新打开了一个~后端开发来说,熟练掌握 Linux 的日志分析命令是基本功,整理几一些基于 、、、、 的日志查询场景,希望能帮你快速定位问题。很多新手习惯用 ,但对于大文件, 会导致屏幕刷屏,还容易把终端卡死。 才是实时监控的神器。真实场景 A:服务发版启动监控每次发版重启服务时,我们都需要确认 Spring Boot

2025-12-31 15:28:47 917

原创 5分钟搞定:SQL Server到MySQL数据迁移同步

如果需要针对其他目标数据源(如 Kafka、Hive、Doris)的详细教程,可继续关注本系列文章。可在任务详情页实时查看同步进度、速度、数据量及日志。保存任务后,在任务列表中点击「启动」。,依次启动两个服务。

2025-12-31 15:27:04 682

原创 一口气搞懂分库分表 12 种分片算法,大厂都在用!

算法的数据分布规则,那么这个算法也很容易明白,分片健值在界值范围内 [datetime-lower,datetime-upper) 遵循每满足 sharding-seconds 时间段的数据放入对应分片表,超出界值的数据上下顺延到其他分片中。在分片策略中,分片键确定了数据的拆分依据,分片算法则决定了如何对分片键值运算,将数据路由到哪个物理分片中。基于分片边界的范围分片算法,和分片容量算法不同,这个算法根据数据的取值范围进行分片,特别适合按数值范围频繁查询的场景。上边使用其它时间分片算法时,用的都是。

2025-12-31 15:25:17 996

原创 美团一面:new Object() 在 JVM 中到底占多大内存?

下次面试官问你:“new Object() 占多少内存?你可以自信地回答:“在主流的 64 位 JVM 中,无论是否开启指针压缩,new Object() 都占用 16 字节。开启压缩:8 字节 Mark Word + 4 字节 Klass Pointer + 4 字节对齐填充。关闭压缩:8 字节 Mark Word + 8 字节 Klass Pointer。架构师建议: 在进行海量对象存储设计(如本地缓存、对象池)时,计算内存容量千万不要只算字段大小,

2025-12-31 15:23:16 874

原创 SpringBoot大文件上传卡死?分块切割术搞定GB级传输

Spring Boot实现文件分块上传解决了大文件传输的核心痛点,结合断点续传、分块验证和安全控制,可构建出健壮的企业级文件传输方案。本文提供的代码可直接集成到生产环境,根据实际需求调整分块大小和并发策略。

2025-12-30 14:39:50 405

原创 SpringBoot 中常用的工具类库及其使用示例

Spring Framework 提供了一系列实用工具类,这些工具类在日常开发中非常有用,可以减少重复代码并提高效率。以下是一些常用的工具类及其使用示例。ClassUtils 提供了一些与类加载相关的便捷方法,如判断某个类是否是另一个类的子类,或者检查类是否存在。StringUtils 是一个处理字符串操作的工具类,提供了许多静态方法来简化常见的字符串操作任务。Assert 类提供了断言功能,用于验证程序状态或参数的有效性。每类工具都会列出 至少三个常用方法的使用示例,帮助你快速掌握其用法。

2025-12-30 14:24:12 302

原创 K8s 入门必踩的 12 个坑:不是你菜,是设计哲学变了

看完这 12 个坑,你可能会觉得 Kubernetes 简直是“反人类”。但当你跨过这些坑,真正理解了它背后的“声明式 API”、“控制循环”、“不可变基础设施”Kubernetes 不是在折磨你,它是在强迫你构建一个更健壮、更现代化、更能适应不确定性的分布式系统。

2025-12-30 14:18:49 937

原创 手把手教你Java文件断点下载

来标识当前返回的内容实体范围,并使用 Content-Length 来标识当前返回的内容实体范围长度。在客户端下载一个大对象时,因网络断开导致上传下载失败的概率就会变得不可忽视。及之上支持,如果双端某一段低于此版本,则认为不支持。:表示第一个字节到最后一个字节,即完整的文件内容。请求不合法,或者指定范围不在有效区间,会导致。这个请求头,来指定请求的内容实体的字节范围。:表示从第500字节开始到文件结束部分的内容。使用此接口不会返回文件内容。

2025-12-30 14:17:07 347

原创 从写入到可查:Elasticsearch “近实时”查询原理详解

这种方式用ID的键位做查询条件,速度很快,但对于全文检索来说,就很尴尬,比如like %name%,这样就走不到索引了,需要全表查询。当用户搜索一个词时,ES/Lucene 直接在词典中定位该词,然后立即获取包含该词的文档 ID 列表,无需扫描任何文档。的设计机制,ES 将繁重的搜索和评分工作分散到各个节点并行处理,而协调节点只负责轻量级的排序和数据聚合,从而在分布式环境中实现了极高的查询效率。当一个搜索请求到达时,ES 会将查询分发到所有相关的主分片和副本分片上,这些分片并行地在其本地数据上执行查询。

2025-12-29 17:09:24 913

原创 Kafka 性能调优:linger.ms 和 batch.size 的最佳实践

本文回顾了 Apache Kafka 4.0 中linger.ms与batch.size参数的配置,指出了在传统串行网络模型下,客户端进行性能调优时所面临的”延迟与吞吐”权衡难题。随后,我们深入解析了 AutoMQ 的Pipeline 机制,它通过服务端 I/O 模型的重构,解除了顺序处理与串行执行的强绑定。Pipeline 机制是 AutoMQ 云原生架构的核心特性之一,无需依赖繁琐的客户端参数调整,即可在保证数据严格顺序的前提下,实现 5 倍于传统架构的处理效率。

2025-12-29 16:06:32 803

原创 告别繁琐!MapStruct-Plus 让对象映射效率飙升,这波操作太香了!

作为 MapStruct 的增强版,它不仅完美继承了 MapStruct 的编译期转换、高性能优势,还通过“自动生成 Mapper 接口”等黑科技,让 Java 类型转换变得简单到离谱!你是否还在为对象映射转换写一堆重复的 getter/setter?遇到特殊转换(如密码加解密),可自定义转换规则。赶紧用起来,让对象映射从此成为“举手之劳”!从 Map 转换为实体类时,只需在目标类上加。这还只是基础操作,更强大的功能还在后面!方法直接转换,无需注入 Mapper!如果你还在为对象转换烦恼,

2025-12-29 16:05:08 725

原创 SpringBoot自动配置原理

于是:SpringBoot来了,它可以自动完成配置,创建并注入需要的Bean,不需要我们自己去创建了,若有的创建Bean的工作都由提供服务的服务者去创建,他们自己实现的,当然更清楚怎么用,怎么创建系列Bean。它会去扫描classpath下的META-INF/services目录下的文件,文件名是抽象层的全限定名,例如java.sql.Driver,文件内容是服务提供的具体实现类。当然,技术在不断发展,很多时候,我们再设计的时候并不能考虑到那么多,例如响应式编程,那也是发展了很多年,才有。

2025-12-29 16:04:10 576

原创 Java IO 全家桶:从 BIO 到虚拟线程,一篇就够

官方 benchmark:Tomcat NIO 7 w QPS → Virtual Thread 12 w QPS,延迟还降一半。不管你是刚学 Java 的本科生,还是天天调网关的社畜,都能 10 分钟看完、5 分钟定位线上慢 IO。已 GA,虚拟线程官宣“同步代码跑出异步性能”,于是有了这篇“2025 版全家桶”。最近再做文件流传输,发现JDK更新新的东西,而网上都还没有具体的应用方法。底层把 1 w 个虚拟线程挂到 1 个平台线程上,阻塞操作不再占内核栈。把鼠标滚轮锁死,下面按顺序展开。

2025-12-28 16:05:32 569

原创 MySQL面试问题汇总

MVCC。

2025-12-28 15:13:27 552

原创 面试官:如何在 Kafka 中实现延迟消息?

在切入正题之前,我们必须先搞清楚一个核心问题:什么是延迟队列?很多同学容易把“延迟队列”和“延迟消息”混为一谈。从数据结构的角度看,延迟队列()是一种特殊的队列,里面的元素带有过期时间,时间未到,谁也拿不走。Java JDK 里的DelayQueue就是典型代表,它基于堆排序,保证队头永远是最先过期的元素。生产者把消息发出去后,不希望下游立刻消费,而是希望消息在中间件里“暂存”一段时间(比如 30 分钟),倒计时结束后,自动投递给消费者。最经典的场景,莫过于电商里的“订单超时取消”。

2025-12-28 14:31:29 663

原创 JDK 21 中的虚拟线程:革新 Java 多线程

因此,虚拟线程比平台线程具有更好的性能。换句话说,Java 应用程序中的线程数量等于操作系统线程的数量。这意味着在 JDK 环境中创建的每个线程都必须映射到一个平台线程。Java 应用程序创建一个虚拟线程,该线程不与任何操作系统线程关联。以这种方式创建的线程在 JVM 内部运行,不会占用任何操作系统线程。由于它们是 JVM 内部的,因此系统中可以拥有无​​限数量的虚拟线程。我创建了一个简单的程序来展示虚拟线程和平台线程之间的性能差异。中创建代码,然后取消注释创建平台线程的代码。

2025-12-28 14:29:52 769

空空如也

空空如也

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

TA关注的人

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