自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 线程中断和LockSupport

首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的协商机制―—中断,也即中断标识协商机制。中断只是一种协作协商机制,Java没有给中断增加任何语法,中断的过程完全需要程序员自己实现。

2025-04-09 17:00:15 502

原创 MySQL日志

本文系统介绍了 MySQL 中三种关键日志:Undo Log、Redo Log 和 Binlog,以及它们在事务处理中的作用与配合关系。Undo Log(回滚日志):用于记录数据修改前的状态,是实现事务原子性和 **MVCC(多版本并发控制)**的关键。事务回滚和快照读都依赖 Undo Log。Redo Log(重做日志):用于记录对数据页的物理更改,即使事务已提交但数据尚未写入磁盘,借助 Redo Log 也能在系统崩溃后恢复数据,保障事务持久性。

2025-04-06 17:06:20 612

原创 深入并发之Runnable、Callable、FutureTask原理分析

在FutureTask出现之前,Java中的多线程编程执行任务后是不能获取执行结果的,当我们需要多线程执行后的结果时则需要自己经过复杂的实现(如写到缓存或者全局变量中主线程再去读取)。而FutureTask整合了Runnable、Callable、Future三个接口,使得我们的多线程任务执行后可以异步获取到多线程的执行结果。FutureTask会将执行结束后的结果保存在成员变量:outcome中,等待获取执行结果的线程则读取outcome成员值即可。ask对象中的一个Callable成员的call。

2025-04-06 16:57:36 732

原创 前缀树学习

假如我们只构建一个只有26个英文小写字母的前缀树那么children的长度就是26 ,如果children[i] 不为空,那么证明有某个单词使用了这个前缀。

2025-03-24 14:01:41 417

原创 若依(RuoYi)OSS上传学习记录总结

在学习若依(RuoYi)框架的OSS(对象存储服务)上传功能过程中,我深入研究了其整合AWS S3协议OSS功能的实现方式、相关配置以及数据库设计等内容,收获颇丰。以下是详细的学习记录总结。

2025-03-22 15:07:25 785

原创 MQ 消息发送可靠性保证 —— 整合 Spring Retry 重试框架 + 补偿发送方案

RocketMQ Starter 本身提供重试机制较为简单,无法指定较复杂的重试策略Spring Retry 是一个用于为应用程序提供自动重试功能的框架,特别适用于执行可能会因暂时性问题失败的操作(如网络请求、数据库操作、消息队列操作等)。通过配置,Spring Retry 能够在失败时自动重试指定次数,且每次重试可以配置不同的延迟和间隔。

2025-03-08 13:02:42 949

原创 MYSQL锁的分类

整个数据库处于只读状态 ,增删改会被阻塞通常用于数据备份如何避免全局锁?在可重复读级别下会开启一个事务,整个事务执行期间会使用这个readView。

2025-03-04 16:26:20 742

原创 点赞,点赞列表方案设计

点赞系统是社交平台或内容平台中常见的功能,用户通过点赞来表达对内容的喜好。为了高效地处理大量用户的点赞请求并快速展示点赞列表,需要设计一个高效的点赞存储与查询系统。

2025-02-28 20:58:48 490

原创 提升 Spring Boot 系统性能:高效处理实时数据流的 BufferTrigger 使用详解

快手开源的 BufferTrigger 是一个用于数据处理,它主要用于实时数据流处理场景。BufferTrigger 的主要作用是为了解决在大数据流处理中常见的问题:如何高效地对连续的数据流进行缓冲,并在满足一定条件时触发下游计算或存储操作。提高效率:通过批量处理数据而不是逐条处理,可以显著减少 I/O 操作的次数,从而提升整体处理效率。资源优化:对于一些需要消耗较多计算资源的操作(如写入数据库、调用外部服务等),通过累积一批数据后再执行一次这样的操作,可以更有效地利用系统资源。简化逻辑。

2025-02-27 14:32:32 775

原创 事务的隔离级别

在数据库的并发控制中,(Transaction Isolation Level)和(Read Types)对解决并发问题至关重要。常见的并发问题包括和。不同的隔离级别和读类型使用不同的锁机制来解决这些问题。

2025-02-26 21:25:13 620

原创 Spring Boot集成Redis + Lua脚本实现原子性操作:小白入门指南

在分布式系统中,多个Redis命令的组合操作(如先查询后修改)可能因网络延迟、并发竞争导致数据不一致。Lua脚本可以将多个命令封装为一个原子操作,确保,避免中间状态。

2025-02-23 12:58:06 516

原创 RocketMQ事务消息原理

RocketMQ的事务消息是一种确保消息与本地事务一致性的机制,广泛应用于分布式系统中,尤其是需要保证跨服务数据一致性的场景。其核心原理是在生产者发送消息到Broker时,先发送一个“半消息”,然后生产者执行本地事务。如果事务成功,生产者会发送提交(Commit)请求,Broker将半消息标记为正常消息;若失败,则发送回滚(Rollback)请求,Broker丢弃该消息。如果生产者未及时确认,Broker会进行事务回查,确保消息的一致性处理。通过这种机制,RocketMQ提供了一种可靠的方式来保证消息的投递

2025-02-22 10:16:59 850

原创 Spring Boot定时任务原理

在现代应用中,定时任务的调度是实现周期性操作的关键机制。Spring Boot 提供了强大的定时任务支持,通过注解驱动的方式,开发者可以轻松地为方法添加定时任务功能。本文将深入探讨 Spring Boot 中定时任务的实现原理,重点分析和的作用,以及任务如何被注册和执行。我们还将详细介绍底层使用的线程池调度器和 Java 内置的,它们如何协同工作,保证定时任务的准确执行。此外,我们还将探讨任务调度的线程阻塞与唤醒机制,深入剖析延迟队列()如何有效管理任务的执行顺序。

2025-02-22 10:15:35 2021

原创 Feign 请求拦截器:实现 userId 服务间透传

在微服务架构中,通常负责鉴权并从请求头中提取用户身份(如userId),将其传递给下游服务。但服务间的调用(如通过 OpenFeign)userIduserId通过,在服务间调用时主动将当前服务的用户身份添加到请求头中,实现userId的透传。

2025-02-20 11:18:10 511

原创 解决异步线程无法从ThreaLocal获取上下文

如果说,我们写业务代码的时候,有些逻辑是需要在异步线程中去执行,如下图所示,异步线程中,再通过去获取上下文数据,就失效了。

2025-02-19 14:51:31 397

原创 网关整合 SaToken 实现接口鉴权

在微服务架构中,接口鉴权是确保系统安全的关键环节。通过整合 SaToken 与网关,可以有效地实现全局接口鉴权,确保每个请求都经过合法的身份验证。本文介绍了如何在 Spring Cloud Gateway 中集成 SaToken,实现基于 Token 的认证与授权机制。我们通过自定义网关过滤器,提取请求中的 Token 并进行验证,若 Token 合法则允许请求继续传递,否则拒绝请求。此外,利用 SaToken 的 @SaCheckLogin 注解,可以方便地在微服务中进行权限控制。

2025-02-19 09:49:51 421

原创 整合SaToken 实现登录功能

在现代的 Web 开发中,用户认证和登录管理是构建安全应用的关键环节。本文将介绍如何通过 Sa-Token 来实现一个简单、易扩展的登录系统。Sa-Token 是一个高效、轻量的 Java 权限认证框架,能够帮助开发者快速实现用户认证、权限控制和会话管理。

2025-02-18 18:26:28 867

原创 MybatisMybatisPllus公共字段填充与配置逻辑删除

在开发过程中,很多时候需要处理一些公共字段,例如:创建时间、修改时间、状态字段等。这些字段通常会在插入或更新数据时进行填充,以便记录数据的变化和状态。同时,逻辑删除也是常见的业务需求,比如删除记录并不是从数据库中物理删除,而是通过更新某个字段(如is_deleted)来标记数据已被删除。MyBatis 和 MyBatis-Plus 都提供了相应的机制来处理这些公共字段的填充和逻辑删除。下面我们将分别介绍如何在 MyBatis 和 MyBatis-Plus 中实现公共字段填充与逻辑删除。

2025-02-16 11:02:37 604

原创 Java中的锁

在并发编程中,多个线程可能会同时访问共享资源,这时就会产生线程安全问题。为了避免数据的竞争和不一致性,我们通常使用锁来控制访问共享资源的顺序。锁的实现和类型多种多样,本文将深入探讨Java中的锁的类型和应用。

2025-02-13 13:40:02 416

原创 使用MyBatisMyBatis Plus实现SQL日志打印与执行监控

在开发过程中,SQL日志的完整输出对于调试和性能优化至关重要。MyBatis默认的日志输出仅显示带占位符的SQL语句,无法直接看到实际参数值,且缺乏执行时间统计。本文将介绍两种实现方案:1. 原生配置方案:通过日志框架直接输出基础SQL日志2. 增强方案:使用MyBatis拦截器实现完整SQL打印和执行监控

2025-02-11 15:56:58 715

原创 Java Web 开发中的分页与参数校验

在 Java Web 开发中,分页和参数校验是两个非常重要的功能。本文将围绕 **分页设计** 和 **参数校验** 进行探讨,包括如何设计合理的分页查询参数,以及如何利用 **Java 注解** 实现参数校验。

2025-02-07 14:58:09 1097

原创 从零手写Spring IoC容器(二):bean的定义与注册

在本章中,我们继续手动实现一个简化版的 Spring IoC 容器,重点探讨了 Bean的定义与注册。通过对容器的进一步扩展,我们引入了更细化的设计,帮助容器管理 Bean 的生命周期和配置。首先,我们分析了 Bean 的定义(BeanDefinition)的关键要素。BeanDefinition 包含了 Bean 的类信息、构造函数参数、属性值、作用域等,这些都是容器创建和管理 Bean 的必要信息。我们定义了一个接口 BeanDefinition,并实现了 GenericBeanDefinition

2025-02-06 11:17:00 693

原创 从零手写Spring IoC容器(一):传统对象管理的困境与基础容器的实现

在软件开发中,随着系统复杂度的提升,手动管理对象之间的依赖关系变得越来越困难。传统的对象管理方式通常依赖于显式的依赖传递,如构造函数传参或 setter 注入,这种方式难以灵活地应对变化,并且代码的耦合度较高,难以维护和扩展。因此,出现了基于 IoC(控制反转) 和 DI(依赖注入) 的容器,它们旨在将对象的创建和依赖管理交给容器,从而解耦业务逻辑,提高代码的可测试性和可维护性。在本章中,我们从零开始实现一个简化版的 Spring IoC 容器。首先,我们分析了传统对象管理的困境,指出手动创建对象和管理

2025-02-06 11:15:54 828

原创 场景设计学习-积分系统

积分系统是一种广泛应用于电商、社交平台、会员管理等场景的功能,用于激励用户参与和提升用户忠诚度。设计一个高效且灵活的积分系统需要考虑多个方面,包括积分的获取、消耗、兑换以及过期等机制。在积分获取方面,用户通过完成特定任务(如购买商品、签到、参与活动等)获得积分,积分可以与用户行为和活动紧密挂钩。系统需要确保积分获取的规则公平透明,同时支持定期或动态调整规则以增加灵活性。积分的消耗通常用于兑换商品、优惠券、服务等。为了增强用户体验,消耗规则应该简单易懂,并支持积分的部分兑换,以提高用户参与度。此外,系

2025-01-26 10:45:10 1200

原创 SpringBoot内置Tomcat启动原理

Spring Boot内置Tomcat的启动原理是基于Spring Boot自动配置和嵌入式容器的概念。Spring Boot提供了嵌入式的Tomcat容器,使得开发者无需手动配置和部署外部的Web服务器。Spring Boot的核心启动类是SpringApplication,它会自动初始化并启动一个内嵌的Tomcat容器。具体来说,当Spring Boot应用启动时,SpringApplication.run()方法会被调用,内部会创建一个SpringApplication实例,并执行一系列初始化工

2025-01-26 10:40:24 979

原创 为什么SpringBoot的jar包可以直接运行

Fat Jar 打包插件将所有依赖打包到单个 Jar 中。自定义类加载器创建类加载器加载依赖。启动逻辑:通过清单文件中的指定用户主类,并反射调用其main方法。插件将所有依赖打包到单个 Jar 中。创建类加载器加载依赖。3. **启动逻辑**:通过清单文件中的指定用户主类,并反射调用其main` 方法。这种机制让开发者无需关心依赖管理和类加载细节,可以专注于业务开发,提升了应用的可移植性和启动效率。

2025-01-25 14:17:49 690

原创 Spring是如何解决循环依赖的为什么需要三级缓存二级缓存不行吗如何避免在并发条件下拿到不完整的Bean

构造器注入无法解决任何情况下的循环依赖问题。属性注入和 Setter 注入单例-单例:支持循环依赖,Spring 使用三级缓存(单例池、二级缓存、三级缓存)可以解决。单例-原型、原型-原型、原型-单例:均不支持,因为原型作用域的 Bean 每次都会重新创建,无法缓存引用,也无法通过提前暴露引用解决循环依赖问题。单例与原型混合依赖问题单例依赖原型,原型反过来依赖单例时,循环依赖无法解决。解决循环依赖的建议避免构造器注入,优先使用属性注入或 Setter 注入。使用@Lazy。

2025-01-25 09:58:28 1194

原创 点赞系统的设计与学习

一个通用点赞系统需要满足下列特性:由此点赞系统的架构设计本质是:如何在高读写的环境下,稳定支持点赞功能的高效运行整个点赞服务的系统可以分为五个部分1、流量路由层(决定流量应该去往哪个机房)2、业务网关层(统一鉴权、反黑灰产等统一流量筛选)3、点赞服务(thumbup-service),提供统一的接口4、点赞异步任务(thumbup-job)5、数据层(db、redis)整个点赞系统最重要的两个结构1.谁给谁点了赞2.这个东西的点赞量是多少点赞记录表结构如下:点赞统计表:4.功能分析

2025-01-24 14:50:44 1123

原创 学习-秒杀系统设计

在商家创建优惠券模版时,会将其预热到缓存中,并向发送一个定时消息来修改优惠券为已到期状态,同时将优惠券模版Id加入到布隆过滤器中,具体缓存结构如下:采用哈希结构,key:前缀+优惠券模版Id,value:优惠券模版元数据信息。

2025-01-23 10:30:37 298

原创 学习记录-统计记录场景下的Redis写请求合并优化实践

学习记录场景下的Redis写请求合并优化实践在高频学习进度统计场景中,前端每15秒上报播放进度,直接写入数据库面临性能挑战。频繁的插入与更新操作涉及多表联动(如学习记录表、课程章节表等),导致数据库负载激增,并发场景下易出现响应延迟甚至服务雪崩。优化方案采用Redis作为写缓冲层实现请求合并:写缓存:将进度更新暂存至Redis哈希结构,以lessonId+sectionId为键,聚合短时间内的多次更新,仅保留最新进度;延迟落库:通过延迟队列(如JDK DelayQueue)触发合并任务,20

2025-01-21 15:30:45 1171

原创 基于注解实现去重表消息防止重复消费

幂等性是指对同一操作的多次执行所产生的影响与一次执行的影响相同。消息消费场景:无论消息被消费多少次,最终结果应与消费一次一致。实现目标:通过幂等设计,确保业务逻辑的重复执行不会产生副作用。提供了一种通用的幂等注解,并通过 SpEL 的形式生成去重表全局唯一 Key/*** 设置防重令牌 Key 前缀*//*** 通过 SpEL 表达式生成的唯一 Key*//*** 设置防重令牌 Key 过期时间,单位秒,默认 1 小时*/幂等需要设置两个状态,消费中和已消费,创建对应的枚举。

2025-01-21 10:32:52 1432

原创 基于模板方法模式-消息队列发送

模板方法模式(Template Method Pattern)是一种行为型设计模式,旨在通过在父类中定义一个算法的框架(即模板方法),而将某些步骤延迟到子类中实现。模板方法模式让子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。父类提供了一个骨架方法(即模板方法),并规定了算法的步骤。子类负责实现某些具体的步骤,这些步骤通常是一些可变的行为,父类并不关心。父类的模板方法调用这些可变的步骤,完成一个完整的算法流程。

2025-01-21 09:20:16 1077

原创 缓存穿透解决方案

缓存空对象是解决缓存穿透的一种简单方法,适用于一些数据访问频繁且数据为空的场景,但它可能浪费缓存空间。布隆过滤器是一种高效的概率数据结构,能够快速判断数据是否存在,避免了不必要的数据库查询,但可能会误判数据的存在。布隆过滤器+缓存空对象是结合两种技术的解决方案,能够有效减少数据库的压力,并避免缓存穿透的发生。它在减少误判率的同时,也提高了系统的吞吐量。在实际使用时,通常需要根据具体场景和业务需求来选择合适的解决方案。

2025-01-19 10:09:17 666

原创 查询缓存击穿解决方案

缓存击穿是指缓存中的某个数据在缓存过期或者被删除后,下一次请求在没有命中缓存的情况下,直接访问数据库,导致缓存失效或被清除的瞬间,数据库承受大量的并发请求。简单来说,缓存击穿是缓存不可用情况下,缓存请求集中访问数据库的现象。

2025-01-19 09:53:12 957

原创 Java Faker

是一个用来生成虚拟数据的 Java 库,广泛用于测试、开发和填充数据库等场景。它通过模拟真实世界的名称、地址、电话号码等数据来生成假数据,帮助开发者在进行单元测试、性能测试或者演示时使用一些随机的、但符合一定格式的数据。

2025-01-15 10:14:18 458

原创 学习记录-基于分布式锁注解防重复提交

在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。这里的副作用是不会对结果产生破坏或者产生不可预料的结果。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。自定义幂等注解用于标记需要实现幂等性的接口方法。结合分布式锁机制,确保即使在分布式环境中,接口的某次调用只会被成功执行一次,从而避免重复提交、重复消费等问题。/**

2025-01-14 09:58:46 1341

原创 学习记录-操作日志

系统操作日志是用于记录系统中用户或系统本身所执行的各类操作的日志信息。这些日志通常包括操作的时间、操作的用户、具体操作内容、操作结果以及其他相关信息。**安全审计**:记录用户操作以防止恶意行为,确保系统的安全性。**问题排查**:在系统出现问题时,可以通过操作日志快速定位问题来源。

2025-01-13 10:48:56 965

原创 学习记录-责任链模式验证参数

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着一个处理链传递,直到链中的某个对象处理它。这样,发送者无需知道哪个对象将处理请求,所有的处理对象都可以尝试处理请求或将请求传递给链上的下一个对象。

2025-01-13 10:20:05 765

原创 SpringBoot集成Caffeine缓存:高性能本地缓存解决方案

Caffeine是一个高性能的Java缓存库,为Java应用程序提供了极快的本地内存缓存解决方案。它是基于Google Guava Cache重新设计的缓存框架,在性能和功能上都有显著提升。Caffeine的核心优势在于其高效的缓存算法和优秀的并发性能,能够显著提升应用程序的响应速度和吞吐量。

2024-12-13 16:05:54 762

原创 Spring Boot + MySQL 多线程查询与联表查询性能对比分析

在现代 Web 应用开发中,数据库性能是影响系统响应时间和用户体验的关键因素之一。随着业务需求的不断增长,单表查询和联表查询的效率问题日益凸显。特别是在 Spring Boot 项目中,结合 MySQL 数据库进行复杂查询时,如何优化查询性能已成为开发者必须面对的重要问题。在本实验中,我们使用了 Spring Boot 框架结合 MySQL 数据库,进行了两种常见查询方式的性能对比:多线程查询 和 联表查询。通过对比这两种查询方式的响应时间,本文旨在探讨在实际业务场景中,选择哪种方式能带来更高的查询效率,尤

2024-12-05 15:58:25 1435

空空如也

空空如也

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

TA关注的人

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