自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【SpringBoot】最佳实践——JWT结合Redis实现双Token无感刷新

JWT是全称是JSON WEB TOKEN,是一个开放标准,用于将各方数据信息作为JSON格式进行对象传递,可以对数据进行可选的数字加密,可使用RSA或ECDSA进行公钥/私钥签名。JWT最常见的使用场景就是缓存当前用户登录信息,当用户登录成功之后,拿到JWT,之后用户的每一个请求在请求头携带上字段来辨别区分请求的用户信息。且不需要额外的资源开销。

2025-03-15 16:30:46 1223

原创 【Linux扫盲】Vim命令不会用?看这篇就对了!Vim最佳实践参考手册

Vim 是一种高度可配置的文本编辑器,广泛用于程序开发以及其他文本编辑任务。它是 Unix 系统上 Vi 编辑器的增强版,提供了许多强大的功能。在 Linux 系统上执行vim [文件名]命令,即可进入到 vim 编辑器,开始编辑指定的文件。

2025-01-25 18:00:19 821

原创 【分布式】一文详解五大分布式ID实现方案

分布式 ID 是在分布式环境中生成全局唯一标识符的技术,确保在不同节点生成的 ID 不会冲突。常用于数据库主键、订单号等场景。分布式 ID 是分布式系统中不可或缺的一环,其设计直接影响系统的性能和稳定性。在实际应用中,可以根据业务需求选择合适的生成方案,如高并发场景优先选择雪花算法,有序性需求可选 Redis 或号段模式。

2024-12-22 16:55:01 1274

原创 【策略模式】最佳实践——Spring IoC实现策略模式全流程深度解析

策略模式是一种行为型设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换,并且使算法的变化不会影响使用算法的客户端。策略模式通过将具体的业务逻辑从上下文(Context)中剥离出来,独立为策略类,动态地将所需的行为注入上下文对象中,从而避免代码中充斥条件判断逻辑。

2024-11-17 09:24:40 1467 2

原创 【分布式】万字图文解析——深入七大分布式事务解决方案

分布式事务是指跨多个独立服务或系统的事务管理,以确保这些服务中的数据变更要么全部成功,要么全部回滚,从而。在微服务架构和分布式系统中,由于业务逻辑往往会跨多个服务,传统的单体事务无法覆盖,因此需要通过分布式事务来保障一致性。

2024-11-14 09:21:58 985

原创 【分布式】分布式锁设计与Redisson源码解析

在分布式系统中,多个节点可能需要协调对共享资源的访问,以防止数据的不一致性或冲突。分布式锁允许多个节点在竞争访问共享资源时进行同步,以确保只有一个节点能够获得锁,从而避免冲突和数据损坏。

2024-11-05 11:01:43 1225

原创 【SpringBoot】源码解析——启动流程

`SpringApplicationRunListeners` 是一个具体的类。它实现了 Spring Boot 中的监听器机制,用于在应用程序的不同启动阶段通知注册的监听器(`SpringApplicationRunListener` 接口的实现类)。通过这个类,Spring Boot 可以在应用启动过程中管理多个监听器,处理各种生命周期事件。

2024-10-26 15:33:01 1042

原创 【SpringBoot】源码解析——自动装配与starter机制

在传统的 Spring 框架中,开发者需要通过 `XML` 文件或 `Java` 配置类显式地声明 Bean 和各种配置项(例如数据源、事务管理、视图解析器等)。Spring Boot 的自动装配旨在减少这些繁琐的配置,通过默认的配置和条件装配,自动完成很多配置工作,从而减少开发者的配置量。

2024-10-26 15:03:26 1154

原创 【常用集合】深入浅出Map集合

它能够保证在多线程环境下对其进行并发读写操作时,不会出现数据不一致的情况。,在第一个线程判断某个键不存在时,另一个线程可能已经插入了该键,这样第一个线程的操作就会覆盖另一个线程的结果,导致数据不一致。HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。来避免链表倒置,使得插入的节点永远都是放在链表的末尾,避免了链表中的环形结构。来避免链表倒置,使得插入的节点永远都是放在链表的末尾,避免了链表中的环形结构。

2024-09-18 10:58:57 891 2

原创 【并发编程】全面解析volatile和synchronized关键字

偏向锁会偏向第一个获得它的线程,如果接下来的执行过程中,该锁没有被其他线程获取,则持有偏向锁的线程不需要再进行同步。的低两位用于表示锁的状态,分别为"01"(无锁状态)、“01”(偏向锁状态)、“00”(轻量级锁状态)和"10"(重量级锁状态)。是相对基于OS的互斥量实现的重量级锁而言的,它的本意是在没有多线程竞争的前提下,减少传统的重量级锁使用OS的互斥量而带来的性能消耗。锁粗化是指将多个连续的、临近的小范围锁操作合并为一个更大的锁操作,以减少加锁和解锁的频率,从而提高性能。

2024-09-10 15:09:14 1159

原创 【并发编程】从AQS机制到同步工具类

Java 的 AbstractQueuedSynchronizer(AQS)借鉴了 CLH 锁的思想,并在此基础上做了诸多改进,使其更适合构建高效、可扩展的同步器。AQS 使用了显式的双向链表来维护等待队列,而不是隐式的单向链表。这样改进的好处是,它允许 AQS 更方便地处理队列中的节点操作,比如取消、唤醒特定节点等。

2024-08-30 18:23:41 919

原创 【Redis】从数据结构走进Redis五大数据类型

Redis 是用 C 语言实现的,但是它没有直接使用 C 语言的 char* 字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simple dynamic string,SDS)的数据结构来表示字符串。

2024-08-27 17:59:50 1012

原创 【Redis集群】集群原理最全解析

Redis中的分片集群(Sharded Cluster)是一种将数据分布在多个Redis节点上的方式。通过将数据水平分片,分片集群能够在数据量增加时提升集群的存储容量,同时将写入压力分散到多个master节点上,提升整体性能。

2024-08-12 10:58:50 1375

原创 【JVM】深入JIT优化机制

在将高级语言转化为计算机可识别的机器语言时,常用的两种方式是编译和解释。Java在编译过程中,首先将代码编译成字节码。但是,字节码并不能直接在机器上执行。因此,JVM中内置了解释器(Interpreter),它在**运行时将字节码逐行翻译成机器码**并执行。

2024-08-08 20:31:45 1156

原创 【Redis】缓存三大问题与缓存一致性问题

在分布式系统中,缓存作为提高性能和响应速度的重要技术,同时也面临着缓存穿透、缓存击穿和缓存雪崩三大问题。缓存穿透是指频繁请求数据库中不存在的数据,导致缓存无法命中,从而给数据库带来巨大压力。常见解决方案包括缓存空结果和使用布隆过滤器。缓存击穿发生在热点数据失效时,短时间内大量请求穿透缓存访问数据库,造成瞬时高并发压力。对此,可以采用互斥锁或设置永不过期的缓存来应对。缓存雪崩则是在某一时刻大量缓存同时失效,导致请求全部打到数据库,可能引起系统崩溃。为避免缓存雪崩,可以对缓存过期时间进行随机化,或者采取多级缓存

2024-08-07 10:55:19 673 1

原创 【Redis】持久化机制最全解析

RDB全称Redis Database Backup file(Redis数据备份文件)。通过将Redis数据集的快照保存到磁盘上的二进制文件中来实现。生成 RDB 文件的过程可以通过手动命令或自动触发。AOF全称为Append Only File(追加文件)。通过将每次写操作记录到AOF文件中来实现。这种方式的特点是将 Redis 接收到的每个写命令都追加到文件末尾。

2024-08-07 10:49:25 956

原创 【SpringBoot】Bean生命周期自定义初始化和销毁

上篇文章详细讲诉了Bean的生命周期和作用域,在生命周期中提到了如何自定义初始化Bean,可能很多人不知道如何自定义初始化,这里详细补充讲解一下:使用@Bean注解指定初始化和销毁方法、实现InitializingBean接口和DisposableBean接口自定义初始化和销毁、@PostConstruct(初始化逻辑)和@PreDestroy(销毁逻辑)注解、使用BeanPostProcessor接口。

2024-08-06 14:22:09 1078

原创 【JVM】Java内存区域图文详解

Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JVM运行时区域也成为Java内存区域。 在讨论Java内存模型时,通常将其分为线程共享区域和线程私有区域

2024-08-06 13:13:22 1888

原创 【Spring】Ioc与使用属性文件

因为当 Spring 进行注入的时候,虽然它发现存在多个动物, 但因为Dog被标注为了@Primarγ,所以优先采用Dog的实例进行了注入,这样就通过优先级的变换使得IoC容器知道注入哪个具体的实例来满足依赖注入。显然这是一个憋屈的做法,好好的一个动物,却被我们定义为了狗,毕竟不能每次换个对象就改一次,这样太麻烦了。好了,如果我们还使用着YoungPerson类,那么麻烦来了,因为这个类只是定义了一个动物属性(Animal),而我们却有两个动物,一个狗, 一个猫, SpringIoC 如何注入呢?

2024-08-05 13:14:36 771

原创 【单例模式】深入三大单例对象创建方式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

2024-08-05 12:58:25 1137

原创 【Spring】Bean详细解析

不过,大部分 Bean 实际都是无状态(没有定义可变的成员变量)的(比如 Dao、Service),这种情况下, Bean 是线程安全的。然而,我们也可以配置Spring容器,使其为每个bean的请求创建一个新的实例,即多例模式。由于原型bean的生命周期是由Spring容器管理的,因此Spring容器会在每次请求时创建一个新的bean实例,并在不再需要时销毁它。这意味着,如果你在你的代码中持有一个对原型bean的引用,并且这个引用不再被使用,那么这个bean实例可能会被。:依赖关系通过注解隐式注入。

2024-08-04 13:44:04 1005

原创 【MySQL】慢sql优化全流程解析

explain 是 MySQL 提供的一种用于分析和调试 SQL 查询的工具。通过使用 explain,可以了解 MySQL 在执行查询时采用的具体执行计划,包括访问数据表的方式、使用的索引、连接表的顺序等信息。这些信息对于优化查询性能至关重要。

2024-08-04 13:18:12 1608 1

原创 【MySQL】全面剖析索引失效、回表查询与索引下推

回表查询是指在使用辅助索引(二级索引)进行查询时,由于辅助索引中不包含查询所需的所有列数据,数据库必须通过索引找到对应的数据行位置,再去实际的数据表(即“回表”)中读取完整的数据行。这种操作会增加额外的 I/O 开销,因此回表查询通常比直接从索引中获取数据的查询更慢。

2024-08-03 11:08:44 969

原创 【MySQL】索引概念解析

MySQL中的索引是一种数据结构,用于帮助MySQL数据库管理系统快速查询数据。索引的主要目的是提高数据检索的速度,减少数据库系统需要扫描的数据量。索引可以极大的提高数据检索效率,降低数据库IO成本通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性通过索引列对数据进行排序,降低数据排序的成本,减少CPU的消耗创建索引需要消耗物理空间。对于大型数据库,索引可能会占用相当大的磁盘空间。创建索引和维护索引需要消耗时间,降低表的更新效率。

2024-08-02 16:01:02 976

原创 【MySQL】一文彻底吃透MVCC执行原理

MVCC全称Multi-Version Concurrency Control,即多版本并发控制。它通过维护数据的多个版本来实现高效的并发控制,用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。

2024-08-02 15:57:34 1878

原创 【工厂模式】深入浅出工厂模式三大实现方案

工厂模式是一种创建型设计模式,通过提供一个接口或抽象类来创建对象,而不是直接实例化对象。工厂模式的主要思想是将对象的创建与使用分离,使得创建对象的过程更加灵活和可扩展。抽象工厂(Abstract Factory):定义了一个创建产品对象的接口,可以包含多个方法来创建不同类型的产品。具体工厂(Concrete Factory):实现抽象工厂接口,负责实例化具体的产品对象。抽象产品(Abstract Product):定义了产品的接口或抽象类,是工厂方法和抽象工厂模式中的基础。

2024-07-29 10:56:36 638

原创 【代理模式】详细剖析静态代理、JDK动态代理和CGLIB动态代理

代理模式是常用的Java设计模式,该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类,并在事后处理消息等。代理类与委托类之间通常存在关联关系,一个代理类对象与一个委托类对象关联。代理类对象本身不真正实现服务,而是通过调用委托类对象的相关方法来提供特定的服务。抽象主题(Subject):定义代理类和委托类(RealSubject)的共同接口。这个接口规定了代理类和委托类必须实现的方法,代理类可以通过这个接口来调用委托类的方法。

2024-07-29 10:54:32 683

原创 【SpringBoot】SpringCache轻松启用Redis缓存

SpringCache是Spring提供的一种缓存抽象机制,旨在通过简化缓存操作来提高系统性能和响应速度。可以将方法的返回值缓存起来,当下次调用方法时如果从缓存中查询到了数据,可以直接从缓存中获取结果,而无需再次执行方法体中的代码。

2024-07-15 18:24:59 590

原创 【RabbitMQ】一文详解消息可靠性

RabbitMQ 是一款高性能、高可靠性的消息中间件,广泛应用于分布式系统中。它允许系统中的各个模块进行异步通信,提供了高度的灵活性和可伸缩性。然而,这种通信模式也带来了一些挑战,其中最重要的之一是确保消息的可靠性。发送消息时连接RabbitMQ失败发送时丢失:生产者发送的消息未送达交换机;消息到达交换机后未到达队列;MQ 宕机,队列中的消息会丢失;消费者接收到消息后未消费就宕机了。

2024-07-13 23:01:39 1217

原创 【SpringBoot】随机盐值+双重SHA256加密实战

SHA-256是一种信息摘要算法,也是一种密码散列函数。对于任意长度的消息,SHA256都会产生一个256bit长的散列值(哈希值),用于确保信息传输完整一致,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。SHA-256的具备以下几个关键特点:固定长度输出:无论输入数据的大小,SHA-256都会产生一个256位(32字节)的固定长度散列值。不可逆性:SHA-256的设计使得从生成的散列值无法还原原始输入数据。这种不可逆性在安全性上是非常重要的。

2024-07-08 23:32:12 2314 1

原创 【消息队列】RabbitMQ基本概念

RabbitMQ的死信队列(Dead Letter Queue,简称DLQ)是一种用于处理消息处理失败或无法路由的消息的机制。它允许将无法被正常消费的消息重新路由到另一个队列,以便稍后进行进一步的处理、分析或排查问题。**消息处理失败:**当消费者由于代码错误、消息格式不正确、业务规则冲突等原因无法成功处理一条消息时,这条消息可以被标记为死信。**消息过期:**在RabbitMQ中,消息可以设置过期时间。如果消息在规定的时间内没有被消费,它可以被认为是死信并被发送到死信队列。

2024-06-30 23:51:08 809 1

原创 【并发编程】线程池参数及创建方法

线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。为什么要使用线程池?使用线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

2024-05-27 11:18:22 1235

原创 【SpringBoot】MapStruct实现优雅的数据复制

1.为什么选择MapStruct2.MapStruct快速入门3.MapStruct进阶4.字段的逻辑处理一般来说,不使用MapStruct框架进行属性映射,常有的方法以下两种:这种方法最朴素,手动编写代码将源对象的属性存入目标对象,需要注意实体类中嵌套属性的判空操作以防止空指针异常。底层使用的是反射机制实现属性的映射。反射是一种在运行时动态获取类信息、调用方法或访问字段的机制,无法利用JVM的优化机制,因此通常比直接方法调用慢得多。此外, 只能同属性映射,或者在属性相同的情况下,允许被映射的对象属性少;但

2024-05-20 17:12:27 3511 1

原创 【项目开发】Java调用Python方法

在这个人工智能技术迅速发展的时代,对于我们学生而言,参加软件竞赛已不再是单纯的技术比拼。传统的纯Java编写项目,虽然有其稳定与高效的优势,但在面对日益复杂的算法需求时,其竞争力已逐渐减弱。因此,将Java与Python这两种编程语言的优势相结合,实现算法与软件的完美融合,已成为提升项目竞争力的关键。本文将详细讲解使用Java调用Python的三大方法,并分析各个方法的优势。直接在Java程序中执行,可以直接利用Java虚拟机(JVM)的性能优势,减少进程间通信的开销。

2024-05-12 23:16:52 5802 1

原创 【实战运用】SpringSecurity+Redis+Jwt实现用户认证授权

Spring Security是一个强大且灵活的身份验证和访问控制框架,用于Java应用程序。它是基于Spring框架的一个子项目,旨在为应用程序提供安全性。Spring Security致力于为Java应用程序提供认证和授权功能。开发者可以轻松地为应用程序添加强大的安全性,以满足各种复杂的安全需求。

2024-01-19 23:41:52 2650 1

原创 【IDEA结合Git实现项目管理实战】四、git冲突篇

在多分支并行处理时,每个分支可能基于不同版本的主干分支创建。如果每个分支都独立开发而没有进行代码合并,自然不会出现代码冲突。但是,当两个分支同时修改同一文件时,在代码合并时就会出现冲突。下图为两个分支分别使用合并/变基操作解决冲突后的提交树。可以发现,无论是对于合并还是变基操作的示例1和示例2,最终执行操作后的结果都是一样的。对于合并操作,git将两个分支进行合并,最后生成一个新的提交记录,提交树存在交叉。对于变基操作,git将目标分支的提交记录应用到当前分支,提交树仍然是线性的。如图所示。

2024-01-04 19:56:59 1980 1

原创 Redis报错:Could not connect to Redis at 127.0.0.1:6379: Connection refused解决方案

在使用VMware软件解决Redis后台启动无日志输出问题时在网上查找了很多方法,终于将其解决了,在处理问题过程中偶然遇到了这个报错,这里给出解决方案。

2023-12-27 16:08:46 3528 2

原创 Redis持久化问题排查

黑马的Redis持久化课程里老师用的MobaXterm软件与我使用的VMware存在差异,在进行了一天的排查后终于解决了问题,感慨良多。在遇到问题解决不了的时候还是要多回头看,没准在出发点就能找到问题了。下面就将展示问题的描述和解决方案。

2023-12-26 16:00:38 870 1

原创 【IDEA结合Git实现项目管理实战】三、实战篇

本文作为该系列的实战篇,将正式介绍如何使用IDEA结合Git进行项目管理。注意:本文假设你已经成功在IDEA中配置了git

2023-12-15 22:35:41 1457

原创 【IDEA结合Git实现项目管理实战】一、配置篇

本系列将结合我个人参与团队协作开发项目的经验来介绍如何使用IDEA结合Git实现项目管理,因此可能与真正的企业开发协作存在差异,且文章所涉及的解析可能存在个人理解与实际的偏差。本系列主讲如何具体操作,因此对于Git内部的原理将不会过多深究。本文严禁任何形式的转载、搬运!本文作为该系列的配置篇,将介绍如何使用IDEA整合git,从而实现项目管理。本文将使用Gitee作为项目管理工具。注意:本文假定你已经拥有了一个Gitee账号并已经配置了密钥。

2023-12-10 11:58:59 1560 1

空空如也

空空如也

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

TA关注的人

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