自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小健学Java的博客

小健学Java的博客

  • 博客(41)
  • 收藏
  • 关注

原创 深入设计模式之「外观模式」:如何为复杂子系统提供统一入口?

客户端无需了解灯光/窗帘/投影仪等子系统的顺序与操作细节,只需调用 startMovieMode(),系统自动完成所有操作。客户端,仅通过 Facade 接口调用,无需了解子系统的复杂实现。改变子系统实现不会影响客户端,只需调整 Facade 即可。如果客户端只依赖 Facade,无法使用子系统的高级功能。外观模式通过引入一个统一接口,隐藏多个子系统的复杂性,子系统类,提供实际的业务功能,但不直接暴露给客户端。打交道,背后细节由 Facade 统一协调,外观类,对外提供统一接口,内部协调多个子系统。

2025-04-13 08:30:00 736

原创 深入设计模式之「装饰器模式」:如何在不修改原类的前提下,灵活扩展对象功能?

相比继承的“编译时增强”,装饰器提供的是“运行时增强” —— 将一个对象“包装”进一个装饰器类中,实现功能的扩展、叠加、修改。装饰器模式是一种强大的结构型模式,适合在不改变原有代码的前提下,为对象添加“可插拔”的功能。装饰器和被装饰者实现同一接口,装饰器内部持有被装饰者引用,并调用其方法。⚠️ 装饰器适合功能“独立、可插拔”的场景,避免为了架构而架构。外观上相似,目的不同(代理是控制访问,装饰是增强功能)具体装饰器,实现附加功能,再调用被包装对象的方法。✅ 装饰器模式通过“组合 + 包装”,实现功能。

2025-04-12 07:30:00 605

原创 深入设计模式之「组合模式」:如何优雅地处理树形结构对象?

客户端无需关心是文件还是文件夹,只需要调用 show(),容器节点会自动递归其子节点完成行为。如果某些节点只能读、不能写,统一接口无法表达不同角色权限,需额外机制处理(如权限控制层)。组合模式是处理树形层级结构的利器,它让我们用统一的方式处理对象和组合结构,显著提升了系统的。⚠️ 文件本不应包含子节点,但接口中有 add() 方法,被迫实现空逻辑,违反单一职责。这意味着,无论你处理的是一个对象,还是一组对象的组合,容器节点,持有子节点列表,递归地执行子节点的行为。无论是单个文件,还是整个文件夹组合,

2025-04-11 10:00:00 1092

原创 深入设计模式之「桥接模式」:如何让系统灵活应对“两个维度的变化”?

只有一个产品维度(比如一个图形库),仅有一个 RenderEngine。✅ 桥接模式通过“组合代替继承”,将这些变化维度拆开,结构更清晰、扩展更灵活。本质上,桥接模式是两个维度的组合:一个负责抽象行为,一个负责实现细节。桥接模式将遥控器类型与电视品牌解耦,让它们可以任意组合,无需类爆炸。相比直接继承,多了一个接口和多个组合类,新手阅读理解成本略高。,通过“桥接”连接,使得这两个维度可以灵活组合、解耦演进。拆分后,需要同时管理抽象层和实现层,代码数量增多。的强大工具,它用组合方式代替继承,提升了系统的。

2025-04-10 10:00:00 846

原创 深入设计模式之「适配器模式」:如何让“插头不兼容”的系统顺畅协作?

假设你原本的系统接口是 Target,但你现在想接入某个 SDK(它只有 specificRequest() 方法),无法直接使用。它优雅地隔离了“调用者”和“被调用者”之间的差异,避免侵入式修改,有效提升系统兼容性和灵活性。但请注意,适配器滥用会让系统结构臃肿、逻辑分散,因此适当封装、统一命名、归档适配器十分重要。出国旅行时,你的手机充电器是扁头插头 🇨🇳,但酒店插座是圆孔 🇪🇺,怎么办?若接口种类多,适配器数量可能爆炸,代码维护成本升高。希望在不破坏现有代码的基础上,兼容新旧接口。

2025-04-09 10:00:00 1067

原创 深入设计模式之「原型模式」:如何高效复制对象?

🔁 它通过复制而不是重新 new,提升了系统性能、提升了构建效率,但也必须注意。在游戏中,每次创建玩家角色时,如果都从头设置所有技能、装备、等级,非常低效。如需Java面试题资料,可关注公众号:小健学Java,回复“面试”即可获得!🚫 在数据结构不稳定、对象小而轻、构造可变时,应优先使用建造者或工厂。这时候,与其每次都“从零构造”,不如先准备一个“原型对象”,通过。方式二(原型模式):复印去年的年报模板,改个数据,一分钟完成。方式一(传统构造):从空白页开始写,每次都要调格式、调结构。

2025-04-08 10:00:00 754

原创 深入设计模式之「建造者模式」:解决构造复杂对象的痛点

在高频场景中构建对象,例如 JSON 解析构造 UserProfile,对象多、字段小,用建造者反而拖慢速度。建造者模式:就像你点一个套餐,服务员一步步问你:要不要汤?普通构造函数:就像你去餐厅点菜,一口气说出所有菜名,错一个都麻烦。大量批量构建小对象时,建造者中间对象反复创建,影响 GC 压力。某些字段若必须初始化,建造者也需要手动校验,否则容易遗漏。构造参数过多,位置易错,字段混淆,阅读性差,维护代价高。建造者模式最适合“对象参数众多,构建步骤复杂”的场景。构建复杂对象,参数种类多且结构不稳定。

2025-04-07 12:00:00 929

原创 深入设计模式之「工厂模式」:什么是工厂模式?该如何使用?

你开发一个跨平台桌面应用(支持 Windows / Mac / Linux),使用抽象工厂创建不同风格控件,但 UI 突然要求“新增滑动条组件”,结果每个产品族都要实现一套 Slider 系列,实现成本大幅上升。你在写一个图形渲染引擎,每种图形(Circle、Square、Triangle)都用一个 Factory 实现,结果光工厂类就有 20 个,新人很难理清结构。当系统需要引入更多“产品”时,直接 new 的方式必须修改原有逻辑,而工厂模式允许你通过新增类实现扩展,

2025-04-06 10:00:00 981

原创 深入设计模式之「单例模式」:什么是单例?怎么写才优雅?

由于是高并发环境,两个线程同时判断 instance == null,结果各自都 new 出一个实例,日志写入出现错乱。假设你在开发一个大型系统,定义了 ConfigManager 使用单例加载配置文件,结果由于饿汉式写法,它在系统启动时即加载文件,哪怕后续根本没使用这个模块,浪费了 500MB 的内存。在一个高频使用的工具类中,比如缓存服务 CacheManager,单例访问非常频繁。结果你加了同步,导致并发性能急剧下降,吞吐量下降 30%。最终你以为日志是集中记录,其实是分开写的,分析出了大问题。

2025-04-05 10:00:00 1192

原创 一文带你了解JDK中的虚拟线程

虚拟线程的引入为 Java 的并发编程带来了新的可能性,极大地提升了高并发应用的开发效率和系统性能。通过理解其实现原理和优势,开发者可以更好地利用这一特性,构建高效、可扩展的 Java 应用程序。

2025-04-04 10:00:00 1105

原创 一致性协议Raft与Kafka中的KRaft

KRaft 模式通过引入 Raft 共识算法,简化了 Kafka 的架构,减少了对外部依赖的需求。通过事件驱动和单线程处理机制,控制器能够高效地管理集群的元数据和状态变更。同时,引入 Timeline 数据结构,确保了在领导者切换时内存状态的一致性和可靠性。这种设计提高了 Kafka 集群的一致性和高可用性,适应了更大规模的集群管理需求。开源一个纯AI生成的健身记录App,如需源码,可关注公众号:小健学Java,回复“健身”即可获得!

2025-04-03 12:00:00 934

原创 Redis高级特性:深入剖析内存管理

内存碎片是指由于内存分配和释放不均衡,导致系统中的可用内存无法被有效利用的现象。在 Redis 中,由于数据结构的动态变化、不同数据类型的存储方式以及底层内存分配器的特性,都会导致内存碎片的产生。外部碎片(External Fragmentation):Redis 释放的内存块大小不一,导致无法高效地重新分配。内部碎片(Internal Fragmentation):Redis 分配的内存块大于实际数据所需的空间,造成浪费。Redis 作为一个基于内存的数据库,需要有效地管理和回收内存,以保证高效运行。

2025-04-02 08:00:00 1848

原创 Redis与MySQL数据一致性方案详解

Redis与MySQL数据一致性是指在同时使用这两种数据库时,确保两者存储的同一份数据在逻辑上保持同步,避免出现数据差异的问题,Redis 作为缓存层,MySQL 作为存储层,如何保证两者数据一致性是一个重要的问题。Cache Aside 方案是最经典的缓存策略,适用于读多写少的场景。高并发场景下,多个线程可能同时更新数据库和缓存,引发顺序错乱(如先删缓存后更新DB时,其他线程可能在DB更新前读取旧值并重新写入缓存)。如果缓存未命中,Redis 会自动从 MySQL 加载数据,并写入缓存,随后返回数据。

2025-04-01 08:00:00 1347

原创 Redis分布式锁原理解析与实战代码

Redis分布式锁的实现方案,提供库存超卖实战示例代码

2025-03-31 07:30:00 1080

原创 Redis 常见问题解析:缓存穿透、缓存击穿、缓存雪崩与缓存抖动

假设一个高并发的电商平台,秒杀商品的库存信息频繁更新,每次更新都会使缓存失效,导致所有请求短时间内都去查询数据库并重新构建缓存。当缓存数据过期后,在短时间内大量请求直接落到数据库,导致数据库负载急剧上升,甚至可能宕机。如果数据库查询后发现数据不存在,我们可以将 NULL 结果写入缓存,并设置较短的过期时间(如 5 分钟),防止频繁查询同一不可用数据。假设一个电商系统中,用户查询商品详情时,系统首先会去 Redis 缓存查询,若缓存未命中,则查询数据库。,导致所有请求直达数据库,可能导致数据库崩溃。

2025-03-30 10:00:00 935

原创 doris 数据倾斜怎么解决?

doris数据倾斜问题处理方案

2025-03-29 14:58:09 601

原创 Redis高可用方案详细解析

本文将详细介绍 Redis 的高可用方案,包括主从复制、哨兵模式、集群模式以及第三方方案,并深入解析其工作原理、适用场景、实现方式及完整代码。:当从节点第一次连接主节点,或者主节点复制缓冲区(backlog)中的数据不足以提供增量数据时,触发全量同步。:基于 VIP(虚拟 IP)实现 Redis 高可用,主节点故障时,VIP 迁移到新的主节点。从节点启动时,通过 replicaof 指定主节点,并向主节点发送 PSYNC 命令。通过 replicaof 命令设置从节点,从节点自动同步主节点数据。

2025-03-29 14:57:23 1512

原创 Redis持久化全攻略,RDB与AOF

Redis 是一个高性能的内存数据库,但其数据默认存储在内存中,服务器宕机或重启会导致数据丢失。为了保证数据的持久性,Redis 提供了多种持久化机制,包括 RDB(Redis Database File)、AOF(Append Only File)以及混合持久化(RDB+AOF)。本文将深入讲解 Redis 持久化机制的含义、底层实现、源码解析、使用场景、优缺点及其对比。Redis 作为缓存数据库,默认数据存储在内存中,但如果 Redis 进程崩溃或者服务器重启,数据将会丢失。

2025-03-28 13:38:45 1000

原创 Redis的LRU和LFU策略与底层实现

对于短时访问的热点数据,LRU 是一个更好的选择,而对于长期稳定的高访问数据,LFU 更能保证缓存的有效性。在高性能缓存系统中,存储容量通常是有限的,而请求的数据量是无限的,因此需要制定合理的策略来决定哪些数据应该被淘汰,以确保缓存空间的高效利用。LFU 是一种基于访问频率的淘汰策略,其核心思想是:如果某个键的访问频率很低,则该键可能在未来也不会被访问,因此可以优先淘汰。LRU 是一种基于时间的淘汰策略,它的核心思想是:如果某个键长时间未被访问,则该键可能在未来也不会被访问,因此可以优先淘汰。

2025-03-27 16:47:30 1201

原创 最全的Redis概念解析,从入门到精通

最全的Redis概念解析,从入门到精通

2025-03-26 13:32:13 832

原创 分布式系统的“稳定密码”——幂等性,你知道多少?

幂等性是分布式系统设计中的关键概念,确保操作的幂等性可以提高系统的可靠性和一致性。通过结合业务需求,选择合适的幂等性方案,可以有效防止重复操作带来的问题,提升用户体验和系统稳定性。:如果幂等性键不存在,则在Redis中设置该键,值为IN_PROGRESS,并设置过期时间为10分钟,防止长期占用内存。利用缓存(如 Redis)存储已处理的请求标识,在处理请求前,先查询缓存,判断请求是否已处理。通过上述实现,确保了在高并发场景下,订单创建接口的幂等性,防止重复提交导致的数据不一致问题。如果失败,删除该键。

2025-03-25 15:53:02 1018

原创 如何统计1分钟内连续登录失败超过3次的用户

在系统安全中,检测短时间内的连续登录失败至关重要。本文介绍几种方案,帮助你在 Java 代码中实现这一功能。

2025-03-24 17:25:54 1162

原创 RocketMQ 使用场景、实现方式及常见问题解析

RocketMQ 作为一款高性能、低延迟、分布式的消息中间件,被广泛应用于电商、金融、日志分析等场景。本文将详细分析 RocketMQ 的核心使用场景、具体实现方式、常见问题及解决方案,帮助开发者更高效地使用 RocketMQ。1. 异步解耦在微服务架构中,多个系统之间可能存在较强的耦合,例如订单系统需要同步通知库存系统、支付系统等。使用 RocketMQ 可以让调用方异步发送消息,减少系统之间的直接依赖,提高系统的响应速度和稳定性。示例:用户下单后,订单系统发送一条“订单创建成功”消息到 RocketMQ

2025-03-23 11:55:28 1070

原创 线上内存100%调查思路

遇到线上内存 100% 问题时,先检查 JVM 监控,确认是否是 Full GC、内存泄漏或缓存问题。使用 jmap、jstack、MAT 进行深入分析,排查大对象和内存泄漏情况。引入 Arthas 进行在线分析,无需重启服务即可排查问题,提高效率。优化缓存策略、调整 GC 参数,防止类似问题再次发生。线上环境内存占满是一个复杂的问题,但通过科学的方法和强大的工具,我们可以快速定位并解决问题!开源一个纯AI生成的健身记录App,如需源码,可关注公众号:小健学Java,回复“健身”即可获得!

2025-03-22 18:18:35 1196

原创 Spring 应用启动事件监听机制解析:@EventListener vs. ApplicationListener

今天我们就来深入解析 Spring 的事件监听机制,带你彻底弄清它们的工作原理!希望这篇文章能帮助你更深入理解 Spring Boot 的事件监听机制!在 Spring Boot 应用启动过程中,我们通常会在应用。注解,简化了事件监听的方式,无需手动注册监听器。Spring 提供了两种常见方式来监听。,@EventListener 更简洁高效。的 running() 方法,它会触发。来执行一些应用启动后的逻辑,比如。从源码层面来看,Spring 在。时执行一些初始化逻辑,比如。在实际开发中,我们通常使用。

2025-03-21 17:44:26 980

原创 深入解析 CAS(Compare And Swap):底层实现、源码解析与实战

CAS(Compare And Swap)是一种原子操作,用于在多线程环境下实现无锁同步。比较(Compare):检查当前值是否等于预期值。交换(Swap):如果相等,则更新为新值;否则,不执行更新,继续重试。CAS 操作的伪代码特点:非阻塞(Lock-Free):不使用锁,提高并发性能。乐观锁机制:假设大多数情况下无竞争,直接尝试更新,失败则重试。

2025-03-20 07:30:00 1023

原创 基于 Spring Boot 整合 LangChain4j:打造智能 AI 应用

本文介绍了如何基于。

2025-03-19 07:30:00 570

原创 CompletableFuture:异步编程的利器

是 Java 8 引入的异步编程解决方案,它属于包中的一部分,继承自Future接口,并提供了更加强大的异步任务管理能力。在传统的Future机制中,我们需要手动调用get()方法阻塞等待结果,而允许我们非阻塞地获取异步计算结果,同时提供了丰富的回调和组合操作。✅让异步编程更高效非阻塞执行链式调用异常处理任务组合能力在日常开发中,可以用它优化并发编程,提升应用的性能!🚀。

2025-03-18 07:30:00 470

原创 深入解析 Java 线程池:核心概念、参数、工作流程与实战

线程池(Thread Pool) 是 Java 并发编程中的一种优化机制,它通过 复用线程 来减少线程创建与销毁的开销,提高程序的执行效率,适用于 高并发任务处理。Java 线程池由 管理,其构造函数包含以下核心参数:核心参数解析参数作用核心线程数,即最小线程数,线程池初始化时默认不创建线程,只有任务到来时才创建线程池最大线程数,超过 后,任务队列满时才会创建新线程线程空闲存活时间,超过 的额外线程空闲超过该时间后会被销毁 的时间单位,如 存放

2025-03-17 17:12:04 813

原创 深入解析 AtomicInteger:底层实现、源码解析

在 Java 并发编程中,提供了一种高效的,用于解决多线程环境下的计数问题。它基于实现,能够在的情况下保证线程安全。本文将深入剖析 AtomicInteger 的底层实现,并与 LongAdder 进行对比分析。

2025-03-16 19:06:47 1110

原创 一文教你学会Java Stream API 常用函数

Java 8 引入了Stream API,提供了一种声明式编程方式,使数据处理更加简洁、易读。Stream 是一个数据流,它不存储数据,而是从数据源(如集合、数组等)获取数据并进行一系列操作。中间操作(Intermediate Operations):返回新的 Stream,可链式调用。终端操作(Terminal Operations):触发 Stream 计算,生成结果。中间操作filtermapflatMapsortedlimitskipdistinct终端操作forEachreduce。

2025-03-15 18:07:51 643

原创 深入解析:Java 中的锁 —— synchronized 和 ReentrantLock

它维护了一个。

2025-03-14 16:36:54 881

原创 深入解析:ConcurrentHashMap 的作用、原理、使用场景与源码分析

是 Java 并发包()中的一个高性能、线程安全的哈希表。它提供了高效的并发读写能力,使多个线程可以同时访问和修改数据,而不会出现数据不一致的问题。JDK 1.7 采用 Segment 分段锁,JDK 1.8 采用 CAS + synchronized 提高并发度。适用于高并发场景,如缓存、限流、计数等。相比HashMap和Hashtable,具有更优的性能和线程安全性。通过本文的解析,相信你对有了更深入的理解。在实际开发中,选择合适的数据结构,才能让应用具备更高的性能与稳定性!🚀🎯**

2025-03-13 16:36:18 855

原创 JWT 续签方案解析与实战

JWT 续签方案的选择取决于安全性和用户体验。短 Token + Refresh Token 方案是目前最常见的方式,兼顾安全性和可用性。如果需要更高的控制能力,可以结合 Redis 进行 Token 状态管理。希望本文对你有所帮助,欢迎留言交流!

2025-03-13 07:00:00 2291

原创 深入解析:Spring 过滤器、拦截器、切面(AOP)

过滤器是基于Servlet规范的组件,用于在请求到达Servlet之前或响应离开Servlet之后,对请求和响应进行预处理或后处理。安全控制:如身份验证、权限检查等。日志记录:记录请求信息、响应状态等。编码设置:统一设置请求和响应的字符编码。拦截器是Spring MVC框架提供的机制,用于在请求到达Controller之前或视图渲染之后,对请求进行拦截和处理。权限验证:在进入Controller之前验证用户权限。日志记录:记录请求的处理时间、访问日志等。请求修改:对请求参数进行预处理或修改。

2025-03-12 15:11:08 797 1

原创 你真的搞懂Spring Mvc的请求流程了吗?

(Model-View-Controller)框架以其清晰的架构和强大的功能,成为Java开发者构建Web应用的首选。如果餐厅(服务器)找不到你要的菜单(请求路径不匹配),迎宾员(DispatcherServlet)就会告诉你:「对不起,我们没有这道菜!:DispatcherServlet根据请求信息,借助HandlerMapping找到对应的处理器(Controller)。其中,getHandler()方法会遍历所有注册的HandlerMapping,找到与当前请求匹配的处理器。

2025-03-11 14:30:14 1105

原创 SpringBoot实现文件上传与下载

本文将详细介绍如何在Spring Boot中实现文件的上传与下载,并提供实战代码示例,帮助读者深入理解其实现原理。在 application.properties 或 application.yml 中设置文件上传的相关属性,例如上传文件的大小限制等。:如果你的应用涉及大量文件上传和下载,建议使用云存储(如 AWS S3、阿里云 OSS、MinIO)进行存储,减轻服务器压力。:防止用户上传恶意文件,如 .exe、.jsp 等。在控制器中定义处理文件上传的接口,接收前端传递的文件并保存到服务器指定位置。

2025-03-10 14:10:43 1131

原创 深入解析Spring Boot自动配置原理

通过对源码的解析,我们了解到,Spring Boot 的自动配置机制主要依赖于 @EnableAutoConfiguration 注解,以及 META-INF/spring.factories 文件中的自动配置类列表。这些自动配置类通过条件注解,决定是否将特定的 Bean 注册到 Spring 容器中,从而实现按需配置,简化开发过程。为了解决这一问题,Spring Boot 引入了自动配置的概念,根据项目的依赖和运行环境,自动配置所需的 Bean,从而简化开发过程。

2025-03-09 16:16:22 1327

原创 深入解析 Spring 中的循环依赖

本文将详细探讨什么是循环依赖、其产生的原因、Spring 如何解决循环依赖,以及在实际开发中应如何避免或处理循环依赖。在为 Bean 填充属性时,如果发现需要依赖另一个尚未初始化的 Bean,Spring 会检查该依赖是否存在于缓存中。如果存在,则直接使用;通过这种机制,Spring 能够在实例化 Bean 时,提前暴露一个尚未完全初始化的对象引用,供其他 Bean 使用,从而解决循环依赖问题。对于某些情况下的循环依赖,可以在其中一个 Bean 的注入上使用 @Lazy 注解,延迟依赖注入,避免循环依赖。

2025-03-08 19:13:15 1108

原创 Spring事务失效场景与解析

然而,在某些情况下,开发者可能会遇到事务失效的问题,导致预期的事务回滚或提交行为未能如期执行。在上述代码中,createOrder() 方法的事务传播行为是 REQUIRED,即如果外部已有事务,则加入外部事务,否则新建一个事务。然而,当在同一个类中进行自调用时,调用发生在目标对象内部,未经过代理对象,导致事务切面未被触发。在上面的代码中,placeOrder() 方法开启了一个新线程,但 processPayment() 方法没有事务,因为新线程不会继承原来的事务。

2025-03-07 15:44:22 1075

空空如也

空空如也

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

TA关注的人

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