自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring和SpringBoot的动态代理区别联系

摘要:Spring框架通过代理机制实现AOP功能,主要包括JDK动态代理和CGLIB代理两种方式。JDK动态代理基于接口,通过InvocationHandler实现方法增强;CGLIB代理则通过生成目标类的子类来实现代理。Spring 5.x默认使用JDK动态代理,而Spring Boot 2.x及以上版本默认采用CGLIB代理。代理机制广泛应用于AOP切面、事务管理(@Transactional)、异步方法(@Async)和声明式缓存(@Cacheable)等场景。开发者可以通过@Pointcut定义切点

2025-07-18 16:45:51 565

原创 计算机的网络体系及协议模型介绍

网络协议是设备间通信的规则集合,采用分层体系结构(如OSI七层和TCP/IP四层模型)简化设计与维护。协议包含语法、语义和同步三大要素,确保数据传输的标准化。TCP/IP协议族是互联网核心,包含应用层(HTTP/DNS等)、传输层(TCP/UDP)、网络层(IP)和链路层。HTTP用于传输超文本,而HTTPS是其安全版本。协议分层虽带来灵活性,但也存在功能冗余问题。网络通信中,各层通过封装/解封装数据实现透明传输,状态码则反馈请求处理结果。

2025-07-17 21:00:56 662

原创 Spring的@ControllerAdvice对全局异常处理

  ControllerAdvice是SpringMVC中用于全局处理的注解,它配合@ExceptionHandler处理全局异常,@ModelAttribute预设全局数据,以及@InitBinder实现请求参数的预处理。通过@ExceptionHandler可以捕获并处理特定类型的异常,@ModelAttribute可以注入Model中的全局属性,@InitBinder则用于初始化WebDataBinder,注册自定义编辑器,对请求参数进行预处理。 @ControllerAdvice不是传统AOP意义。

2025-07-17 14:48:26 511

原创 Springboot框架中的starter的介绍

SpringBoot Starter机制实现了开箱即用的自动化配置,通过封装功能模块简化开发流程。文章详细介绍了starter的定义、特点(自动装配、易于集成)和核心注解。重点讲解了如何自定义starter,包括创建配置类、自动装配类,以及在META-INF/spring.factories中注册的方法。通过HelloService示例演示了starter的实现过程,并说明其使用场景(日志、短信、Redis等)。自定义starter能提升模块复用性,使功能组件"随用随取",是现代微服务开发的高效扩展方式。

2025-07-15 14:04:16 1214

原创 分布式理论:CAP、Base理论

摘要:CAP理论和BASE理论是分布式系统设计的核心原则。CAP理论指出在一致性(C)、可用性(A)和分区容错性(P)中只能同时满足两项,实际系统通常选择CP或AP架构。BASE理论则提出基本可用、软状态和最终一致性的折中方案,适用于对强一致性要求不高的场景。两者关系上,CAP提供理论框架,BASE是具体实践。系统设计时需根据业务需求选择:金融系统需CP保证强一致,社交网络可选用AP实现高可用,而评论系统等适合采用BASE的最终一致性。现代分布式系统多采用混合模式动态调整CAP特性。

2025-07-08 23:27:56 955

原创 Spring的Bean原型模式下的使用

摘要:本文探讨了Spring中原型(Prototype)模式Bean的使用问题与解决方案。问题原因包括@Autowired注入只初始化一次、代理模式问题及不当获取方式。提供了四种解决方案:通过ApplicationContext获取、使用ObjectProvider、Lookup方法和Provider接口。分析了原型模式的适用场景:有状态Bean、线程不安全对象、需要新实例及避免副作用的场景。最后指出使用注意事项,包括内存管理、性能影响、依赖管理和测试复杂性,强调需权衡资源开销与功能需求。

2025-07-07 21:54:27 1248

原创 MySQL的事务和锁机制的详细介绍

MySQL事务与锁机制详解 摘要: 本文详细解析MySQL的事务特性和锁机制。首先介绍事务的ACID特性(原子性、一致性、隔离性、持久性)和四种隔离级别(读未提交、读提交、可重复读、串行化),重点分析多线程并发事务可能产生的脏读、不可重复读和幻读问题。其次深入探讨MVCC多版本并发控制原理及其解决并发问题的方式。然后系统讲解MySQL锁的分类,包括独占锁、共享锁及其兼容性,以及InnoDB引擎特有的记录锁、间隙锁、临键锁等实现细节。最后提供锁监控方法和优化建议,包括缩短事务长度、合理设计索引等,并比较不同隔

2025-07-05 22:49:51 1358

原创 Java锁升级的详细介绍

Java锁机制包括偏向锁、轻量级锁和重量级锁三种类型,通过对象头中的锁标志位区分(01、00、10)。偏向锁适用于无竞争场景,记录线程ID避免同步操作;轻量级锁通过CAS机制实现线程交替访问;当竞争激烈时升级为重量级锁,依赖操作系统互斥量实现线程阻塞。JDK15后偏向锁默认禁用,现代应用更推荐基于CAS的轻量级锁实现。合理选择锁类型可显著提升多线程性能。

2025-07-05 00:24:36 873

原创 Synchronized锁同步下的monitor机制

摘要:本文深入解析了Java中Monitor机制与synchronized的实现原理。Monitor是JVM实现线程同步的基础机制,每个Java对象头中的MarkWord在锁升级为重量级锁时会指向外部ObjectMonitor结构。synchronized代码块通过monitorenter/monitorexit字节码指令实现,而同步方法则通过ACC_SYNCHRONIZED标志隐式加锁。文章详细阐述了对象内存布局、Monitor数据结构、同步过程以及wait/notify机制与Monitor的关系,揭示了

2025-07-04 20:58:49 1049

原创 MySQL的窗口函数介绍

MySQL窗口函数是8.0版本的重要特性,允许在不减少行数的情况下进行数据分析。主要包括三类函数:排名函数(RANK、DENSE_RANK、ROW_NUMBER)、分析函数(LEAD/LAG、FIRST_VALUE/LAST_VALUE)和聚合函数。窗口定义包含PARTITION BY分组、ORDER BY排序和窗口框架设置。高级用法包括多窗口定义、百分比计算、分组TopN查询等。使用窗口函数时需注意大数据集的性能问题。窗口函数将复杂的数据分析计算高效地转移到数据库层完成。

2025-07-03 22:21:36 827

原创 MySQL的5.0和8.0版本区别

MySQL 5与8版本核心差异摘要 MySQL 5(2005年发布)主要特性包括:默认InnoDB引擎、存储过程/触发器支持、视图功能、查询优化器增强及外键约束。而MySQL 8(2018年发布)实现了重大升级:性能提升2倍,默认utf8mb4字符编码支持表情符号,新增JSON原生数据类型与操作函数,引入窗口函数和CTE语法。安全方面强化了密码策略和SSL支持,存储引擎改为插件化架构,并改进索引算法(隐藏索引/降序索引)。兼容性上需注意:MySQL 8驱动类更改为com.mysql.cj.jdbc.Driv

2025-07-02 23:17:51 798

原创 AOP、Interceptor、Filter关于日志记录的联系与区别

摘要: Spring框架中AOP、Filter和Interceptor均可用于日志记录,但适用场景不同。AOP适用于业务层(@Service),记录方法调用、执行时间等核心业务日志,通过切面编程实现环绕增强;Interceptor属于SpringMVC层,适合记录Controller的HTTP请求参数、URL等Web相关日志;Filter作为Servlet容器级拦截,处理原始请求/响应数据(如Body)。三者互补:Filter全局拦截请求,Interceptor处理Web层行为,AOP聚焦业务逻辑。组合使用

2025-06-29 13:15:46 937

原创 过滤器(Filter)和拦截器(Interceptor)的介绍

1、定义是 Servlet 规范规定的,在 Servlet 前执行的,用于拦截和处理 HTTP 请求和响应。拦截的是request请求,基于回调,拦截的是地址,粒度很大。2、方法通过实现Filter接口,分别是初始化方法dofilter方法和销毁方法随着容器的启动和销毁而初始化和销毁,依赖于servlet容器。过滤器拦截的是地址栏请求,过滤器实在进入容器后执行的servlet之前后执行,针对的在处理业务之前的操作。这个方法的调用作为分水岭。

2025-06-28 13:14:21 1290

原创 深入学习MySQL的页分裂(Page Split)

MySQL数据表以文件方式存放在磁盘中,默认使用共享表空间(0)存储。共享表对于Innodb来说:当使用共享表空间时,所有表的数据和索引会存储在一个共享的 ibdata 文件中。表结构以frm文件的形式存储在与表对应的文件夹中。页为mysql的innodb引擎的存储磁盘的最小单元,每个页默认为16kb。64个连续的数据页称为一个extent(区),64个页组成一个区,所以区的大小为1MB(16*64=1024),连续的256个数据区称为一组数据区。

2025-06-27 20:08:54 1127

原创 Java设计模式->责任链模式的介绍

职责链模式是一种行为型设计模式,它允许将请求沿着一个处理链传递,直到链中的某个对象处理它。将链中的每一个结点看做是一个对象,每个结点处理请求均不同,且内部自动维护一个下一个结点对象。当请求从链条的首端出发时,会沿着链的路径依次传递给每一个结点的对象,直到有对象处理这个请求为止。每个结点会处理一件事情,如果结点间出现异常,那么链路就会中断。

2025-06-26 22:34:01 1069

原创 Redis的渐进式hash和缓存时间戳深入学习

前言关于redis,可由来进行了解。如下所示:redis在缓存应用发挥着重要作用,不知道你有没思考过Redis为什么这么快?1、纯内存。2、单线程没有上下文切换。3、缓存时间戳和渐进式rehash。

2025-06-24 22:28:55 1095

原创 Redis中的bigkey的介绍及影响

什么是BigKey?为什么它成为Redis的性能杀手?BigKey指在Redis中key对应的value占用内存或元素数量超出业务合理阈值的键值对。

2025-06-23 23:29:08 1225

原创 Java设计模式之适配器模式

 java的设计模式可分为:创建型模式、结构性模式、行为型模式三类。适配器模式(Adapter Pattern)是一种 结构型设计模式,用于在两个不兼容的接口之间建立桥梁,使它们可以协同工作。它通常用于让已有的类与新接口兼容,而无需修改原有代码。实现方式分为对象适配器(基于组合)、类适配器(基于继承)、接口适配器(基于抽象类)三种。

2025-06-22 11:50:01 994

原创 如何设计一款秒杀系统的整体方案

在同一个时刻有大量的客户端请求争抢同一个商品并完成交易的过程,瞬时会产生大量的并发读和并发写。CDN(内容分发网络)是一种通过分布式服务器网络加速内容传输的技术。它通过将静态资源(如HTML、CSS、JavaScript、图片、视频等)缓存到全球多个节点服务器上,使用户可以从离自己最近的节点获取资源,从而提升加载速度和性能。加速资源加载:用户从最近的节点获取资源,减少延迟。减轻服务器负担:CDN分担流量,降低源服务器压力。提升可用性:即使某个节点故障,其他节点仍可提供服务。

2025-06-21 13:18:12 1204

原创 关于RocketMQ详细了解

rocketMq使用轻量级的NameServer服务进行服务的协调和治理工作,NameServer多节点部署时相互独立互不干扰。每一个rocketMq服务节点(broker节点)启动时都会遍历配置的NameServer列表并建立长链接,broker节点每30秒向NameServer发送一次心跳信息、NameServer每10秒会检查一次连接的broker是否存活。消费者和生产者会随机选择一个NameServer建立长连接,通过定期轮训更新的方式获取最新的服务信息。

2025-06-19 11:29:39 1241

原创 kafka消费的模式及消息积压处理方案

 Kafka消费积压(Consumer Lag)是指消费者处理消息的速度跟不上生产者发送消息的速度,导致消息在Kafka主题中堆积。1. 如果是Kafka消费能力不足,则可以考虑增加 topic 的 partition 的个数(提高kafka的并行度),同时提升消费者组的消费者数量,消费数 = 分区数 (二者缺一不可)2. 若是下游数据处理不及时,则提高每批次拉取的数量。批次拉取数量过少(拉取数据/处理时间 < 生产速度),使处理的数据小于生产的数据,也会造成数据积压。

2025-06-18 21:03:50 1146

原创 详细介绍下Redis的事务

Redis 的 Pipeline 机制是一种用于优化网络延迟的技术,主要用于在单个请求/响应周期内执行多个命令。在没有 Pipeline 的情况下,每执行一个 Redis 命令,客户端都需要等待服务器响应之后才能发送下一个命令。这种往返通信尤其在网络延迟较高的环境中会显著影响性能。

2025-06-17 23:26:18 950

原创 JMM的三大特性、八大原子操作、happens-before原则

以下是主内存变量和工作内存变量的区别。1、lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用。作用于工作内存的变量,把read操作从主内存中得到的变量值放入工作内存的变量副本中。

2025-06-17 10:36:11 1091

原创 线程池中submit()和 execute()区别与联系

execute()是Executor接口(ExecutorService 继承自它)中定义的方法,只能提交Runnable任务,没有返回值不能获取任务执行结果,如果任务抛出异常,异常会由线程池的未捕获异常处理器处理。submit() 是接口中定义的方法。可以提交Runnable和Callable任务,返回**Future**对象,可以用来获取任务执行结果或取消任务。

2025-06-16 15:06:52 964

原创 Java设计模式---迭代器模式(Iterator)介绍

迭代器模式是 Java 集合框架的核心设计之一,也是许多高级数据结构(如树、图)遍历的基础。迭代器(Iterator)是一种常见的 设计模式,它提供了一种 统一的访问集合元素的方式,同时 隐藏了集合的内部实现细节。

2025-06-16 12:07:19 1128

原创 JVM 内存、JMM内存与集群机器节点内存的联系

在日常开发过程中,不知道你是否考虑。

2025-06-13 18:25:29 1296

原创 关于B+树的介绍

本文系统介绍了B+树的数据结构及其特性。B+树是一种平衡多叉搜索树,其节点最多包含m个子节点(m为阶数),属于N叉树的一种。与B树不同,B+树的所有数据都存储在叶子节点,且叶子节点通过指针连接形成有序链表。文章详细阐述了B+树的节点结构、N叉特性、与B树的区别,并通过示例演示了查找和插入元素的过程。作为数据库索引的核心结构,B+树通过多路分支降低树高,提高磁盘IO效率,使其成为MySQL InnoDB等存储引擎的理想选择。

2025-06-13 11:00:33 1104

原创 树之《红黑树》的介绍

根据树的结构分类:红黑树是一种自平衡的二叉搜索树(BST)。红黑树是一种弱平衡的二叉树,其不需要像AVL树那样满足左右子树高度差不超过1,红黑树树的高度最多是2倍的对数级别,所以红黑树的插入和删除操作方面更具有灵活性,但是有一些方面性能还是不如AVL树的。可以通过旋转和变色来维持红黑树自身的特质。

2025-06-12 16:42:32 1191

原创 关于MySql深分页的问题及优化方案

在mysql中索引分为聚簇索引和非聚簇索引。节点存储:B+树是一种自平衡的树结构,其中每个节点可以有多个子节点。非叶子节点存储的是指向子节点的指针和分隔值,而叶子节点存储的是实际的数据记录或记录的指针。顺序访问:叶子节点中的数据是按照索引列的顺序存储的,这使得范围查询非常高效。聚簇索引(主键索引)的叶子节点直接存储行数据,而非聚簇索引(二级索引)的叶子节点存储的是主键值。

2025-06-12 13:32:32 1155

原创 不同网络I/O模型的原理

I/O 操作(Input/Output Operation)指的是计算机系统中与外部环境(如网络、磁盘、键盘、显示器等)进行数据交换的过程。

2025-06-11 12:02:10 1006

原创 JDK8版本下的新特性详细介绍

java8(LTS)是Java历史上一个重大的版本更新,发布于2014年3月18日,大约有50多个特性,本节只介绍开发者需要关注的十个特性。如下图所示:在介绍jdk8版本的时候,可以重点介绍下集合类里面的结构原理变化。如map,list,包括jvm里面的永久代和方法区的变化。

2025-06-10 18:21:37 1019

原创 关于布隆过滤器的使用

布隆过滤器(Bloom Filter)则提供了一种空间效率极高的概率型数据结构,它可以告诉你“可能存在”或“一定不存在”,用极小的错误率换取了内存占用的大幅降低。如下图所示:当缓存中不存在某个数据,而用户频繁查询该数据时,可能导致缓存穿透问题。而布隆过滤器可以在缓存层之前迅速过滤掉不存在的数据,减轻数据库的压力。

2025-06-10 10:25:32 1175

原创 关于MQ之kafka的深入研究

Kafka、RabbitMQ、RocketMQ 和 ActiveMQ 是流行的消息队列解决方案,它们在架构设计、性能、特性和适用场景上各有不同。Kafka 适合高吞吐量和流式数据处理,RabbitMQ 适合需要复杂路由和灵活性场景,RocketMQ 适用于高并发的应用场景,而 ActiveMQ 则适合企业级 Java 应用集成。

2025-06-09 17:44:44 1634

原创 集合中的并发修改异常及处理方式

1、介绍前言在Java中,像ArrayList这样的集合类使用迭代器的时候,如果在遍历过程中直接修改集合(比如remove),可能会导致ConcurrentModificationException。为什么是可能会产生导致ConcurrentModificationException?1、介绍。1.1、for-each的本质在 Java 中,如果你在即增强型 for 循环)中直接对集合执行 remove()操作,会抛出 ConcurrentModificationException。

2025-06-09 10:43:12 796

原创 本地缓存在Java中的实现方式

引入缓存,主要用于实现系统的高性能,高并发。如下图所示:将数据库查询出来的数据放入缓存服务中,因为缓存是存储在内存中的,内存的读写性能远超磁盘的读写性能,所以访问的速度非常快。但是电脑重启后,内存中的数据会全部清除,而磁盘中的数据虽然读写性能很差,但是数据不会丢失。

2025-06-08 13:49:01 1138

原创 Spring中bean的生命周期回调方法和执行顺序

1、对于普通的 Java 对象的生命周期是实例化、该对象不再被使用时通过垃圾回收机制进行回收实例化--->属性赋值---->初始化----->销毁一种是初始化回调,一种是销毁回调。合理的掌握bean在生命周期的初始化回调和销毁的函数,可帮助开发者编写更加健壮的程序。参考文章:1、Spring的核心模块原理介绍_spring 原理-CSDN博客2、Spring-Beans的生命周期的介绍_spring bean的生命周期-CSDN博客3、

2025-06-07 12:50:50 1151

原创 Mysql中select查询语句的执行过程

MySQL 查询语句可以分为 Server 层和存储引擎层。而 Server 层包括连接器、查询缓存、解析器、预处理器、优化器、执行器等,

2025-06-06 14:23:48 1267

原创 Java设计模式之《单例模式》

单例模式在基础设施组件(日志、配置、连接池等)中使用最为广泛,但在业务代码中应谨慎使用,以避免造成不必要的耦合。在Java中,枚举是实现单例模式的最佳实践,除非你需要延迟加载(枚举是类加载时就初始化),否则应该优先考虑使用枚举方式实现单例。

2025-06-05 20:55:49 1200

原创 深入学习RabbitMQ队列的知识

AMQP)是一种高级消息队列协议,用于在分布式系统中实现异步通信和消息传递。它定义了消息的格式、传输规则和路由机制,允许不同系统、语言或平台之间通过统一的标准进行消息交互。

2025-06-05 14:18:01 1518

原创 那些Java 线程中断的实现方式

前言线程的调度和执行由操作系统决定,而 Java 通过提供一系列 API 来与操作系统交互,从而实现对线程的控制。因此Java 虚拟机(JVM)作为用户态程序,其实是无法直接终止一个线程的。当我们调用 thread.stop() 这类方法时,实际上是在用户态层面发出中断请求,而真正的线程终止还需要操作系统内核的配合。如下图所示::通过设置标志位,使线程正常退出,能够确保线程根据业务逻辑安全停止。:已废弃,不推荐使用,因为会导致线程安全问题和资源泄漏。

2025-06-04 11:21:59 731

空空如也

空空如也

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

TA关注的人

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