自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 EasyMail :使新邮件监听、邮件发送更简便

EasyMail 是一个基于 Spring Boot 和java-mail的应用级邮件服务框架,简化了java-mail的邮件监听方式,提供了完整的邮件发送和监听功能,增加丰富的重试机制,保障了连接的可靠性,解锁各种相关与邮件的业务。该框架采用模块化设计,支持多种发送策略、模板引擎、异步处理、新邮件注解驱动等高级特性,适用于各种企业级应用场景。

2025-06-30 16:03:03 1521

原创 如何使用java监听邮箱内容和发送邮件?

如何使用java监听邮箱内容和发送邮件?

2025-06-24 20:41:10 1381

原创 什么是索引下推?

低版本 “二次筛选” 的本质是 “历史设计取舍”。低版本 MySQL 出现 “引擎层只筛前缀、服务层二次筛选” 的问题,不是 “设计失误”,而是早期为了 **“多引擎适配”“架构简化”“降低维护成本”** 做出的合理取舍 —— 用 “可控的性能损耗” 换 “架构的灵活性和稳定性”。而 ICP 优化,是 MySQL 团队在业务数据量激增、性能需求升级后,对 “架构分工” 的一次动态调整:在不破坏核心解耦的前提下,让离数据更近的引擎层承担部分筛选职责,最终解决 “无效数据传输” 的痛点。

2025-08-26 16:01:14 724

原创 HashMap为什么要使用扰动函数?

将原始哈希值的高 16 位与低 16 位进行异或操作,可以充分利用哈希值的每一位信息,增加哈希值的随机性,减少哈希冲突,提高哈希表的均匀性和性能。

2025-07-04 16:44:54 937

原创 Java并发编程中的AQS是什么?

if (compareAndSetState(0, 1)) { // CAS尝试获取// 无需CAS,独占模式释放是安全的此实现展示了AQS的模板方法设计:子类只需定义资源获取/释放规则,排队、阻塞等复杂逻辑由AQS父类完成。AbstractQueuedSynchronizer(AQS)作为Java并发编程的基石级框架,其价值不仅体现在提供高性能同步工具,更在于它定义了一套可扩展的同步范式。通过state状态管理和CLH队列的精妙结合,AQS平衡了性能、公平性和灵活性三大核心需求。

2025-07-02 18:44:46 960

原创 Java 并发编程的 CAS(Compare and Swap)是什么?

并发库的“心脏”。

2025-07-02 18:33:40 994

原创 关于对ThreadLocal的一些疑惑

每个线程有一个,用于存储该线程中所有实例的值。每个实例在中作为键,其值存储在中。每个线程的可以包含多个不同的实例作为键,每个键对应一个值。

2025-07-01 16:12:57 378

原创 事务的四大特性是什么?它们的实现原理是怎样的?

原子性是指事务是一个不可分割的最小工作单位,事务中的操作要么全部成功,要么全部失败。如果事务中的任何一个操作失败,整个事务都会回滚到事务开始之前的状态。一致性是指事务执行前后,数据库的完整性约束没有被破坏。事务执行的结果必须使数据库从一个一致性状态转换到另一个一致性状态。隔离性是指并发执行的事务之间不会相互干扰。一个事务在执行过程中,其他事务不能看到该事务中间状态的数据。持久性是指事务一旦提交,其对数据库的改变就是永久的,即使系统发生故障也不会丢失。原子性:通过日志记录和回滚操作实现。一致性。

2025-07-01 16:06:33 988

原创 什么是分布式锁

分布式锁是构建可靠分布式系统的关键基础设施。理解其核心原理(互斥、超时/租约、容错)、主流实现方案(Redis/ZK/etcd)的细节与权衡、使用中的陷阱(时钟、GC、网络)以及最佳实践(唯一标识、续期、精炼临界区),是开发者必备的技能。没有完美的分布式锁方案,只有适合特定场景和容忍度要求的方案。未来,随着硬件、云服务、新协议和新架构的演进,分布式锁将继续朝着更高性能、更强鲁棒性、更易用和更智能的方向发展。

2025-06-30 16:22:24 1034

原创 java中的spi是什么东西

为框架扩展性提供标准化支持。其重要性在 JDBC、日志门面、微服务框架等领域尤为凸显。,运行时动态绑定 Logback/Log4j2 等实现。,其能力边界持续扩展。在云原生时代,SPI 机制有望与。Java SPI 在 20 余年的演进中证明了其。(如 Google AutoService)它通过约定优于配置的原则,实现。尽管原生实现存在性能与功能局限,但通过。打破双亲委派模型的限制,使核心库(如。(Spring Boot 的。MySQL JAR 包含。文件,避免手动编写配置。)能加载应用路径(如。

2025-06-30 16:11:08 702

原创 深入理解 B+ 树:数据库索引的脊梁

尽管面临 SSD、LSM-Tree 等新技术的挑战,B+ 树凭借其成熟性、稳定性和在特定场景(尤其是读密集、范围查询重要)下的持续优势,仍将是数据库系统中不可或缺的核心组件。它深刻理解磁盘随机访问与顺序访问的巨大性能鸿沟,通过精妙的结构设计(多路平衡、索引数据分离、叶子链表)将昂贵的随机 I/O 转化为高效的顺序 I/O 或大幅减少 I/O 次数。这是数据库实现中的复杂点之一。如果删除导致根节点只剩下一个子节点(且该子节点是内部节点或叶子节点),则删除根节点,使其唯一子节点成为新的根节点(树变矮一层)。

2025-06-30 15:58:57 1189

原创 深入理解 MVCC:数据库高并发的核心引擎

MVCC 是数据库领域一项经久不衰的关键技术。它通过维护数据的历史版本,为并发事务提供逻辑上隔离的数据库视图,从而在保证一定隔离性的前提下,极大地提升了数据库的并发处理能力和读性能。理解其核心原理(版本链、Read View、可见性判断)、优缺点、适用场景以及运维注意事项,对于设计高性能数据库应用、进行有效的数据库调优和故障排查至关重要。随着硬件发展和新型数据库架构(HTAP、分布式)的演进,MVCC 技术本身也在不断创新和优化,继续扮演着支撑海量数据高并发处理的幕后英雄角色。

2025-06-30 15:49:50 580

原创 深入理解synchronized:Java并发编程的基石与进化

通过CAS将Mark Word复制到锁记录,并指向锁记录指针。:第一个获取锁的线程将线程ID写入Mark Word。:单线程重复访问锁(如Servlet的init方法):轻量级锁自旋失败(默认自旋10次,JVM可调)synchronized不是简单的语法糖,而是。▶️ JVM将相邻的同步块合并为单个大同步块,(天然线程安全),有望彻底消除某些场景的锁需求。:从CPU缓存一致性(MESI)到OS线程调度。:一旦升级为重量级锁,无法回退到轻量级状态。:后续该线程进入同步块只需检查线程ID,

2025-06-26 12:56:05 513

原创 ConcurrentHashMap:Java高并发编程的哈希表利器

是 Java 并发编程库中一颗璀璨的明珠,其发展历程(分段锁 -> CAS+桶锁)是并发优化技术演进的生动教材。它通过精妙的设计(volatile读、CAS 尝试、桶锁、红黑树、协作扩容、分散计数),在保证线程安全的前提下,实现了极高的并发吞吐量,尤其适合读多写少的高并发场景。深入理解其设计哲学、版本差异、弱一致性本质以及原子方法的正确使用,是高效安全运用 CHM 的关键。尽管它已非常强大,在面对极端写冲突、极致内存优化或新兴硬件时,仍有持续优化的空间,展现了软件工程永无止境的追求。深入解释了。

2025-06-26 12:36:03 894

原创 深入理解HashMap:从数据结构到高并发战场

默认初始容量 16,如果已知要存 1000 个元素,默认负载因子下,需扩容到 2048,中间经历多次扩容。用空间 (多节点) 换时间 (高性能、高并发、大容量),用算法 (哈希、路由) 解决定位问题。过高 (如0.9) 导致冲突概率大增,链表/树变长,性能下降。,在冲突严重时 (如恶意攻击,大量键故意产生相同哈希),性能急剧下降。让不同的键尽可能均匀地分布在数组的各个位置(桶),减少冲突。实现更细粒度的并发控制,性能远高于同步的 HashMap。优化分片策略,减少扩容/缩容时的数据迁移量。

2025-06-26 11:50:45 1038

原创 千万级动态数据毫秒级查询优化:无Redis的高性能架构设计

近 N 天/月/年数据 (如近1年)。

2025-06-26 11:28:09 997

原创 实时监听qq邮箱新邮件

支持多种邮箱,只需要将邮箱配置设置为对应的厂商就行了。

2025-04-21 17:35:14 806 2

原创 docker启动rocketmq-dashboard报错:library initialization failed - out of memoryAborted (core dumped)

临时调整在启动容器时,可以通过docker run命令添加--ulimit永久调整编辑Docker的systemd配置文件[Service]ExecStart=

2025-04-15 10:58:38 393

原创 使用Spring Boot Admin搭建钉钉机器人通知功能的小demo

进入admin-server模块的配置文件,按照之前生成的代码依次替换为自己的。这里需要启动自己的nacos服务,替换为自己的地址+端口。项目启动好后可以调用一下接口进行测试。群归属随便选一个就行,不影响。安全方式选择-加签,后面会用。在被监控项目加入配置。

2025-03-10 18:50:32 469

原创 部署在虚拟机的中间件无法连接本机的mysql

或者,如果你使用的是 Windows,可以通过服务管理器重启 MySQL 服务。在 MySQL 中,你需要为远程主机创建一个用户,并授予权限。这将授予该用户访问所有数据库和表的权限。如果只需要访问特定数据库,可以将。或者在 Windows 防火墙中添加规则,允许端口 3306 的流量。是 MySQL 服务器的 IP 地址。确保 MySQL 配置文件(通常是。是 MySQL 服务器的端口号。完成上述步骤后,尝试从远程主机。替换为你想要创建的用户名。替换为刚刚创建的用户名。

2025-01-30 21:46:07 245

原创 关于使用Gateway网关时,spring-boot-starter-web 引入的 tomcat与Gateway的netty发生冲突无法启动问题

spring-boot-starter-web 会引入 spring-boot-starter-tomcat,这使得你的应用在启动时会加载传统的 Servlet 容器。2.如果你在同一个应用中需要Spring MVC和Spring Cloud Gateway,你可以在你的application.yml或application.properties文件中将web应用类型设置为REACTIVE。1.如果不需要,从你的pom.xml中移除spring-boot-starter-web依赖。

2025-01-27 14:47:29 574

原创 布隆过滤器工具类封装及使用示例(google.guava版)

布隆过滤器只支持精准查询,所以需先确定使用环境。加入依赖注入完成后执行的方法。

2024-12-31 17:08:31 295

原创 解决springboot中new Data()与当前时间不同问题

在url字段的末尾加上 serverTimezone=Asia/Shanghai。

2024-12-27 12:09:54 182

原创 为什么mybatis-plus进行分页查询时向mapper中传入Page实例就可以完成分页查询

所以虽然在Mapper接口中我们只看到传入了Page对象,但实际上MyBatis-Plus的分页插件在底层帮我们完成了所有分页相关的工作。这就是为什么我们不需要在Mapper中手动处理分页逻辑的原因。

2024-12-23 21:12:49 447

原创 云端部署·前端请求跨域失败401错误问题

API 工具(如 Apifox)可以成功调用,而使用浏览器或是使用前端发送的url请求会报401错误失败,这是因为浏览器会先发送 OPTIONS 预检请求,而 API 工具直接发送 url 请求。所以项目部署至云服务器的时候前端项目发出的请求后端可能接收不了,以下方法可能解决问题。如果使用了拦截器,需要进行放行,并且增加相应的CORS 头。

2024-12-18 18:53:55 862

原创 解决前端传入时间格式数据时,后端400错误

前端向后端传入时间格式的数据时,后端如果没有进行对应字段的格式化,会报400错误,并且不好排查。需要的在后端的对象中进行时间格式化。可以正常进行业务流程。

2024-12-17 16:23:20 297

原创 谈谈Java中Lambda表达式?详细说说我对Lambda表达式的理解

Lambda表达式可以看作是匿名内部类的简洁替代,它使得代码更加简洁和易读。:Lambda表达式不能访问外部的局部变量,除非它们是final或effectively final(实际上是final,即在Lambda表达式创建后不再被修改)。Lambda表达式是Java语言的一个重要进步,它使得代码更加简洁、模块化,并且支持了函数式编程范式,为Java开发者提供了更多的编程选择和灵活性。:Lambda表达式可以与方法引用结合使用,方法引用提供了一种引用现有方法作为Lambda体的方式,使得代码更加简洁。

2024-09-15 17:20:51 331

原创 谈谈Java中有哪些用于数据存储的常用数据结构?他们分别都有哪些特点?详细说说我对这些数据结构的理解

Java中提供了多种用于数据存储的常用数据结构,它们各自具有不同的特点和用途。选择合适的数据结构对于提高程序性能和代码可读性至关重要。这些数据结构在 Java 中通常通过。

2024-09-10 09:03:16 244

原创 谈谈Java中IO流怎么分类?详细说说我对IO流的理解

Java中的IO流(输入/输出流)是一种处理数据输入和输出的方式。:Java IO流通过抽象类和接口提供了一组统一的操作方法,使得开发者不必关心底层数据源或目的地的具体类型。:Java IO流的设计利用了多态性,可以通过统一的接口调用不同的实现类,提高了代码的可复用性和可扩展性。Java IO流是处理文件和数据流的基础,掌握它们对于进行高效的数据输入输出操作至关重要。:Java IO流操作可能会抛出异常,通常需要进行异常处理,以确保程序的健壮性。:Java IO流提供了检查流的可读性和可写性的方法,如。

2024-09-09 18:05:53 711

原创 谈谈Java中有哪些常见的异常?详细说说我对Java中异常处理的理解

异常处理是 Java 程序中非常重要的一部分,它可以帮助我们处理程序运行时可能出现的各种问题,确保程序的健壮性和稳定性。通过合理地使用异常处理机制,可以使 Java 程序更加健壮,提高程序的可维护性和用户体验。: 记录异常信息对于调试和监控程序非常重要,应该使用日志框架而不是简单的打印语句。: 创建自定义异常可以让异常处理更加清晰和具体,使得错误更容易理解和处理。: 方法可以选择捕获异常并处理它,或者继续向上抛出,让调用者来处理。: 当一个异常的产生是由于另一个异常引起的,可以使用。块来捕获和处理异常。

2024-09-03 19:54:16 565

原创 谈谈Java中OOP包含哪些知识点和我对这些知识点的理解

封装是将数据(属性)和代码(方法)捆绑在一起的过程,并隐藏内部细节,只提供必要的接口。在 Java 中,多态性可以通过方法重载(同名方法在同一个类中有不同的参数列表)和方法重写(子类覆盖父类的方法)来实现。类是对象的蓝图或模板,它定义了对象的状态(属性)和行为(方法)。接口和抽象类:接口和抽象类都是定义规范的方式,但接口更侧重于行为的规范,而抽象类可以包含一些实现细节。抽象:抽象允许我们定义只有接口没有实现的类或方法,这有助于创建灵活和可扩展的代码。类和对象:类是创建对象的模板,对象是类的实例。

2024-09-03 19:47:44 174

原创 对java泛型的理解

Java 泛型是在 Java 5 中引入的一个特性,它允许在编译时提供类型安全检查,同时保持代码的灵活性和复用性。泛型的本质是对类型参数化,这意味着你可以编写操作任意类型的代码,而不需要在代码中硬编码特定的类型。: 尽管 Java 的泛型是不变的,但可以通过通配符和边界来实现一定程度的协变和逆变。: 泛型方法可以在方法级别定义类型参数,这使得方法可以操作任意类型的数据。: 泛型类可以使用类型参数来定义,这样你就可以创建泛型集合、泛型数组等。: 泛型接口可以定义泛型方法,并且可以有多个类型参数。

2024-09-03 19:20:50 198

空空如也

空空如也

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

TA关注的人

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