自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL 主从同步延迟:原因剖析与解决之道

MySQL 主从同步延迟是一个复杂的问题,涉及硬件资源、配置差异和业务逻辑等多个方面。通过深入分析延迟的原因,并采取相应的解决办法,如优化硬件资源、统一主从库配置、优化业务逻辑等,可以有效减少主从同步延迟,提高数据库系统的可用性和性能。同时,建立完善的监控和预警机制,能及时发现和解决同步延迟问题,保障业务的正常运行。希望本文能为解决 MySQL 主从同步延迟问题提供一些有益的参考。分享如何监控和排查 MySQL 主从同步延迟问题?详细介绍一下 MySQL 主从同步延迟的监控指标。

2025-02-24 21:02:50 1046

原创 数据库索引:缺点与类型全解析

创建索引需要额外的存储空间来存储索引数据结构。以 B 树索引为例,它需要存储节点信息,包括键值和指向子节点的指针。随着数据量的增加,索引所占用的空间也会迅速增长。例如,在一个拥有数百万条记录的数据库表中,若为多个列创建索引,索引文件的大小可能会达到甚至超过数据文件本身的大小,这无疑会对数据库服务器的存储资源造成较大压力。

2025-02-21 21:02:41 938

原创 Redis 存在线程安全问题吗?为什么?

在 Redis 6.0 之前,Redis 主要采用单线程模型来处理客户端的命令请求。这里的单线程指的是 Redis 使用一个线程来处理网络 I/O 和执行命令。也就是说,在同一时刻,Redis 只会执行一个客户端的命令请求,并且按照命令到达的顺序依次处理。

2025-02-20 20:47:49 783

原创 深入理解 Spring Bean 生命周期的执行流程

Spring Bean 的生命周期是一个复杂而有序的过程,涵盖了从准备创建到最终销毁的各个阶段。每个阶段都有其特定的任务和扩展点,开发者可以利用这些扩展点来满足不同的业务需求。通过深入理解 Spring Bean 的生命周期,我们可以更好地掌握 Spring 框架的运行机制,编写出更加高效、灵活的代码。希望本文能帮助大家对 Spring Bean 的生命周期有更深入的认识。

2025-02-19 20:54:57 859

原创 Spring Boot 自动装配原理深度剖析

Spring Boot 的自动装配,简单来说,就是能根据项目中引入的依赖,自动配置 Spring 应用所需的各种 Bean。例如,当我们引入依赖时,Spring Boot 会自动配置好 Spring MVC 相关的 Bean,包括、视图解析器等,让我们能够快速开发 Web 应用。Spring Boot 的自动装配原理通过核心注解、读取配置文件、筛选和导入自动配置类以及条件装配等一系列机制,实现了根据项目依赖自动配置 Spring 应用的功能。

2025-02-18 21:03:24 900

原创 Spring 如何解决循环依赖以及那些无法解决的循环依赖

循环依赖,简单来说,就是两个或两个以上的 bean 相互持有对方的引用,最终形成一个闭环。比如,A bean 依赖 B bean,而 B bean 又依赖 A bean,这就像两个人互相拉着对方的手,谁也没办法先迈出第一步。在 Spring 中,注入 bean 的方式主要有构造器注入和 field 属性注入,不同的注入方式在面对循环依赖时表现各异。Spring 通过三级缓存机制巧妙地解决了 field 属性注入的循环依赖问题,同时借助动态代理(@Scope的proxyMode属性和@Lazy。

2025-02-17 21:00:14 975

原创 Spring Boot 的约定优于配置,你的理解是什么?

对于更复杂的定制需求,可以创建自定义的配置类。例如,要自定义数据源的连接池配置,可以创建一个配置类:java@Bean// 其他自定义配置这样,Spring Boot 会使用自定义的数据源配置,而不是默认配置。

2025-02-14 20:37:18 1077

原创 布隆过滤器(简单介绍)

仅需约1GB内存,即可在极短时间内判断用户名是否可能被注册(即使有1%的误判率,也能通过二次数据库查询确认)。是一种高效的概率型数据结构,用于快速判断一个元素是否可能存在于某个集合中。:直接删除会导致其他元素的哈希位被误清除(但可通过改进方案如计数布隆过滤器解决)。在查询数据库前,先用布隆过滤器过滤不存在的请求,避免无效查询压垮数据库。个独立的哈希函数,每个函数将输入元素映射到位数组的某个位置。个哈希函数计算位置,若所有位置的值均为1,则认为元素。个位置,将这些位置的值设为1。

2025-02-13 20:35:30 425

原创 Netty 核心原理与高并发场景实践

在当今的网络编程领域,随着互联网应用的不断发展,对高并发、高性能网络通信的需求日益增长。Netty 作为一款基于 Java 的异步事件驱动的网络应用框架,凭借其卓越的性能和丰富的功能,成为了实现高并发网络应用的首选工具。无论是在分布式系统、游戏服务器,还是实时通信应用中,Netty 都发挥着重要作用。本文将深入探讨 Netty 的核心组件与线程模型,分享其性能优化技巧,以及在 RPC 框架中的应用实践。

2025-02-06 20:17:25 570

原创 JVM 性能调优与垃圾回收机制

在 Java 应用开发中,JVM(Java 虚拟机)如同幕后的 “大管家”,管理着内存分配、对象生命周期以及程序的执行效率。深入理解 JVM 的内存模型与垃圾回收机制,并掌握 JVM 性能调优的技巧,对于开发高效、稳定的 Java 应用至关重要。本文将全方位剖析 JVM 内存模型、垃圾回收算法、主流垃圾收集器,以及 JVM 调优的实战方法。

2025-02-06 20:15:33 1376

原创 分布式事务实战 ——Seata 与最终一致性方案

在分布式系统蓬勃发展的当下,各个服务之间相互协作完成复杂业务操作的场景愈发普遍。然而,这种架构下的事务管理成为了一个极具挑战性的问题。分布式事务需要保证在多个服务参与的业务操作中,要么所有操作都成功提交,要么全部回滚,以确保数据的一致性和完整性。本文将深入探讨分布式事务的挑战与理论基础,详细介绍 Seata 这一分布式事务解决方案的核心架构与使用方法,以及最终一致性方案的实践案例。

2025-02-06 20:14:52 1057

原创 Spring Boot 自动装配原理与优化实践

在 Java 开发领域,Spring Boot 以其 “约定优于配置” 的理念,极大地简化了 Spring 应用的开发和部署过程,成为了众多开发者的首选框架。它通过自动装配机制,让开发者能够快速搭建一个功能完备的应用,而无需进行繁琐的配置。本文将深入探讨 Spring Boot 自动装配的核心机制、性能优化策略以及常见问题与解决方案。

2025-02-06 20:14:10 772

原创 Redis 深度解析 —— 高频面试题与核心知识点

在当今的互联网技术领域,Redis 作为一款高性能的内存数据库,被广泛应用于各种场景。无论是在大型互联网公司还是小型创业项目中,Redis 都扮演着至关重要的角色。本文将深入探讨 Redis 的核心特性、应用场景、分布式锁的实现与优化,以及与 MySQL 数据一致性的方案,帮助读者全面掌握 Redis 相关的高频面试题与核心知识点。

2025-02-06 20:13:08 875

原创 MySQL索引详解

索引是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。索引的作用就相当于书的目录。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构。

2024-12-10 20:43:54 994

原创 mysql基础知识

能表示的整数范围当然也是依次递增,如 果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引 列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用NEDIUMINT就不要使 用INT,这是因为: ·数据类型越小,在查询时进行的比较操作越快(CPU层次) ·数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记 录,从而减少磁盘/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中, 从而加快读写效率。在我们的查询中发挥着什么样的作用呢?

2024-12-04 20:36:57 310

原创 redis机制详解

开启混合持久化后,AOF 在重写时,不再仅仅是把内存数据转换为 RESP 命令写入 AOF 文件,而是会先对重写这一刻之前的内存做 RDB 快照处理,然后将 RDB 快照内容与增量的 AOF 修改内存数据的命令整合在一起,一同写入新的 AOF 文件。例如,执行 “set zhuge 666” 命令后,在 aof 文件里会按照 resp 协议格式记录相应数据,其中星号后面的数字表示命令包含的参数个数,“$” 号后面的数字代表对应参数的字符个数。在实际生产环境中,既可以启用 RDB,也可以启用 AOF。

2024-11-29 21:00:34 1024

原创 什么是线程和进程?

由于绿色线程和原生线程比起来在使用时有一些限制(比如绿色线程不能直接使用操作系统提供的功能如异步 I/O、只能在一个内核线程上运行无法利用多核),在 JDK 1.2 及以后,Java 线程改为基于原生线程(Native Threads)实现,也就是说 JVM 直接使用操作系统原生的内核级线程(内核线程)来实现 Java 线程,由操作系统内核进行线程的调度和管理。在 Windows 和 Linux 等主流操作系统中,Java 线程采用的是一对一的线程模型,也就是一个 Java 线程对应一个系统内核线程。

2024-11-22 19:50:36 1003

原创 Java 反射机制详解

让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。比如下面是通过 JDK 实现动态代理的示例代码,其中就使用了反射类。

2024-11-20 19:51:25 356

转载 Java 值传递详解

通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样,请看案例 2。引用传递看似很好,能在方法内就直接把实参的值修改了,但是,为什么 Java 不引入引用传递呢?看到这里,相信你已经知道了 Java 中只有值传递,是没有引用传递的。实际上,并不是的,这里传递的还是值,不过,这个值是实参的地址罢了!函数中对形参的修改,可以影响到实参的值。的副本,副本的内容无论怎么修改,都不会影响到原件本身。的互换只是拷贝的两个地址的互换罢了,并不会影响到实参。

2024-11-14 20:00:42 55

原创 什么是I/O流

语法糖(Syntactic sugar)代指的是编程语言为了方便程序员开发程序而设计的一种特殊语法,这种语法对编程语言的功能并没有影响。实现相同的功能,基于语法糖写出来的代码往往更简单简洁且更易阅读。举个例子,Java 中的for-each就是一个常用的语法糖,其原理其实就是基于普通的 for 循环和迭代器。String[] strs = {"JavaGuide", "公众号:JavaGuide", "博客:https://javaguide.cn/"};

2024-11-13 19:42:44 387

原创 序列化和反序列化

如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。序列化:将数据结构或对象转换成可以存储或传输的形式,通常是二进制字节流,也可以是 JSON, XML 等文本格式反序列化:将在序列化过程中所生成的数据转换为原始数据结构或者对象的过程。

2024-11-12 21:43:53 655

原创 数据库范式、MySQL 架构、算法与树的深入解析

在数据库设计中,范式是一系列规则,用于确保数据的组织和存储具有良好的结构、完整性以及最小化的数据冗余。如果不遵循范式设计,数据可能会以平铺式罗列,仅使用冒号、分号等简单分隔。这种方式存在诸多弊端,例如在数据搜索时极为不便,数据修改也会变得十分棘手。由此,范式的概念应运而生。

2024-11-11 19:42:06 2549 1

转载 注解以及API和SPI的区别

举个通俗易懂的例子:公司 H 是一家科技公司,新设计了一款芯片,然后现在需要量产了,而市面上有好几家芯片制造业公司,这个时候,只要 H 公司指定好了这芯片生产的标准(定义好了接口标准),那么这些合作的芯片公司(服务提供者)就按照标准交付自家特色的芯片(提供不同方案的实现,但是给出来的结果是一样的)。SPI 即 Service Provider Interface ,字面意思就是:“服务提供者的接口”,我的理解是:专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。),同时,我们还可以自定义注解。

2024-11-08 18:57:34 53

原创 如何理解反射

反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。不过,反射让我们在运行时有了分析操作类的能力的同时,也增加了安全问题,比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。比如下面是通过 JDK 实现动态代理的示例代码,其中就使用了反射类。

2024-11-07 19:26:05 337

原创 什么是泛型?有什么作用?泛型的使用方式有哪几种?项目中哪里用到了泛型?

Java 泛型(Generics)是 JDK 5 中引入的一个新特性。使用泛型参数,可以增强代码的可读性以及稳定性。编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。比如这行代码就指明了该ArrayList对象只能传入Person对象,如果传入其他类型的对象就会报错。并且,原生List返回类型是Object,需要手动转换类型才能使用,使用泛型后编译器自动转。

2024-11-06 19:52:34 263

原创 springBoot集成shiro+权限刷新

综上所述,在 Spring Boot 结合 Shiro 进行管理时,通过合理配置 Shiro 的基础组件以及实现有效的权限刷新机制,可以更好地保障系统的安全性和权限管理的灵活性。当权限发生变化时(比如管理员在后台修改了用户的角色或权限),可以通过清理 Shiro 相关缓存来实现权限的刷新。通过这种方式,当权限发生变化时,可以及时、主动地更新用户的授权信息,确保用户的权限访问符合最新的设置。方法修改用户权限后,会清理掉授权信息的缓存,下次用户访问相关资源时,Shiro 会重新进行授权计算。

2024-11-05 08:08:40 512

原创 Java 异常:深入理解与实践

在 Java 中,所有的异常都有一个共同的祖先 ——java.lang包中的Throwable类。ThrowableException和Error。

2024-11-04 19:59:52 826

原创 String#equals() 和 Object#equals() 有何区别?字符串常量池的作用了解吗?String s1 = new String(“abc“);这句话创建了几个字符串对象?

1、如果字符串常量池中不存在字符串对象 “abc”,那么它首先会在字符串常量池中创建字符串对象 "abc",然后在堆内存中再创建其中一个字符串对象 "abc"。指令的确是从常量池中加载各种类型的常量,包括字符串常量、整数常量、浮点数常量,甚至类引用等。2、如果字符串常量池中已存在字符串对象“abc”,则只会在堆中创建 1 个字符串对象“abc”。命令不会在堆中创建新的字符串对象“abc”,这是因为 0 这个位置已经执行了一次。方法是被重写过的,比较的是 String 字符串的值是否相等。

2024-10-30 21:46:30 335

原创 String、StringBuffer、StringBuilder 的区别?String 为什么是不可变的?字符串拼接用“+” 还是 StringBuilder?

String类中使用final关键字修饰字符数组来保存字符串//...我们知道被final关键字修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是基本数据类型则值不能改变,修饰的变量是引用类型则不能再指向其他对象。因此,final关键字修饰的数组保存字符串并不是String不可变的根本原因,因为这个数组保存的字符串是可变的(final修饰引用类型变量的情况)。String保存字符串的数组被final修饰且为私有的,并且String类没有提供/暴露修改这个字符串的方法。String类被final。

2024-10-29 22:09:33 896

原创 Spring Boot 集成 Shiro:会话管理、加密与登录次数限制

使用 Spring Initializr 创建一个 Spring Boot 项目,在pom.xml。

2024-10-29 08:09:24 1160

原创 hashCode() 有什么用?为什么要有 hashCode?为什么重写 equals() 时必须重写 hashCode() 方法?

的作用是获取哈希码( 整数),也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。 定义在 JDK 的 类中,这就意味着 Java 中的任何类都包含有 函数。另外需要注意的是: 的 方法是本地方法,也就是用 C 语言或 C++ 实现的。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象) 我们以“ 如何检查重复”为例子来说明为什么要有

2024-10-26 23:29:05 615

原创 深拷贝和浅拷贝区别了解吗?什么是引用拷贝?Object 类的常见方法有哪些?== 和 equals() 的区别?

浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。上面的结论没有完全理解的话也没关系,我们来看一个具体的案例!

2024-10-25 18:51:16 657

原创 如果一个类没有声明构造方法,该程序能正确执行吗?构造方法有哪些特点?是否可被 override?面向对象三大特征

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承,可以快速地创建新的类,可以提高代码的重用,程序的可维护性,节省大量创建新类的时间 ,提高我们的开发效率。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩坑。因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式。),类似于类中的静态方法。

2024-10-24 19:59:23 682

原创 Spring Boot集成Shiro授权

首先,我们需要创建一个Spring Boot项目。你可以使用Spring Initializr或者你喜欢的IDE(如IntelliJ IDEA)来创建一个新的Spring Boot项目。自定义Realm用于处理身份验证和授权逻辑。@Autowired@Override@Overridethrow new UnknownAccountException("用户不存在");

2024-10-24 07:58:58 570 1

原创 面向对象和面向过程的区别,创建一个对象用什么运算符?对象实体与对象引用有何不同?对象的相等和引用相等的区别

POP 的编程方式通常更为简单和直接,适合处理一些较简单的任务。POP 和 OOP 的性能差异主要取决于它们的运行机制,而不仅仅是编程范式本身。因此,简单地比较两者的性能是一个常见的误区在选择编程范式时,性能并不是唯一的考虑因素。代码的可维护性、可扩展性和开发效率同样重要。现代编程语言基本都支持多种编程范式,既可以用来进行面向过程编程,也可以进行面向对象编程。下面是一个求圆的面积和周长的示例,简单分别展示了面向对象和面向过程两种不同的解决方案。我们定义了一个Circle。

2024-10-23 22:20:50 902

原创 重载和重写有什么区别?什么是可变长参数?

重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。方法的重写要遵循“两同两小一大”“两同”即方法名相同、形参列表相同;“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。什么是可变长参数?从 Java5 开始,Java 支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。

2024-10-22 22:19:15 245

原创 什么是方法的返回值?方法有哪几种类型?静态方法为什么不能调用非静态成员?静态方法和实例方法有何不同?

静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制。是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用是接收出结果,使得它可以用于其他的操作!的方式来调用静态方法。这种方式非常容易造成混淆,静态方法不属于类的某个对象而是属于这个类。的方式,而实例方法只有后面这种方式。不过,需要注意的是一般不建议使用。在外部调用静态方法时,可以使用。的方式来调用静态方法。

2024-10-21 22:43:51 345

原创 成员变量与局部变量的区别?静态变量有什么作用?字符型常量和字符串常量的区别?

而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。:从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;:从变量是否有默认值来看,成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被。修饰的,那么这个成员变量是属于类的,如果没有使用。通常情况下,静态变量会被。

2024-10-18 21:19:23 253

原创 为什么浮点数运算的时候会有精度丢失的风险?如何解决浮点数运算的精度丢失问题?超过 long 整型的数据应该如何表示?

这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过。基本数值类型都有一个表达范围,如果超过这个范围就会有数值溢出的风险。在 Java 中,64 位 long 整型是最大的整数类型。相对于常规整数类型的运算来说,运算的效率会相对较低。

2024-10-17 22:00:30 261

原创 Spring Boot集成Shiro认证

首先,我们需要创建一个Spring Boot项目,并添加必要的依赖。在pom.xml创建一个自定义的Realm类MyRealm@Autowired@Override@Overridethrow new UnknownAccountException("用户不存在");

2024-10-17 08:15:05 1830

空空如也

空空如也

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

TA关注的人

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