- 博客(113)
- 收藏
- 关注
原创 什么是Kafka?
Apache Kafka是一款开源分布式事件流平台,主要用于构建实时流数据管道和处理大规模数据流。其核心功能包括发布订阅事件流、持久化存储和实时处理数据。Kafka采用发布-订阅模型,通过主题、分区、生产者和消费者等组件实现高吞吐量、高可扩展性和容错性。相比RabbitMQ,Kafka更适合大规模数据流处理,具有更高的吞吐量和持久性。为简化部署管理,可使用Amazon MSK托管服务,提供高可用Kafka集群和自动化运维支持。
2026-03-13 11:46:32
429
原创 AOP源码实现及分析
本文解析了Spring AOP的核心实现原理,主要包括三个关键接口:Advice定义增强方式,Pointcut筛选目标方法,Advisor组合两者。源码展示了MethodBeforeAdvice等通知接口和JdkRegexpMethodPointcut等切点实现。文章重点分析了ProxyFactoryBean如何通过初始化Advisor链、选择代理技术(优先JDK动态代理,必要时CGLIB)来生成代理对象,并详细说明了代理选择的判断条件(基于接口实现和proxyTargetClass配置)。整体呈现了Spr
2026-03-05 16:19:15
410
原创 滑动窗口VS滚动窗口
本文对比了Spark Structured Streaming中的两种窗口机制:滚动窗口(Tumbling Window)和滑动窗口(Sliding Window)。滚动窗口无重叠,每条数据仅属于一个窗口,适用于需要精确统计的场景(如财务计费、小时报表);滑动窗口有重叠,数据可能属于多个窗口,计算量更大但能更快响应变化,适合实时监控和异常检测。文章通过图示和代码示例(如window(timeColumn, windowDuration)与window(timeColumn, windowDuration,
2026-03-02 15:19:44
363
原创 个性化推荐系统全流程讲解附带源码地址
本文介绍了一个基于Spark+Kafka的实时用户行为分析与推荐系统项目。该系统采用DDD分层架构设计,实现了从用户行为事件生成、Kafka消息队列传输到Spark流式处理的完整链路。项目核心功能包括:通过模拟器生成随机用户行为事件,利用Kafka Producer异步发送消息,使用Spark Structured Streaming进行30秒滚动窗口聚合统计。技术栈包含Spring Boot、Kafka、Spark和DDD架构,重点解决了电商场景下用户行为数据的实时采集、聚合和特征提取问题。文档详细阐述了
2026-03-02 14:28:58
752
原创 基于双线程模型与内存池耗尽的Kafka生产端高并发最佳实践
摘要:本文深入剖析消息队列客户端实现原理,指出其本质是本地内存池与双线程协作机制。发送线程仅将数据存入记录累加器,后台Sender线程负责批量发送,通过配置参数(批次大小、延迟时间、内存缓冲等)在吞吐量与延迟间权衡。文章通过网关案例展示了参数配置不当导致的雪崩效应,强调必须设置合理超时熔断机制。最后提出企业级优化方案:严格限制飞行请求数保证顺序性,启用幂等配置,以及采用压缩算法置换带宽。这些参数不是简单配置,而是系统运行的物理法则。
2026-03-02 11:16:21
578
原创 COLA Ai状态机详解——这个状态机的意义是什么?以及我为什么需要创建它
摘要: 本文介绍了基于COLA架构开发的AI Agent状态机模块,旨在解决Spring AI工具调用中的黑盒效应、性能瓶颈和异常处理问题。通过状态机将AI执行流程拆解为THINKING、TOOL_CALLING等明确状态,结合Java 25的虚拟线程实现并行工具调用,并内置异常重试与监控机制。该设计使AI行为可观测、可控,支持复杂业务场景下的稳定运行,解决了传统方案中的串行性能差、错误透传和规则失控等痛点。(149字)
2026-02-28 11:36:27
665
原创 3500字拆解websocket,我们为什么需要它
WebSocket底层机制解析:从HTTP妥协到全双工通信的革命 本文深入剖析WebSocket技术的底层原理与设计哲学。文章首先揭示了HTTP协议在实时交互场景下的根本缺陷,包括轮询和长轮询带来的资源浪费问题。随后详细解读了WebSocket"借壳上市"的握手机制,特别是Sec-WebSocket-Key的设计初衷。在协议层面,重点分析了WebSocket的分帧传输、Ping/Pong心跳和防御性的掩码混淆机制。最后探讨了WebSocket对后端架构的颠覆性影响,包括NIO模型、epo
2026-02-25 12:16:45
755
1
原创 插入排序讲解
插入排序是一种基于整理扑克牌思想的排序算法,通过维护有序区和无序区,逐个将无序区元素插入到有序区的合适位置。其时间复杂度在最好情况下为O(n),最坏和平均情况下为O(n²),空间复杂度为O(1)。相比冒泡排序,插入排序更符合人类整理数据的自然思维,交换次数更少,适合小规模或基本有序的数据。该算法稳定且实现简单,常用于其他高级排序算法的子过程。面试时若被问及基本有序数据的排序选择,插入排序是理想答案。
2025-08-27 10:16:25
504
原创 冒泡排序详解
摘要: 程序员小巫分享了对冒泡排序的思考,认为它虽简单却是算法思维的启蒙。冒泡排序通过相邻元素比较交换,将最大值逐步“冒泡”到数组末尾,时间复杂度最坏O(n²),最好O(n),空间复杂度O(1)。其稳定性与直观性使其成为理解排序的基础,但实际项目中效率低,建议结合快排等高效算法学习。文章包含代码实现、复杂度分析及面试常见问题,强调冒泡排序作为算法入门的重要价值。
2025-08-27 09:55:41
393
原创 Redis事务与锁的顺序抉择:事务里加锁 vs 先锁再事务的“微妙差异”分享
Redis事务与锁的顺序选择对高并发场景有重要影响。先加锁再事务能确保全过程互斥,有效防止数据竞争;而事务内加锁由于延迟执行,无法在事务构建阶段提供保护,可能导致数据不一致。实际开发中推荐采用先锁后事务的标准模式,虽然会延长锁持有时间但能保证强一致性。在订单处理等关键场景中,错误的锁顺序可能引发超卖等问题,需特别注意锁的时效性与原子性操作的正确配合。
2025-08-22 09:48:39
1125
原创 Redis事务与MYSQL事务区别
Redis与MySQL事务对比摘要: Redis事务基于命令队列(MULTI/EXEC),提供简单原子性但缺乏完整ACID支持,适合高性能场景如秒杀。MySQL事务通过undo/redo日志实现完整ACID,支持复杂操作与回滚,但性能较低。关键区别在于Redis无隔离性保证,错误不自动回滚,而MySQL提供强一致性和完善的错误处理机制。实际应用中,Redis适合简单原子操作,MySQL适合需要严格一致性的业务场景,两者可结合使用发挥各自优势。
2025-08-21 15:30:09
929
原创 Redis的String底层原理,为什么高效
Redis的String底层原理远比表面复杂。本文深入分析了Redis String的实现机制,它采用SDS(Simple Dynamic String)结构而非C字符串,具备O(1)长度获取、空间预分配、惰性释放和二进制安全等优势。Redis会根据数据特点自动选择int、embstr或raw三种编码方式,其中int存储整数最省内存,embstr优化短字符串存储。文章还分享了实际使用中的坑点,如数字存储方式对内存的影响,并整理了常见面试问题的解答。通过源码研究和实践验证,揭示了Redis String的高效
2025-08-20 10:45:23
895
原创 同步与异步?从一个卡顿的Java服务说起
同步 vs 异步:从4秒到2秒的性能优化 本文通过一个Java服务接口优化案例,生动演示了同步与异步编程的区别。原接口同步调用两个外部服务(各耗时2秒),总响应时间长达4秒,导致服务器线程资源被大量占用。通过引入Java 8的CompletableFuture进行异步改造,将两个任务并行执行后,总响应时间优化至2秒(取最慢任务耗时)。关键改进在于使用supplyAsync()将任务提交到线程池异步执行,主线程仅需等待最终结果。这种异步模式显著提升了服务吞吐量和资源利用率,展现了异步编程在高并发场景下的优势。
2025-07-21 11:36:17
825
原创 重载与重写?别再死记硬背了!我用“点咖啡”和“做家务”的故事给你讲明白
【摘要】本文用生活化案例解析Java中重载与重写的核心区别。重载(Overload)如同咖啡店点单,在同一个类中方法名相同但参数不同(如orderCoffee()、orderCoffee("拿铁")),提供多种调用方式;重写(Override)则像父子做家务,子类继承父类方法后重新定义实现(如Son重写Father的doChores()方法),体现多态性。两者关键差异在于:重载发生在同类,参数必须不同;重写需跨父子类,参数必须相同。通过"点咖啡"和"做家务&
2025-07-21 11:35:17
1103
原创 致求职中“破防“的你:请别跟别人比,请跟昨天的自己比
摘要: 本文以作者朋友求职受挫的经历为引,结合自身面试失败后重新振作的故事,为求职焦虑者提供心态调整建议:1. 停止无效比较,避免过度关注他人引发精神内耗;2. 客观自我盘点,梳理已有技能与项目价值;3. 理解岗位匹配性,认清"合适比顶尖更重要"的招聘逻辑;4. 建立微小成就体系,通过可完成的小目标重获掌控感。文章强调求职不是与他人的竞赛,而是自我成长的旅程,鼓励读者以"每日进步一点"的积极心态突破困境。(149字)
2025-07-17 16:16:41
605
原创 皮尔逊算法,一文弄清个性化推荐的大腿
本文用生动形象的方式解释了皮尔逊相关系数的核心思想。通过"宽容哥"和"犀利姐"的电影评分案例,说明皮尔逊系数能有效去除用户间的评分尺度差异,专注于捕捉品味的相对趋势。文章详细拆解了公式的分子(偏好度协方差)和分母(归一化处理),并指出该系数的局限性(如对数据稀疏性敏感、仅反映线性关系等)。最后强调理解算法背后的直觉思想比单纯记忆公式更重要,皮尔逊系数的本质是"在比较前先去除个体偏见",这一思想在机器学习中具有广泛适用性。
2025-07-16 15:07:37
1019
原创 一文弄清Stream流
Stream流是Java 8引入的函数式编程特性,它通过声明式的链式操作简化集合处理。本文作者结合自身面试经历,深入剖析了Stream的核心优势:1)代码表达力强,逻辑清晰;2)惰性求值机制提升性能;3)支持并行处理。底层基于Spliterator和流水线操作实现,其中Spliterator负责数据拆分和迭代,而流水线操作则构建了一个延迟执行的垂直处理链。虽然Stream提高了代码可读性和开发效率,但在需要精细控制循环或极致性能的场景下,传统for循环仍具有优势。掌握Stream不仅意味着掌握新API,更是
2025-07-16 14:46:54
1249
原创 什么是转移概率矩阵
摘要:转移概率矩阵是马尔可夫链的核心工具,用表格形式展示系统从一个状态转移到另一状态的概率。以用户行为预测为例,通过分析历史行为数据(如浏览、点击、购买等状态间的转移频次),构建概率矩阵进行预测。该方法简单直观、计算高效,但存在无记忆性假设过强、数据稀疏性等局限。适用于短期行为预测场景,对冷启动问题可通过预设默认概率解决,进阶优化可考虑高阶马尔可夫链或深度学习模型。(149字)
2025-07-16 14:21:59
1312
原创 深拷贝和浅拷贝的区别
本文通过一个实际案例深入解析了Java中深拷贝与浅拷贝的区别。作者以自己踩过的线上事故为例,展示了浅拷贝如何导致共享数据被意外修改:当克隆包含可变对象(如List)的类时,浅拷贝仅复制引用而非对象本身,导致原对象和克隆对象仍共享同一数据。为解决此问题,文章详细介绍了深拷贝的实现方法,包括重写clone()方法、使用拷贝构造函数和序列化方式,强调对可变对象必须创建新实例。最后总结何时使用浅拷贝(仅含基本/不可变类型)和何时必须用深拷贝(含可变对象),并推荐拷贝构造函数作为最佳实践。全文通过"遥控器&
2025-07-15 17:02:29
808
原创 为什么Java更建议使用Builder模式编码?
Builder模式优雅地解决了复杂对象构建问题,避免了伸缩构造函数的混乱和JavaBean的不安全性。它通过分离构建过程与对象表示,使用链式调用实现流畅的API,并通过build()方法创建不可变的最终对象。这种方式既保证了对象创建的灵活性,又确保了对象状态的完整性和线程安全性,是构建复杂DTO的理想选择。
2025-07-15 16:09:04
466
原创 ==和equals有什么区别?看不懂隔着网线过来打我
本文通过一个实际案例详细解析了Java中==、equals和hashCode的区别与联系。作者在工作中遇到两个内容相同的用户对象用==比较不相等的问题,发现==比较的是对象内存地址而非内容。随后尝试用equals仍失败,发现默认继承Object类的equals本质上仍是==比较,必须重写该方法。最后使用HashSet时发现仍需重写hashCode,因为哈希集合依赖hashCode定位对象。文章强调Java的铁律:重写equals必须同时重写hashCode,并总结了三个概念的本质区别:==比较身份、equa
2025-07-15 15:57:03
392
原创 SpringBoot相较于Spring有什么优势
摘要: Spring Boot基于Spring框架,通过“约定优于配置”理念,简化了应用搭建、配置和部署流程,显著提升开发效率。其核心优势在于: 自动配置:根据依赖智能配置Spring应用,减少手动配置。 起步依赖:预置兼容的库组合(如spring-boot-starter-web),解决依赖管理难题。 内嵌服务器:集成Tomcat等服务器,无需独立部署,支持快速启动和容器化。 统一配置:通过application.properties灵活调整参数,适应多环境需求。 适用场景:快速构建生产级应用,尤其适合微
2025-07-14 17:40:43
565
原创 基于 Spark MLlib 的推荐系统实现
基于 Spark MLlib 的推荐系统实现 本文解析了使用Spark MLlib构建推荐系统的关键技术与优化方法。首先介绍了Spark MLlib的核心框架演进,重点对比了RDD和DataFrame两种API的特性及其在2025年的最新发展(如深度学习集成、AutoML支持)。其次深入剖析了协同过滤算法原理及前沿趋势(如神经网络协同过滤、图神经网络)。最后提供了优化的Java代码实现,通过分布式操作避免性能瓶颈。全文从框架、算法到实践三个维度,为构建高效推荐系统提供了全面指导。
2025-07-09 17:43:31
945
原创 Spring如何扫描@Component,@Service这些注解的
Spring组件扫描机制解析:通过"城市人口普查"类比,详解@ComponentScan底层原理。核心流程为:1) @ComponentScan划定扫描范围;2) ConfigurationClassPostProcessor协调扫描任务;3) ClassPathBeanDefinitionScanner作为执行者,使用ASM字节码技术(非类加载)高效读取类元数据;4) 根据@Component等注解筛选类,生成BeanDefinition注册表;5) 最终注册到BeanDefiniti
2025-07-09 17:16:44
925
原创 为什么Spring中推荐使用构造函数而不是@Autowired字段注入
摘要:Spring依赖注入方式对比 Spring官方推荐使用构造函数注入而非@Autowired字段注入,主要基于以下优势: 1️⃣ 不可变性:通过final字段确保依赖不可变,提升线程安全性; 2️⃣ 完整性检查:强制在对象创建时提供所有依赖,避免运行时NullPointerException; 3️⃣ 可测试性:无需Spring容器即可实例化类,简化单元测试; 4️⃣ 暴露设计缺陷:直接报错循环依赖问题,促使代码重构。 字段注入虽简洁,但掩盖设计问题,降低可维护性。建议强制依赖用构造函数注入,可选依赖用
2025-07-09 17:15:24
742
原创 一文弄清滑动窗口算法
滑动窗口算法精要 核心思想:通过动态调整窗口边界(左指针left和右指针right)高效解决问题,避免暴力枚举。关键要素包括: 窗口维护:使用集合/哈希存储当前窗口内容 扩展条件:右指针右移,纳入新元素 收缩条件:发现重复时,左指针右移直至窗口合法 结果更新:窗口有效时实时记录最优解 典型应用:求解"无重复字符的最长子串"问题时,通过哈希集合检测重复,时间复杂度优化至O(n)。该模式可扩展至多种边界滑动问题,如最大容积等场景。
2025-07-08 10:12:03
862
原创 注解@Transaction的底层原理
摘要:本文深入解析Spring框架中@Transactional注解与AOP的协同工作原理。通过将事务管理比作"智能保安系统",阐明了AOP如何通过动态代理机制实现事务管理:1) Spring容器创建代理对象拦截方法调用;2) 代理对象在方法执行前后开启/提交/回滚事务;3) 原始业务逻辑在事务保护下执行。同时指出常见失效场景,如方法内部调用、非public方法及异常类型不匹配等情况,这些都与代理机制被绕过有关。理解这套机制有助于开发者正确使用事务注解并避免常见陷阱。
2025-07-08 09:39:12
1030
原创 反射的底层原理
Java反射机制的核心是Class对象,它存储了类的所有元数据。调用Method.invoke()时,JVM采用两阶段优化策略:前15次使用JNI本地调用(慢),超过阈值后动态生成字节码实现(快)。这种设计平衡了偶尔反射调用的初始化开销和频繁调用的性能需求,体现了JVM在性能优化上的极致考量。通过sun.reflect.inflationThreshold参数可控制切换时机,展现了典型的"空间换时间"和"延迟优化"思想。
2025-06-23 12:23:05
697
原创 Java反射原理,为什么都在用反射?
摘要:反射是Java的"魔法"特性,通过JVM方法区的Class对象实现运行时动态操作类的能力。虽然存在性能开销,但其在框架开发中价值显著:1)实现终极解耦,支撑Spring等框架的IoC机制;2)构建插件化系统,如IDE扩展功能。各大厂(阿里、腾讯等)的中间件和微服务框架都深度依赖反射。典型应用如数据中台项目通过反射动态实例化插件,实现配置化和扩展性,遵循开闭原则。合理使用反射能以微小性能代价换取系统的高度灵活性。
2025-06-23 12:15:09
884
原创 Java基础八股文 - 面试者心理历程与标准答案
Java基础面试要点:面向对象三大特性(封装、继承、多态)详解,基本数据类型和引用类型区别分析,String不可变设计原理及StringBuilder/StringBuffer对比,equals和hashCode重写契约关系,异常处理机制分类与最佳实践。面试时既要掌握核心概念,又要结合实际代码示例,展现深度理解。(149字)
2025-06-22 16:57:21
984
原创 Spark简介脑图
Apache Spark是一个快速、通用的大规模数据处理框架。它以RDD为核心数据结构,支持内存计算,比Hadoop MapReduce快100倍。Spark生态系统包含Spark SQL、Spark Streaming、MLlib和GraphX四大组件,支持批处理、流处理、机器学习和图计算。其架构包括Driver、Cluster Manager和Executor,通过DAG调度实现高效计算。Spark提供RDD、DataFrame和Dataset三级数据抽象,并采用智能内存管理机制。优化要点包括数据序列化
2025-06-15 15:34:47
755
原创 Spark核心概念与DAG执行原理笔记
本文系统梳理了Spark的核心概念与技术原理,重点解析了RDD特性、DAG执行机制和Stage划分规则。主要内容包括:1) RDD的五大核心特性及操作分类;2) DAG构建流程与窄/宽依赖判断标准;3) 基于Shuffle的Stage边界划分原理;4) Spark作业执行架构及各组件交互;5) 任务并行度与分区关系;6) 广播变量和累加器的应用场景。通过Mermaid图表直观展示了Spark的底层运行机制,为性能优化提供了理论基础,并简要概述了Spark 4.0的新特性发展方向。
2025-06-15 15:30:07
1271
原创 Spark DAG、Stage 划分与 Task 调度底层原理深度剖析
本文深入剖析了Spark的DAG构建与Stage划分机制,以及Task调度的底层原理。主要内容包括:1) DAG构建过程基于RDD的转换操作形成逻辑执行计划,通过行动操作触发计算;2) Stage划分依据RDD依赖类型,窄依赖可管道化执行,宽依赖成为Stage边界;3) Task数量主要由RDD分区数决定,受Shuffle配置、数据源特性等影响。文章详细解析了窄/宽依赖的特点及Stage划分逻辑,并分析了Task并行度的关键影响因素,为Spark性能优化提供理论基础。
2025-06-14 19:27:42
1892
1
原创 SparkUI依赖问题解决方法
摘要:用户遇到Spark UI运行时错误NoClassDefFoundError,提示缺少org.glassfish.jersey.servlet.ServletContainer类。分析表明未包含Jersey Servlet集成模块,需要添加jersey-container-servlet依赖。解决方案:在pom.xml中添加Jersey 3.1.10版本的Servlet容器依赖,并确保jakarta.servlet-api保持5.0.0版本。建议后续检查依赖树解决潜在冲突,并处理SLF4J日志绑定问题。
2025-06-14 18:14:18
1397
原创 解决Spark4.0.0依赖问题
本文针对Apache Spark 4.0.0运行中的常见问题提供了解决方案。主要问题包括POM依赖冲突、JDK版本不兼容(需JDK 17)以及Servlet API兼容性问题(如SingleThreadModel类缺失)。解决方案包括:在pom.xml中明确指定Java 17版本,设置Spark核心和SQL模块为provided范围,排除冲突的Servlet API依赖并手动引入5.0.0版本,配置Maven编译和执行插件,以及添加必要的测试依赖和--add-opens参数解决模块访问限制。这些调整确保了S
2025-06-14 18:08:04
1744
原创 聊聊二手商城的架构:我们如何解决了“立即购买”的库存锁定,以及为什么购物车是个“坑”?
### **聊聊二手商城的架构:我们如何解决了“立即购买”的库存锁定,以及为什么购物车是个“坑”?**大家好,我是[你的名字/昵称]。最近在搞一个二手闲置商城的项目,过程中踩了不少坑,也沉淀了一些思考,想借这个机会和大家聊聊。核心是两个经典问题:1. “立即购买”的并发库存锁定怎么处理才优雅?2. 二手商城,到底需不需要“购物车”这个模块?#### **一、直面“立即购买”的并发难题:从刚性锁定到柔性预扣减**我们项目的初期架构比较直接。用户点击“立即购买”,后端直接在数据库层面锁定商品,
2025-06-09 19:31:26
1039
原创 链表-两两交换(Java的三种解法)
本文详细介绍了链表两两交换问题的解法及其应用场景。通过现实案例(如排队、整理书籍)帮助理解链表交换的概念,并分析了三种解法:递归、迭代(带哑节点)和迭代(不带哑节点)。其中,迭代(带哑节点)解法因其空间复杂度低、逻辑清晰,被推荐为最优解。文章还提供了Java代码实现和Mermaid流程图,帮助读者更好地理解迭代解法的步骤。此外,推荐了类似题目(如K个一组翻转链表、反转链表)和相关学习资源,帮助读者深入掌握链表操作的核心知识点。
2025-05-15 12:49:51
46123
原创 二叉树(中序遍历)
这篇文章详细介绍了二叉树中序遍历的多种解法及其应用场景。首先,通过生活中的例子(如家族谱系图、书店图书管理)解释了中序遍历的概念,即“左子树 -> 根节点 -> 右子树”。接着,文章分析了三种解法:递归法(最直观)、迭代法(用栈模拟递归,效率更高)和Morris遍历(空间复杂度O(1),但会修改树结构)。其中,递归法适合初学者,迭代法在实际工程中更常用,而Morris遍历则适合对空间有严格要求的场景。文章还提供了Java代码示例和流程图,帮助读者更好地理解迭代法的实现过程。最后,推荐了类似题目和
2025-05-14 16:18:22
892
原创 RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗
答:不冲突,它们可以协同工作,但作用域不同。如何协同? Seata AT 模式下的分支事务实际上是基于本地事务的。当 存在时,Seata 会拦截 管理的本地事务的提交/回滚。结论:同时使用两者是常见且必要的。 保证本地操作的原子性,而 则将这种原子性扩展到分布式环境下的多个参与者。答:冲突!在期望跨服务数据库原子性的场景下,同步调用 Seata AT 模式和异步发送 RabbitMQ 消息是矛盾的。Seata AT 模式的局限性: Seata AT 模式主要设计用于同步调用场景下的数据库操作。它无法管
2025-04-20 18:04:51
1689
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅