自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Boot 集成 Redisson分布式锁(注解版)

在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面,例如分布式锁、分布式集合、分布式事件发布和订阅等。本篇是一个使用 Redisson 实现分布式锁的详细示例,在这个示例中,我们定义了DistributedLock注解,它可以标注在方法上,配合DistributedLockAspect切面以及IDistributedLock分布式锁封装的接口,来实现redisson 分布式锁的 API 调用。

2023-06-09 17:50:36 10388 2

原创 Optional类详解及使用方法示例

Optional类是java8中引入的一个非常有用的类,它可以用来解决空指针异常带来的不便。这个类可以将对象包装为一个Optional对象,如果该对象为空,则可以使用一些默认值或者执行一些默认操作。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。Java8的Optional类提供了丰富的 API 方法,这里按照其功能分类介绍。

2023-05-29 14:37:25 4055

原创 AutoGPT怎么用?一文配置自己的AutoGPT!

Auto GPT是Github上的一个免费开源项目,结合了GPT-4和GPT-3.5技术,通过API创建完整的项目。与ChatGPT不同的是,用户不需要不断对AI提问以获得对应回答,在AutoGPT中只需为其提供一个AI名称、描述和五个目标,然后AutoGPT就可以自己完成项目。它可以读写文件、浏览网页、审查自己提示的结果,以及将其与所说的提示历史记录相结合。Auto GPT相当于给基于GPT的模型一个内存和一个身体。有了它,你可以把一项任务交给AI智能体,让它自主地提出一个计划,然后执行计划。

2023-04-14 11:18:39 13317 12

原创 Java Stream比较两个List的差异,并取出不同的对象

上述代码中,将两个List类型的对象list1和list2转换为Stream类型,并调用filter方法筛选出不同的对象。最后通过collect方法将不同的对象转换为List类型,并输出结果。可以使用Java8的Stream API来比较两个List的差异,并取出不同的对象。2. 调用Stream的filter方法,将不同的对象过滤出来;3. 将过滤出的不同的对象转换为List类型。1. 将两个List转换为Stream类型;

2023-04-13 15:33:14 10989 3

原创 @Async详解(二)

我们知道当使用@Async不指定线程池时,Spring会默认使用SimpleAsyncTaskExecutor线程池,那么SimpleAsyncTaskExecutor有什么缺点呢?本篇我们通过源码分析SimpleAsyncTaskExecutor为什么不建议使用。

2023-03-23 17:55:37 2804 1

原创 为什么不推荐使用Executors线程池

Executors类提供了一些创建线程池的静态方法。但是阿里巴巴开发手册强制不允许使用Executors来创建线程池,下面根据源码分析为什么阿里巴巴开发手册不允许使用Executors类创建线程池。

2023-02-21 15:52:27 341

原创 异步解耦之RabbitMQ(四)_消息持久化及ACK机制

在消息传递系统中,消息持久化是一种机制,用于保证即使在消息代理或消费者故障的情况下,消息也能够被保存并最终传递到目标。对于需要长时间存储的重要消息,消息持久化非常有用。在RabbitMQ中,可以通过设置队列的参数来启用消息持久化。当消息被标记为持久化时,它们将在磁盘上进行存储,从而确保即使在RabbitMQ服务器重启后,也能够恢复未处理的消息。本文详细介绍了RabbitMQ的消息持久化和ACK机制。

2024-02-02 13:22:05 995

原创 异步解耦之RabbitMQ(三)_RabbitMQ队列

RabbitMQ中的队列是消息的有序集合。消息以FIFO(“先进先出”)的方式进入和退出队列(传递给消费者)。要用通用术语定义队列,它是一个具有两个主要操作的顺序数据结构:一个项目可以在尾部加入队列(添加),并从头部退出队列(消耗)。队列在消息传递技术领域中扮演着重要角色。许多消息传递协议和工具假设发布者和使用者使用类似队列的存储机制进行通信。消息传递系统中的许多特性都与队列相关。一些RabbitMQ队列特性,比如消费者的优先级和排队,会影响消费者观察到的排序。

2024-02-02 11:11:13 1389

原创 异步解耦之RabbitMQ(二)_RabbitMQ架构及交换机

交换机会检查消息的路由键与绑定到该交换机的队列的路由键是否完全匹配。:Exchange是消息的路由器,负责接收来自生产者的消息,并根据预定义的规则将消息路由到一个或多个队列中。它会将接收到的消息广播到所有绑定到该交换机上的队列中,无需考虑路由键的匹配。当生产者发送消息给扇形交换机时,交换机会忽略消息的路由键,而是将消息发送给所有绑定的队列。RabbitMQ是一个基于AMQP(Advanced Message Queuing Protocol)协议的消息代理中间件,它通过交换机和队列实现消息的路由和分发。

2024-02-01 13:48:08 1230

原创 异步解耦之RabbitMQ(一)_RabbitMQ 简介

RabbitMQ是一个开源的消息代理中间件,用于在应用程序之间进行可靠的消息传递。它实现了AMQP(高级消息队列协议)标准,并提供了丰富的功能和灵活性,使得开发人员能够构建可扩展和可靠的分布式系统。

2024-02-01 10:47:54 1874

原创 Spring Boot集成EasyExcel实现数据导出

在开发Web应用中,经常需要将数据导出为Excel文件。EasyExcel是一款功能强大的Java开发库,它提供了简单易用的API来帮助我们实现数据的导出功能,并支持一些高级特性,在EasyExcel的基础上,自定义实现如列下拉列表、自定义单元格样式、自适应列宽和行高、动态表头以及多个sheet页的数据导出。本篇博客将介绍如何使用Spring Boot集成EasyExcel库来实现这些高级数据导出功能。

2023-09-13 17:36:57 976 2

原创 基于注解优雅的实现接口幂等性

当多个并发请求同时访问同一个接口时,为了确保接口的幂等性,我们可以使用 Redisson 分布式锁来保证接口在同一时刻只能被一个请求处理。通过使用注解来简化代码实现,可以更方便地应用于不同的接口方法。本文将介绍如何使用 Redisson 分布式锁实现接口幂等性,并通过自定义注解来进行统一管理。我们将使用 Spring Boot 框架作为示例。

2023-08-17 13:37:06 391

原创 MySQL事务及隔离级别

我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。

2023-07-27 10:43:15 191

原创 MySQL 存储引擎

MySQL是广泛使用的关系型数据库管理系统,它提供了InnoDB, MyISAM, MEMORY (HEAP), NDB Cluster, ARCHIVE, CSV,等多种存储引擎供用户选择。选择适合的存储引擎对于数据库性能和功能的优化非常重要。在本文中,我们将深入探讨几种常见的MySQL存储引擎,以帮助读者了解它们的特点和适用场景。

2023-07-26 14:30:57 282

原创 MySQL索引优化

MySQL索引优化是提高数据库查询性能的重要步骤。索引是一种数据结构,用于加速数据库表的数据检索操作。当数据库表中的数据量增加时,索引的优化变得尤为重要,因为它可以减少查询的执行时间,从而提高系统的响应速度。

2023-07-26 13:21:06 151

原创 MySQLExplain详解

MySQL的EXPLAIN是一个用于查看查询执行计划的命令。它可以帮助开发者分析查询语句的执行过程,了解MySQL是如何处理查询语句的,包括使用了哪些索引、执行顺序、数据访问方式等。通过执行EXPLAIN命令,可以优化查询语句,提高查询性能和效率。

2023-07-26 10:15:48 187

原创 MySQL 索引的优缺点及索引注意事项

索引是数据库优化的重要手段,可以显著提高查询性能,但需要谨慎使用,合理使用索引是提高数据库查询性能的关键。正确选择索引列,避免过度索引,定期维护和优化索引都是确保索引的有效性和性能的关键因素,并根据具体业务需求和数据访问模式来选择合适的索引策略。

2023-07-25 19:56:31 427

原创 从原理到实践,分析 Redisson 分布式锁的实现方案(二)

上篇讲解了如何用 Redis 实现分布式锁的方案,它提供了简单的原语来实现基于Redis的分布式锁。然而,Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。

2023-07-25 16:59:47 1400

原创 @Import详解及@Import注入对象的四种方式

@Import的使用方式有4种:直接导入类,导入配置类来导入Bean,导入 ImportSelector 的实现类,导入 ImportBeanDefinitionRegister 的实现类。从注释来看,@Import注解只可以标注在类上,可以结合 @Configuration注解、ImportSelector、ImportBeanDefinitionRegistrar一起使用,也可以导入普通的类。

2023-06-26 09:48:44 3703

原创 从原理到实践,分析 Redis 分布式锁的多种实现方案(一)

分布式锁是一种用于在分布式系统中协调多个进程或线程之间对共享资源的互斥访问的机制。在分布式系统中,由于各个节点之间没有共享内存,因此无法使用传统的本地锁机制来实现进程或线程的同步,所以需要使用分布式锁来解决这个问题。举一个生活中的例子,假设我们去乘坐高铁,首先要进行检票进站,但有很多人都想进站。为了避免大家同时挤进去,高铁站会设置检票闸机,每次只允许一人检票通过,当有人检票进入时,其他人必须等待,直到检票成功进入后,闸机会再次反锁。后面的人再尝试检票获取检票闸机的进入权。这里的检票闸机

2023-06-15 14:33:54 1776

原创 SpringBoot 集成 canal

Canal 是用 Java 开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,Canal 主要支持了 MySQL 的 Binlog 解析,解析完成后才利用 Canal Client 来处理获得的相关数据。

2023-06-14 10:43:37 1884

原创 IDEA快捷键大全及Eclipse快捷键大全

本篇包含了 IntelliJ IDEA 中常用的快捷键及Eclipse 中常用的快捷键。

2023-06-08 15:58:35 2395

原创 @Transactional详解

@Transactional 是 Spring 框架中的一个注解,用于声明一个方法需要进行事务处理。通过在方法上加上 @Transactional 注解,表示该方法需要被包装成一个事务,并由 Spring 容器统一管理、控制和回滚事务。@Transactional 注解可以用于类或方法级别上,并且可以指定特定的事务属性,如传播行为、隔离级别、是否只读等。也可以使用默认值,即使用默认的事务管理器和默认的事务属性。使用 @Transactional 注解可以方便地在 Spring 中实现对目标方法的事务

2023-06-08 14:55:27 3130

原创 Java8 Stream详解及结束操作方法使用示例(三)

Stream 结束操作方法是指在处理完 Stream 流中的元素后,返回一个非 Stream 对象的操作,也称为终止操作。这些操作通常会触发 Stream 流元素的遍历计算,并将计算结果返回。

2023-06-07 20:18:03 2000

原创 Java8 Stream详解及创建流方法使用示例(二)

创建流指的是将一个集合或其他数据源转换为 Stream 流对象的过程。通常情况下,我们可以使用 Stream 类的静态方法来创建流对象,如 Stream.of()、Collections.stream() 等。这些方法将返回一个 Stream 流对象,该对象可用于对数据进行各种操作。下面是一些常用的创建流的方法

2023-06-07 20:02:47 731

原创 Java8 Stream详解及中间操作方法使用示例(一)

Stream 是 Java 8 中引入的一个新的概念,它代表着一种元素序列的表现形式。具体来说,它是对集合和数组等数据源的抽象,类似于 I/O 流,但它不会改变数据源本身。Stream 的出现使得我们可以更方便、更高效地对数据进行操作,它可以帮助我们轻松地实现过滤、映射、排序、统计等操作,同时还能够支持并行处理,大大提高了程序的效率。

2023-06-07 19:39:09 1266

原创 ConcurrentLinkedQueue详解

ConcurrentLinkedQueue是Java中的一个线程安全队列,它提供了基于链表的FIFO(先进先出)队列实现。用于高并发场景中的元素存储和获取,能够保证多线程环境下队列操作的顺序性和线程安全性。ConcurrentLinkedQueue一般不会使用锁来实现线程安全,而是采用了一些比较轻量级的算法,如CAS(比较-交换)算法等来保证线程安全。这大大减少了线程之间的等待和竞争,从而提高了系统的并发能力和性能。

2023-06-01 16:17:20 1411

原创 Java8 Collectors类详解(二)

Collectors 类是用于对流进行收集和汇总的工具类。它提供了许多方法来对流进行分组、统计、转换、分区、连接、归约等操作,使得处理集合类数据变得更加方便。 在使用 Collectors 类时,我们可以通过调用其中的方法来实现对流的不同处理方式。例如,将流中的元素收集到一个 List 中,可以使用 toList() 方法;按照指定条件进行分组,可以使用 groupingBy() 方法;统计流中的元素个数,可以使用 counting() 方法等等。

2023-06-01 10:31:21 2514

原创 Java8 Collectors类详解(一)

Collectors类是用于对流进行收集和汇总的工具类。它提供了许多方法来对流进行分组、统计、转换、分区、连接、归约等操作,使得处理集合类数据变得更加方便。在使用Collectors类时,我们可以通过调用其中的方法来实现对流的不同处理方式。例如,将流中的元素收集到一个 List 中,可以使用toList()方法;按照指定条件进行分组,可以使用方法;统计流中的元素个数,可以使用counting()方法等等。此外,Collectors类还支持自定义收集器,即我们可以根据自己的需求来编写实现了。

2023-05-31 14:08:13 4345 4

原创 CompletableFuture获取执行结果的方法

使用 CompletableFuture 中获取执行结果的方法时应该避免阻塞主线程,因为它们都可能会导致线程阻塞,影响程序的整体性能和响应能力。因此,在实际使用中我们应该结合 CompletableFuture 的回调函数或者连续的异步操作等方法,来实现非阻塞的异步计算和结果处理。

2023-05-30 14:04:52 6051

原创 CompletableFuture详细介绍及方法使用示例(二)

对于 CompletableFuture 这个类,它是 Java 并发编程中的重要组件之一,它能够帮助我们更加方便和灵活地处理异步任务,提高程序的执行效率和吞吐量。首先,CompletableFuture 是一种可以用于异步计算的 Future,它提供了丰富的方法来处理异步任务的结果。与传统的 Future 不同,CompletableFuture 可以通过回调函数或者连续的异步操作来处理任务结果,而无需在等待任务完成时一直阻塞线程。这使得我们可以更加灵活地编写并发代码,避免线程阻塞和死锁等问题。

2023-05-30 11:19:07 633

原创 Java线程之间如何通信的,有哪些方式?

尽可能避免共享变量,因为共享变量容易引起线程安全问题。对共享变量的访问需要加锁,以保证同步访问。避免死锁问题的发生。使用锁时需要特别注意加锁和释放锁的顺序。使用条件变量时,应该确保线程在调用 await() 方法之前已经获取了锁。否则,在等待条件成立的过程中,其他线程可能会修改共享资源,导致程序出现错误。在使用信号量时,需要正确设置信号量的个数和调用 acquire() 和 release() 方法的顺序,否则可能会出现线程阻塞或信号量无法释放的情况。管道的使用需要注意线程之间的数据传输方式,以及缓冲区的

2023-05-29 17:37:32 5348

原创 CompletableFuture详细介绍及方法使用示例(一)

CompletableFuture是Java 8中引入的一种实现异步编程模型的方式,它是Future的扩展,提供了更强大、更灵活的功能。CompletableFuture可以表示两个异步任务之间的顺序关系或并行关系,同时提供了一些方便的工具方法来组合这些关系。

2023-05-25 11:04:01 6068

原创 Java Stream对象并行处理方法parallel()

通常情况下,Stream API上的大多数操作都是顺序执行的,也就是说操作一个元素,然后再操作下一个元素。需要注意的是,并行计算不一定总是比串行计算更快,因为创建线程以及进行线程间通信的开销也是很大的。同时,在使用并行流时,需要确保Stream的操作是无状态或者线程安全的,否则可能会导致意外的结果。具体来说,Stream的parallel()方法可以将一个顺序流转换为一个并行流。使用并行流时,不需要手动设置线程数,因为Java会自动根据CPU核心数瓶颈以及程序的处理需求设置最优的线程数。

2023-05-24 13:49:51 5983

原创 JDK11相比JDK1.8有哪些新特性

Java 11 相比 Java 8 引入了许多新的语言特性和 API,例如HTTP API的改进,包括对HTTP/2和WebSocket的支持,ZGC(可伸缩低延迟垃圾收集器)的引入,提供更好的大内存处理能力。

2023-05-18 20:18:38 4645

原创 JVM如何定义垃圾对象

JVM 通过垃圾回收器 (Garbage Collector) 来判断哪些对象是垃圾对象。JVM 垃圾回收器使用的算法有很多,其中最常用的是引用计数算法和可达性分析算法。

2023-05-17 09:00:39 128

原创 垃圾收集算法与GC垃圾回收器

在JVM中,垃圾回收器可以按照并行和串行两种方式工作。串行垃圾回收器一次只能使用一个线程进行垃圾回收,也就是在垃圾回收期间,JVM将停止应用程序的执行,直到垃圾回收完成为止。这种回收器适用于单处理器环境下或者是在较小的堆内存中使用。并行垃圾回收器会使用多个线程来加快垃圾回收的速度。这种回收器通常比串行垃圾回收器速度更快,但需要更多的CPU和内存资源。在垃圾回收期间,应用程序可能需要被暂停,但停顿时间比串行垃圾回收器要短。

2023-05-16 14:35:52 68

原创 JVM类加载机制

Java的双亲委派机制可以有效地确保类的安全和一致性,促进类加载器的合理组织和设计,使得Java应用程序具有更高的可靠性、安全性和可扩展性。

2023-04-21 14:27:51 143

原创 深入理解CAS

CAS(Compare and Swap,比较并交换)是一种乐观锁技术,用于实现多线程环境下的原子操作。CAS操作包括三个参数:内存地址V、期望值A和新值B。当且仅当V的值等于A时,才将V的值设置为B,否则什么也不做。即针对一个变量,首 先比较它的内存值与某个期望值是否相同,如果相同,就给它赋一个新值。

2023-04-19 16:01:11 73

原创 Java线程池execute()和submit()方法的区别

execute()更加简单直接,适用于不需要关心任务的返回值以及异常处理的情况,而submit()则更加灵活,适用于需要获取任务的执行状态、结果,并进行相应的处理的情况。

2023-04-19 11:02:43 1009

空空如也

空空如也

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

TA关注的人

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