自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Cloud Gateway常见问题总结

Spring Cloud Gateway 属于 Spring Cloud 生态系统中的网关,其诞生的目标是为了替代老牌网关Zuul。准确点来说,应该是 Zuul 1.x。Spring Cloud Gateway 起步要比 Zuul 2.x 更早。为了提升网关的性能,Spring Cloud Gateway 基于 Spring WebFlux。Spring WebFlux 使用 Reactor 库来实现响应式编程模型,底层基于 Netty 实现同步非阻塞的 I/O。

2023-10-06 21:12:50 211

原创 Redis的生产问题

缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。举个例子:某个黑客故意制造一些非法的 key 发起大量请求,导致大量请求落到数据库,结果数据库上也没有查到对应的数据。也就是说这些请求最终都落到了数据库上,对数据库造成了巨大的压力。缓存击穿中,请求的 key 对应的是热点数据,该数据。

2023-10-05 21:01:02 81

原创 分布式事务

什么是事务:事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。本地事务:​在本地事务中大多是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。数据库事务的四大特性:ACIDA(Atomic):原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。C。

2023-09-27 10:03:07 67

原创 多线程详解

进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。

2023-09-25 21:02:24 47

原创 基于 Redis 实现分布式锁

这是一种最简易的 Redis 分布式锁实现,实现方式比较简单,性能也很高效。就比如应用程序遇到一些问题比如释放锁的逻辑突然挂掉,可能会导致锁无法被释放,进而造成共享资源无法再被其他线程/进程访问。因为 Redis 在执行 Lua 脚本时,可以以原子性的方式执行,从而保证了锁释放操作的原子性。为了防止误删到其他的锁,这里我们建议使用 Lua 脚本通过 key 对应的 value(唯一值)来判断。方法),如果 key 不存在的话,才会设置 key 的值。不然的话,依然可能会出现锁无法被释放的问题。

2023-09-21 21:06:09 42

原创 分布式锁介绍

悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。在多线程环境中,如果多个线程同时访问共享资源(例如商品库存、外卖订单),会发生数据竞争,可能会导致出现脏数据或者系统问题,威胁到程序的正常运行。从图中可以看出,这些独立的进程中的线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到分布式锁访问共享资源。

2023-09-19 20:52:51 30

原创 Spring事务详解

事务是逻辑上的一组操作,要么都执行,要么都不执行。相信大家应该都能背上面这句话了,下面我结合我们日常的真实开发来谈一谈。我们系统的每个业务方法可能包括了多个原子性的数据库操作,比如下面的方法中就有两个原子性的数据库操作。这些原子性的数据库操作是有依赖的,它们要么都执行,要不就都不执行。事务能否生效数据库引擎是否支持事务是关键。比如常用的 MySQL 数据库默认使用支持事务的innodb引擎。但是,如果把数据库引擎变为myisam,那么程序也就不再支持事务了!事务最经典也经常被拿出来说例子就是转账了。

2023-09-18 21:22:41 33

原创 SpringBoot自动装配原理

SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的文件,将文件中配置的类型信息加载到 Spring 容器,并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。没有 Spring Boot 的情况下,如果我们需要引入第三方依赖,需要手动配置,非常麻烦。但是,Spring Boot 中,我们直接引入一个 starter 即可。

2023-09-16 21:26:15 39

原创 什么是倒排索引

Elasticsearch 是建立在全文搜索引擎库 Lucene 基础上的搜索引擎,它隐藏了 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API,不过掩盖不了它底层也是 Lucene 的事实。当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的索引,才能起到最大化加快查询的目的。

2023-09-15 20:13:12 358

原创 RabbitMQ的消息丢失问题

开启生产者确认机制,确保生产者的消息能到达队列确认机制包括和当未送达到交换机我们可以通过返回的ack和nack来确认当交换机未成功路由到队列,我们可以通过自定义的回调函数来确认,每个 RabbitTemplate 只能配置一个开启持久化功能,确保消息未消费前在队列中不会丢失持久化功能分为交换机持久化队列持久化和消息持久化,我们都需要将durable设置为true开启消费者确认机制最低为auto级别manual (手动确认)auto (自动确认)none (关闭 ack)失败重试机制我们手动设置为。

2023-09-13 21:00:53 242

原创 MQ消息队列详解

指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。

2023-09-12 21:12:21 1091 1

原创 Docker常用命令

docker的常用命令一般分为:docker信息、镜像管理、容器管理。

2023-09-11 21:29:34 34

原创 HashMap源码分析

HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后的HashMap。

2023-09-09 20:22:25 39 1

原创 CAP定理

换句话说,分区容忍性是站在分布式系统的角度,对访问本系统的客户端的再一种承诺:我会一直运行,不管我的内部出现何种数据同步问题,强调的是不挂掉。换句话说,可用性是站在分布式系统的角度,对访问本系统的客户的另一种承诺:我一定会给你返回数据,不会给你返回错误,但不保证数据最新,强调只要系统能够使用,返回的结果无论对错都行。所以只剩下C、A可以选择。换句话说,一致性是站在分布式系统的角度,对访问本系统的客户端的一种承诺:要么我给您返回一个错误,要么我给你返回绝对一致的最新数据,不难看出,其强调的是数据正确。

2023-09-07 20:06:38 58 1

原创 Java IO 设计模式之工厂模式和观察者模式

内部是通过一个 daemon thread(守护线程)采用定期轮询的方式来检测文件的变化,简化后的源码如下所示。对象可以获取事件的具体信息比如文件目录下是创建、删除还是修改了文件、创建、删除或者修改的文件的具体名称是什么。(需要监听的事件)为可变长参数,也就是说我们可以同时监听多种事件。工厂模式用于创建对象,NIO 中大量用到了工厂模式,比如。NIO 中的文件目录监听服务使用到了观察者模式。(监控服务) 并绑定监听事件的方法。用于监听文件目录的变化,同一个。相关的一些内部实现)的。

2023-09-06 21:00:19 97 1

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

IO 流中的字符流和字节流的接口不同,它们之间可以协调工作就是基于适配器模式来做的,更准确点来说是对象适配器。通过适配器,我们可以将字节流对象适配成一个字符流对象,这样我们可以直接通过字节流对象来读取或者写入字符数据。更侧重于让接口不兼容而不能交互的类可以一起工作,当我们调用适配器对应的方法时,适配器内部会调用适配者类或者和适配类相关的类的方法,这个过程透明的。更侧重于动态地增强原始类的功能,装饰器类需要跟原始类继承相同的抽象类或者实现相同的接口。类适配器使用继承关系来实现,对象适配器使用组合关系来实现。

2023-09-05 18:04:55 119 1

原创 Linux常用命令

关机shutdown -h now 立刻关机shutdown -h 5 5分钟后关机poweroff 立刻关机重启shutdown -r now 立刻重启shutdown -r 5 5分钟后重启reboot 立刻重启。

2023-09-03 20:24:20 47

原创 Java IO 设计模式之装饰器模式

为了实现这一效果,装饰器类需要跟原始类继承相同的抽象类或者实现相同的接口。上面介绍到的这些 IO 相关的装饰类和原始类共同的父类是。装饰器模式通过组合替代继承来扩展原始类的功能,在一些继承关系比较复杂的场景(IO 这一场景各种类的继承关系就比较复杂)更加实用。如果我们为每一个子类都定制一个对应的缓冲输入流,那岂不是太麻烦了。这也是装饰器模式很重要的一个特征,那就是可以对原始类嵌套使用多个装饰器。(对应输出流)是装饰器模式的核心,分别用于增强。的子类比较少的话,这样做是没问题的。(字符输入流)子类的功能,

2023-09-02 19:43:53 116

原创 乐观锁和悲观锁详解

悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。// 需要同步的操作try {// 需要同步的操作高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。

2023-08-30 22:15:22 36 1

原创 Stream流介绍及常用API

stream是数据渠道,用于操作数据源(集合、数组)所生产的元素序列。这一类操作称作局和操作,它的基本流程是:​ 1、将原始数据或数组对象转换为stream流。​ 2、对stream流中的元素进行一系列的过滤、查找等中间操作(Intermediate Operations),然后 仍返回一个Stream流对象​ 3、对stream流进行统计、遍历、收集等终结操作(Terminal Operation)获取想要的结果。

2023-08-29 18:17:49 60 1

原创 try-catch-finally

当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。就比如说 finally 之前虚拟机被终止运行的话,finally 中的代码就不会被执行。在某些情况下,finally 中的代码不会被执行。另外,在以下 2 种特殊情况下,

2023-08-28 21:24:48 52 1

原创 BeanUtils.copyProperties用法

开发中经常遇到,把父类的属性拷贝到子类中,或是将两个有重复属性的类互相拷贝。很显然BeanUtils更加方便,也美观很多。BeanUtils.copyProperties是浅拷贝。浅拷贝对于基本数据类型就是直接进行值传递,在内存的另一个空间内存放,修改这个值不会影响到拷贝源的值浅拷贝对于引用数据类型就是进行的是地址传递,并没有对该对象重新开辟一个内存空间进行存放,所以对于引用数据类型的浅拷贝就相当于两个引用指向了同一个内存地址。

2023-08-26 22:30:35 928

原创 Redis的常见使用场景

Redis是一款开源的、高性能的NoSQL数据库,被广泛应用于Web应用、缓存、队列等场景中。Redis具有高性能、可扩展、可靠性高等优点,因此在大规模的Web应用中被广泛使用。

2023-08-25 22:26:43 181 1

原创 SpringBoot 自动装配

我们现在提到自动装配的时候,一般会和 Spring Boot 联系在一起。但是,实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。

2023-08-24 21:41:26 30 1

原创 Redis的“序列化“和“反序列化“

而在从Redis读取数据和向Redis写入数据时,通常需要将这些数据序列化和反序列化。在Redis内部,也需要将数据进行序列化和反序列化,从而实现数据的存储和查询。Msgpack是一种高效的二进制序列化协议,相比JSON序列化方式,数据量更小、速度更快,更适合于大规模数据的存储和传输。另外,Redis最初是使用自定义的序列化协议来进行序列化和反序列化的。Redis序列化和反序列化的主要作用是将数据结构转化为二进制格式,使其能够被传输和存储。Redis可以使用相关的Protobuf库来进行序列化和反序列化。

2023-08-23 16:32:27 2159 1

原创 Java的反射机制

通过反射,我们可以在运行时获取和操作类的属性、方法和构造函数,即使在编译时无法提前知道它们的存在。然而,反射的使用需要谨慎,因为它会失去一些编译时的类型检查和性能优化,并且可能带来一些安全风险。在Java中,反射是指通过运行时的机制来操作类或对象的属性、方法和构造函数的能力。Java中的反射API提供了一组类和接口,使开发者可以在运行时获取和使用类的信息,而不需要提前知道它们的类型。另外,像 Java 中的一大利器注解的实现也用到了反射。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。

2023-08-21 20:17:05 30 1

原创 ThreadLocal

每个线程都可以通过调用ThreadLocal的get()方法获取自己的副本,并通过set()方法设置自己的副本。通过将这些成员变量存储在ThreadLocal中,每个线程都可以获取自己的副本,从而避免了并发访问的竞争条件。每个线程都有自己的ThreadLocal变量副本,可以独立地操作变量副本,而不会影响其他线程的副本。由于每个线程都有自己的线程局部变量副本,因此线程A和线程B的局部变量值是相互独立的。维护了一个线程局部变量的副本,这个副本是存储在每个线程的。,表示你要存储的线程局部变量的类型。

2023-08-18 21:00:26 30 1

原创 “并行“和“并发“的区别

在并发中,多个任务或线程按照一定的调度策略交替运行,每个任务可能只执行了一小部分,然后切换到另一个任务,通过快速切换,给人一种同时执行的感觉。通过运行以上代码,你可以观察到并行示例中的任务是在不同的线程中同时执行的,而并发示例中的任务是交替执行的,线程池中的线程将会被多个任务共享。然后,我们循环创建10个任务,每个任务都会输出任务编号和执行任务的线程名,并且模拟了任务的执行时间。需要注意的是,并行和并发并不是互斥的概念。在并行处理的过程中,我们输出了正在执行的任务编号和执行任务的线程名。

2023-08-16 20:01:36 95 1

原创 Java中快速失败机制“fail-fast“

这个例子说明了当一个线程在迭代集合时,另一个线程对集合进行修改时,"fail-fast"机制会快速检测到并抛出异常,以防止并发修改引发的潜在问题。当一个集合被修改时(例如添加或删除元素),如果检测到其他线程在同一时刻对集合进行了修改(例如迭代器遍历集合),Java集合会立即抛出ConcurrentModificationException异常,以提醒开发人员集合的并发修改是不安全的。这种"fail-fast"机制是为了帮助开发人员尽早发现可能会引发并发修改的问题,从而避免潜在的错误。

2023-08-15 19:51:15 82

原创 Java中“==“和“equals“的区别

总结起来,"=="用于比较两个对象的引用是否相等,而"equals"用于比较两个对象的内容是否相等。在大多数情况下,我们应该使用"equals"来进行对象的比较,特别是对于需要比较内容而不是引用的类。但是,对于某些类(如String、Integer等),它们已经重写了"equals"方法,使其比较对象内容是否相等。因此,对于这些类的对象,使用"equals"方法比较更准确。"=="操作符用于比较两个对象的引用是否相等。否则,返回false。在Java中,"=="和"equals"都是用于比较对象的。

2023-08-14 20:43:12 34

空空如也

空空如也

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

TA关注的人

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