自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从 OOM 到丝滑导出:EasyExcel 百万级数据导出实战

EasyExcel 的分页写入机制,是征服海量 Excel 导出的利器。核心原理:分页查询 + 分批写入 + 即时释放核心武器:PageWriteExcelHelper 分页写入工具类终极方案:ExcelExporter 开箱即用增强工具类进阶技巧:动态分页、异步导出、模板样式避坑经验:关闭Writer、清空数据、分页优化工具类代码已打包,直接复制到你的项目就能跑!🎁你在导出百万数据时还遇到过哪些坑?或者有什么独门优化技巧?欢迎在评论区分享!💬。

2025-09-18 20:41:39 537

原创 从 OOM 到秒级导入:EasyExcel 百万级数据优化实战

按数据量选模式:1万行以下用普通模式,1万行以上必须用批量模式动态调整批次大小:根据内存和单条数据大小计算,推荐500-5000行/批事务与重试:每个批次用独立事务,记录失败批次以便重试(如保存到失败表)监控与日志:记录每个批次的处理时间、成功/失败数,方便排查问题极端场景处理:超500万行数据时,先将Excel分片(如用Alibaba的OSS分片上传),再分布式并行处理通过本文的工具类和优化技巧,你可以轻松应对从几千行到几百万行的Excel导入场景,既避免OOM,又能保证处理效率。

2025-09-18 20:38:56 476

原创 MySQL索引(四):深入剖析索引失效的原因与优化方案

对索引字段进行了某种形式的操作,破坏了索引值的有序性,导致优化器无法使用索引的快速定位能力。失效场景根本原因示例解决方案索引列函数操作破坏索引有序性重写为范围查询:WHERE create_time BETWEEN...隐式类型转换MySQL自动转换类型确保类型匹配:WHERE varchar_col='123'字符集不一致关联查询隐式转换多表关联字符集不同统一字符集或显式转换违反最左前缀复合索引使用不当索引(a,b,c)但查询只用b,c调整查询条件或创建新索引。

2025-09-18 20:35:59 503

原创 MySQL索引(三):字符串索引优化之前缀索引

前缀索引允许只对字符串的前N个字符建立索引,而不是整个字符串。这与最左前缀原则密切相关:最左前缀原则指出索引可以用于匹配最左前缀的查询,而前缀索引正是这一原则在字符串字段上的具体应用。前缀索引是字符串字段优化的有效手段,它基于最左前缀原则,通过权衡存储空间和查询性能,为大数据量的字符串字段提供了实用的解决方案。在实际应用中,需要根据数据特性和业务需求精心设计,才能发挥其最大价值。正确使用前缀索引,不仅能够节省存储空间,还能维持良好的查询性能,是每个数据库开发者都应该掌握的优化技巧。

2025-09-17 21:46:19 401

原创 MySQL索引(二):覆盖索引、最左前缀原则与索引下推详解

覆盖索引是指一个索引包含了查询所需的所有字段,MySQL可以直接从索引中获取需要的数据,而无需回表查询数据行。这就像是一本教科书,如果目录已经包含了你要找的全部信息,就不需要翻到正文页面了。索引下推(Index Condition Pushdown,简称ICP)是MySQL 5.6引入的重要优化。它允许在索引遍历过程中就进行条件过滤,而不是等到回表后再过滤。理解业务查询模式分析实际业务中的高频查询,针对性设计索引优先使用覆盖索引减少回表操作,提升查询性能合理利用最左前缀。

2025-09-17 21:40:13 668

原创 MySQL索引(一):从数据结构到存储引擎的实现

本文介绍了MySQL索引的常见数据结构、不同类型的索引及其适用场景,以及聚簇索引和非聚簇索引的区别。理解这些基础知识有助于在实际工作中更好地设计表结构和优化查询性能。索引的出现是为了提高数据查询效率,就像书的目录一样,可以帮助我们快速定位到需要的内容。InnoDB选择B+树作为索引模型,主要是为了减少磁盘IO次数,提高查询效率。通过量化分析可以看出,即使是海量数据,B+树也能在极少的磁盘IO次数内完成查询。聚簇索引通过将数据存储与索引结合,避免了回表操作,但插入和更新操作可能带来页分裂的问题。

2025-09-17 21:37:08 559

原创 如何为MySQL中的JSON字段设置索引

尽管MySQL无法直接对JSON列建立索引,但通过生成列和函数索引的方式间接索引特定字段能够满足绝大多数场景。同时这种方式不仅适用于JSON,还适用于其它复杂或难以索引的模式。

2025-09-11 21:34:42 582

原创 面试官微笑发问:第100万页怎么查?我差点当场沉默…

到这儿,我们已经盘点了超大分页的优化思路。那面试的时候,怎么说才显得层次分明?先指出问题本质:MySQL 分页是“扫描+丢弃”,大页 offset 性能差。再讲 SQL 优化用索引替代 offset子查询+join(延迟关联)游标式分页(基于主键/时间)补充业务优化:限制页数、增加条件、下拉刷新。顺带提 MySQL 8.x 特性:窗口函数、CTE 等。这样回答下来,既有深度,又有广度,面试官一定会点头。

2025-09-11 21:31:32 630

原创 Mysql锁的内部实现机制浅析

虽然现在关系型数据库越来越相似,但其背后的实现机制可能大相径庭。实际使用方面,因为SQL语法规范的存在使得我们熟悉多种关系型数据库并非难事,但是有多少种数据库可能就有多少种锁的实现方法。Microsoft Sql Server2005之前只提供页锁,直到2005版本才开始支持,乐观模式下允许实现行级别锁,在Sql Server的设计中锁是一种稀缺资源,锁的数量越多,开销就越大,为了避免因为锁的数量快速攀升导致性能断崖式下跌,其支持一种称为的机制,一旦行锁升级为页锁,并发性能就又回到原点。

2025-09-11 21:24:02 894

原创 数据库两大神器【索引和锁】

索引在数据库中是一个非常重要的知识点!上面谈的其实就是索引最基本1,最左前缀匹配原则。这是非常重要、非常重要、非常重要(重要的事情说三遍)的原则,MySQL会一直向右匹配直到遇到范围查询(>,<,BETWEEN,LIKE)就停止匹配。3,尽量选择区分度高的列作为索引,区分度的公式是 COUNT(DISTINCT col) / COUNT(*)。表示字段不重复的比率,比率越大我们扫描的记录数就越少。4,索引列不能参与计算,尽量保持列“干净”。

2025-09-10 20:51:42 939

原创 面试官:MYSQL自增id超过int最大值怎么办?

刚刚才在掘金刷到一篇文章《字节面试:MySQL自增ID用完会怎样?》,评论区都说有没有用完的,结果我真用完了,就感觉有点不可思议。总结一下有几个原因吧:1、数据量确实很大,有5E多数据,然后并发也很高。其实当初他们设计的时候也预料过这个问题,所以设了个int长度50,但是这个长度没起作用- -所以设计数据库的时候一定要做好,不然几亿数据改个字段类型要2天2、数据库的自增id策略选了高性能策略,导致并发高的时候id间隔很大。30个消费者异步处理,10条数据大概用了100个id的间隔,消耗太快了。

2025-09-10 20:40:09 352

原创 MySQL-主从同步一致性+如何监控

数据一致性是指在一个系统中,数据在不同的部分、不同的时间点,以及不同的操作之间保持一致的状态。数据一致性:确保数据的完整性意味着数据在存储和传输过程中没有被损坏或丢失。这包括数据的准确性、完整性和有效性。例如,在一个电商系统中,商品的库存数量应该是准确的。如果一个用户购买了一件商品,库存数量应该相应地减少。如果库存数量显示不正确,就会导致数据不一致。事务一致性:在数据库系统中,事务是一组操作的集合,这些操作要么全部成功执行,要么全部回滚。

2025-09-10 20:32:19 236

原创 Redis的缓存问题——缓存穿透、缓存击穿、缓存雪崩以及多级缓存架构设计

Big Key 是指 key 对应的 value 所占的内存空间比较大,例如一个字符串类型的 value 可以最大存到 512MB,一个列表类型的 value 最多可以存储 232−12^{32}-1232−1 个元素。如果按照数据结构来细分的话,一般分为字符串类型 Big key 和非字符串类型 Big Key。字符串类型:体现在单个 value 值很大,一般认为超过 10KB 就是 Big Key,但这个值和具体的 OPS 相关。非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多。

2025-09-09 20:29:26 785

原创 Redis的设计与实现——内部数据结构、IO模型、内存淘汰/过期策略

新算法会维护一个候选池(大小为 16),池中的数据根据访问时间进行排序,第一次随机选取的 key 都会放入池中,随后每次随机选取的 key 只有在访问时间小于池中最小的时间才会放入池中,直到候选池被放满。当然如果这个数组一直不变,那么哈希冲突会变很多,这个时候检索效率会大打折扣,所以 Redis 就需要把数组进行扩容(一般是扩大到原来的两倍),但是问题来了,扩容后每个哈希桶的数据会分散到不同的位置,这里涉及到元素的移动,必定会阻塞 I/O,所以这个 ReHash 过程会导致很多请求阻塞。

2025-09-09 20:20:47 894

原创 Redis是如何高效管理有限内存的?

Redis 内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 个值 (此值可配置) ,然后淘汰一个最少访问的key,之后把剩下的key暂存到一个池子中,继续随机取出一批key,并与之前池子中的key比较,再淘汰一个最少访问的key。以此循环,直到内存降到maxmemory之下。

2025-09-09 20:09:11 737

原创 Spring 三级缓存和循环依赖介绍

循环依赖(Circular Dependency):两个或多个 Bean 相互依赖。Spring 为了解决单例 Bean 的循环依赖问题,设计了三级缓存机制singletonObjects:一级缓存,已完全初始化的 Bean;earlySingletonObjects:二级缓存,正在初始化过程中的早期引用;singletonFactories:三级缓存,用于生成早期引用的工厂(lambda 形式)。只有当 Bean 是通过无参构造器创建(即不是构造器注入),并且注入方式为setter 或字段注入。

2025-09-08 21:45:24 844

原创 这些 Spring Boot 默认配置不改,迟早踩坑

Spring Boot 的“约定优于配置”确实省心,但省的是开发者的心,不是系统的责任。每一项默认配置背后,其实都藏着设计者的假设和权衡,而这些假设,在我们的业务场景中也许未必成立。这些坑我几乎都踩过,有些甚至反复踩了好几次。愿你读到这里,能少走几步弯路,可不能拿生产事故去交学费。提前优化配置,是对系统负责,也是对自己负责。最后想说句题外话——最近又忙起来了,又是“降本增效”搞的,好像这个词永远不会消失。有时候总忍不住想,什么时候才能“增本增效”?也许在经济下行的当下是没有可能了。

2025-09-08 21:42:51 578

原创 Spring Boot 应用中的多层缓存实践

通过实现 Spring 的 CacheManager 接口与 Cache 接口,我们可以完全掌控双层缓存的读写、同步与过期逻辑,实现“一次注解,双向同步”。// 依赖注入一级缓存管理器(Caffeine)与二级缓存管理器(Redis)// 获取缓存实例:返回自定义的双层缓存实现@Override// 获取所有缓存名称(与一级缓存保持一致)@Override// 采用 record 类型简化代码(JDK 16+ 支持),也可使用 class 实现。

2025-09-08 21:39:27 745

原创 大模型应用开发03-结构化输出与智能导入

我们在开发很多业务系统时,经常需要使用到通过上传文件,将文件内容导入到系统数据库的需求。一般情况下,为了可以正常导入数据,需要用户首先下载模板,然后按照模板填写数据再进行导入。这个时候用户的工作量就大了,他可能有很多数据存在了一张excel表中,但是跟提供的模板不一致,需要将原来表中的数据再腾挪到新的模板文件中,这是这个功能非常耗时的点。那么通过接入大模型,让大模型来处理文件内容,并将结果按照指定的格式进行格式化输出就可以消除到导入数据需要按照模板填写的巨大工作量。

2025-09-05 20:27:23 400

原创 大模型应用开发02-如何在网页中嵌入3D人物

要实现的效果如图所示:左侧是插入的3D人物,类似AI智能助手的角色。我们这里是通过React做的。

2025-09-05 20:19:27 366

原创 大模型应用开发01-打造智能聊天助手

输入框还有上传和语音按钮,一个用于上传文本,作为提问的上下文,一个用于支持语音输入,这些都是可以实现的,感兴趣的评论区留言,考虑出一篇来介绍。Enjoy!

2025-09-05 20:16:35 745

原创 在 Spring中,用id和name命名Bean,究竟有什么区别?

如果你的Bean需要一个明确的、唯一的标识,请用id命名Bean如果需要灵活性、多个名称,请用name命名Bean其实在Spring的现代版本中,它们的差别已经很小了,最关键是保持一致性好的命名是成功的一半,在 Spring世界里,id和name就像你的左右手,关键是要知道什么时候用哪只!

2025-09-04 21:35:17 415

原创 Spring生态全家桶:从基础到微服务的演进与关联是什么?

Spring生态从基础的IoC容器到复杂的微服务治理,形成了一套完整的技术体系。理解Spring、Spring MVC、Spring Boot和Spring Cloud的区别与联系,有助于开发者在实际项目中做出合理的技术选型。无论是小型单体应用还是大型分布式系统,Spring生态都能提供对应的解决方案,这也是它能在Java后端开发中长盛不衰的核心原因。

2025-09-04 21:30:16 922

原创 Spring生态的缓存方案:多级缓存架构实现(Caffeine + Redis)

场景推荐注解参数组合示例读多写少@Cacheable写后立即读@CachePut事务性数据更新批量数据操作高并发热点数据@Cacheablesync=true。

2025-09-04 21:21:58 702

原创 高效的Java任务执行:SafeExecutor工具类的设计理念与应用

在开发中,异常处理和任务执行是两个关键的挑战。为了简化异常处理和任务执行,设计并实现了一个名为 SafeExecutor 的工具类。该工具类提供了一组方法,用于安全地执行同步和异步任务,并在发生异常时进行处理。本文详细介绍了 SafeExecutor 的设计与实现,以及与之配套的两个接口 VoidCallable 和 CallableWithParams。

2025-09-03 21:31:39 668

原创 Java 死锁的四大原因详解及代码实现

固定锁顺序:统一锁的获取顺序,避免循环等待。减少锁粒度:使用细粒度锁或非阻塞数据结构(如ConcurrentHashMap)。开放调用:不在同步块内调用外部方法。超时机制:通过tryLock或Semaphore设置超时,避免无限等待。通过合理设计锁的获取顺序和资源管理,可有效避免死锁问题。

2025-09-03 21:28:17 830

原创 克服 Java 枚举陷阱:线程池队列共享问题的解决之道

在实际的多线程开发中,合理设计线程池是提升系统性能和任务管理的重要手段。然而,如果线程池的设计不够严谨,可能会引发一些隐晦的问题,尤其是线程池之间的隔离性和任务管理的问题。本文将结合上述代码,深入分析 线程池共享 BlockingQueue 问题的原因、排查过程及解决方案。在多线程开发中,队列共享问题可能导致任务混乱、任务丢失以及线程池隔离性丧失。通过分析代码,可以发现问题的根源在于 BlockingQueue 的静态实例化。通过动态生成独立队列或限制线程池实例数量,可以有效解决此问题。

2025-09-03 21:23:42 586

原创 SpringBoot中4种控制器返回值处理技巧

在实际项目中,这些技巧往往会结合使用。例如,可以在RESTful API中同时使用统一响应格式和ResponseEntity,既提供标准化的响应体,又能灵活控制HTTP状态码。选择合适的返回值处理方式,不仅能提高代码质量,还能改善前后端协作效率。

2025-08-31 20:35:11 299

原创 Spring事务失效的8个经典陷阱

Spring事务是一个强大的特性,但也隐藏着许多陷阱。理解这些陷阱的原理,可以帮助你更好地利用Spring事务,构建更加健壮的应用程序。

2025-08-31 20:28:50 663

原创 SpringBoot模块化开发的5种组织方式

Bean@Bean@Bean@Bean# 在应用配置文件中@Service@AutowiredSpringBoot模块化开发提供了多种组织方式,每种方式都有其适用场景和优缺点。选择合适的模块化策略应考虑项目规模、团队结构、业务复杂度和未来演进方向。最重要的是,模块化应该是渐进式的过程,随着项目的发展不断调整和优化模块结构,以适应不断变化的业务需求和技术环境。

2025-08-31 20:22:13 930

原创 Go 语言未来会取代 Java 吗?

Go 会取代 Java 吗?短期内不会,但长期会形成互补格局。Java 的不可替代性:企业级成熟度、Android 生态、大数据框架,这些优势难以撼动。Go 的不可阻挡性:云原生、高并发、AI 集成,这些领域 Go 正在建立新标准。掌握 Go 的核心优势:学习 Goroutine 编程、云原生架构,参与开源项目(如 Kubernetes)。深耕 Java 的护城河:研究虚拟线程调优、Spring Boot 3.2 新特性,提升企业级架构能力。拥抱混合开发。

2025-08-30 21:28:03 629

原创 虚引用GC耗时分析优化(由 1.2 降低至 0.1 秒)

线上应用频繁出现超时告警(超时时间 1 s): getUiToken 接口异常状态码“-1”出现4037次(失败描述:业务请求异常),超过阈值50,协议:http,为服务端接口。当前失败率为0%,当前平均响应时间为150ms,TP50为2ms,TP90为896ms,TP99为1024ms,TP999为1152ms,MAX为1280ms。

2025-08-30 21:24:14 623

原创 从一个程序员的角度告诉你:“12306”有多牛逼?

怎样保证高并发下,正确的扣库存,还能快速的响应用户请求?在本地减库存以后,如果本地有订单,我们再去请求 Redis 远程减库存,本地减库存和远程减库存都成功了,才返回给用户抢票成功的提示,这样也能有效的保证订单不会超卖。完整的订单系统还有订单进度的查看,每台服务器上都有一个任务,定时的从总库存同步余票和库存信息展示给用户,还有用户在订单有效期内不支付,释放订单,补充到库存等等。从上面的介绍我们知道用户秒杀流量通过层层的负载均衡,均匀到了不同的服务器上,即使如此,集群中的单机所承受的 QPS 也是非常高的。

2025-08-30 21:16:48 589

原创 3s → 30ms!SpringBoot树形结构“开挂”实录:一次查询提速100倍

*** 多级缓存管理器:L1(Caffeine) + L2(Redis)*/@Bean@Primary.expireAfterWrite(10, TimeUnit.MINUTES) // L1缓存10分钟过期.entryTtl(Duration.ofHours(2)) // L2缓存2小时过期.build();/*** 自定义多级缓存管理器*/// 本地缓存// 分布式缓存@Override@Override/**

2025-08-29 21:42:31 694

原创 SpringBoot 在线依赖包漏洞扫描仪,一键发现潜在安全漏洞

自动收集依赖,无需人工干预匹配漏洞库,输出 CVE 编号 + 漏洞描述提供漏洞详情信息,避免知道有问题但不知如何解决可视化展示,直观易懂。

2025-08-29 21:21:15 540

原创 SpringBoot 程序 CPU 飙升排查:自制「方法级采样火焰图」

通过上面的方式,我们用极少的代码在 SpringBoot 程序里实现了一个轻量级的CPU 火焰图采样器。1、不依赖第三方大工具,随项目自带2、方法级别可视化,能快速定位 CPU 热点;3、火焰图展示直观、体验好;当然,这种方案有局限:1、采样频率过高会带来一定开销2、精度比不上专业的 async-profiler3、火焰图数据需要定期清理,避免内存膨胀。

2025-08-29 21:17:39 790

原创 给前端小白的11个建议(少走弯路)

作为一个前端工程师,一路走来踩过许多坑。希望我的经验能让你少踩些坑,在编程的路上走的更顺些!

2025-08-26 21:57:25 303

原创 JavaScript 的25个高级特性

很多前端同学写 JavaScript 写久了,会觉得语言特性都已经用得差不多了:函数、数组、对象、Promise……没什么新鲜感。但其实,JavaScript 还有不少被低估的语法和技巧。它们可能是规范里的冷门细节,可能是 ES6+ 新增的语法糖,也可能是一些看似奇怪但非常实用的特性。本文整理了,每一个都配有示例和讲解。

2025-08-26 21:52:48 625

原创 面试官问我,后端一次性返回十万条数据,前端应该怎么处理 ?

时间分片:使用requestAnimationFrame或setTimeout将渲染任务分割成小块,避免长时间阻塞主线程。组件懒加载:结合React.lazy()和Suspense实现组件级别的懒加载。:将大数据集切分为小段,逐步加载,避免一次性渲染大量节点阻塞页面。:将嵌套结构改为对象映射结构,提升访问效率、便于缓存和更新。:将任务拆分为小块分批执行,减少单次运算时间,避免卡顿。:将耗时计算任务交给子线程执行,避免阻塞 UI。Worker 线程代码(worker.js)主线程代码(main.js)

2025-08-26 21:47:46 448

原创 SpringBoot整合Flowable【03】- 通过Flowable-UI体验一个简单流程

对于第一次使用Flowable,我们先采用官方提供的flowable-ui进行模型的绘制,让各位读者可以感受到整个流程的运行变化,从而在后期的编码中不会感到迷惑,这也是我本次选择使用7.0版本以下的flowable的原因(前文提过:官方将7.0以上的版本已经移除flowable-ui)。

2025-08-25 20:40:52 916

空空如也

空空如也

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

TA关注的人

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