- 博客(73)
- 收藏
- 关注
原创 使用RabbitMQ实现延迟消息的完整指南
延迟消息是指消息在发送到队列后,经过设定的时间延迟再被消费。RabbitMQ 本身没有直接支持延迟队列的功能,但可以通过TTL(Time To Live)+ 死信队列(Dead Letter Queue, DLQ)的组合来实现。当消息超过TTL(消息存活时间)后,不会被立即消费,而是会被转发到绑定的死信队列,从而实现延迟处理。
2024-10-21 18:16:51
2874
1
原创 MYSQL的SQL优化
依赖注入(Dependency Injection, DI)**是软件设计中的一种设计模式,用来实现对象之间的解耦。在这种模式下,对象不需要自己创建其依赖的对象,而是将所需的依赖通过外部注入到对象中。这种方式使得代码更加模块化、灵活且容易测试。在Spring框架中,依赖注入是核心功能之一,Spring通过容器()来管理Bean,并自动将这些Bean的依赖注入给它们。
2024-10-20 23:55:04
852
原创 SpringBoot循环依赖
在Spring Boot(以及Spring框架)中,是指两个或多个Bean互相依赖,导致Spring在创建这些Bean时无法正常进行依赖注入。例如,假设有两个类A和BA依赖于B,而B又依赖于A。在这种情况下,Spring框架在尝试实例化其中一个Bean时,会发现另一个Bean尚未创建,从而产生循环依赖问题。
2024-10-20 23:53:24
824
原创 Java的Timer类
imer类是 Java 中用于的工具类,它可以在中定时执行任务或延迟执行任务。Timer类配合TimerTask使用,适合用于需要在指定时间执行一次任务或周期性地执行任务的场景。
2024-10-19 23:57:30
1240
原创 Java设计模式——适配器模式
(Adapter Pattern)是一种结构型设计模式,它用于将一个类的接口转换成客户端希望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以协同工作。适配器模式的主要目的是,特别是在使用一些已有的类,而它们的接口又不符合要求时。
2024-10-19 23:55:41
691
原创 Bean的生命周期
Spring Bean 的生命周期开始于它的定义阶段。在这一步,Spring 会将配置信息(例如 XML 文件或 Java 配置类)加载到容器中,解析出 Bean 的定义(
2024-10-17 23:53:55
976
原创 多线程中的 CAS
是一种硬件层面的原子操作,用于解决多线程并发中的数据一致性问题。它允许在没有锁的情况下进行并发编程,是许多非阻塞算法(如无锁队列、无锁栈)的核心基础。。即在更新某个变量时,先检查它的值是否符合预期,如果符合预期则进行更新,否则不进行更新。是一种高效的、无锁的并发操作,它通过硬件支持的原子操作来避免锁竞争,适合用于并发环境中的共享数据更新。CAS 操作能够极大地提升多线程性能,但也有一些缺点,比如 ABA 问题和自旋可能带来的性能问题。在 Java 中,CAS 机制广泛应用于。
2024-10-16 23:55:22
571
原创 java设计模式——装饰者模式
定义: 装饰者模式是一种结构型设计模式,它允许动态地给对象添加新的功能,而不会改变其原有的结构。与继承不同,装饰者模式通过组合而不是继承来扩展对象的功能,这样可以有效地避免类爆炸问题(多个子类的冗余)。灵活性:通过组合而不是继承来扩展对象的功能,可以在运行时选择不同的装饰者动态组合对象。复杂性增加:使用装饰者模式会增加系统中类的数量和对象的层次,增加理解和调试的难度。:实现抽象组件接口的类,内部维护一个抽象组件的引用,用于对被装饰对象进行扩展。:实现抽象组件接口的具体类,它是被装饰的对象。
2024-10-16 23:20:53
722
原创 java并发编程——AQS
Sync类继承自AbstractQueuedSynchronizer,实现了tryAcquire和tryRelease方法,这两个方法分别用于尝试获取和释放锁。在独占方式下,每次只有一个线程能获取到同步状态。MyLock类通过内部持有的Sync对象来实现Lock接口中的方法,从而提供了一个简单的独占锁实现。其使用方式是继承AQS类并实现它的几个方法,根据同步状态的实现来完成同步功能。:尝试获取资源,成功则返回true,失败则返回false。:尝试释放资源,成功则返回true,失败则返回false。
2024-10-14 23:48:47
647
原创 Java集合篇——HashMap
ConcurrentHashMap在JDK1.8之前使用分段锁保证线程安全,ConcurrentHashMap默认情况下将hash表分为16个桶(分片),在加锁的时候,针对每个单独的分片进行加锁,其他分片不受影响。ConcurrentHashMap在JDK1.8中,采用了一种新的方式来实现线程安全,即使用了CAS+synchronized,这个实现被称为“分段锁“的变种,也被称为“锁分离,它将锁定粒度更细,把锁的粒度从整个Map降低到了单个。Hashtable中的方法是同步的,所以它是线程安全的。
2024-10-13 00:00:08
490
原创 Java集合篇——List
这是由于在Java8中,ArrayList内部实现进行了一些改进,使用了些数组复制的技巧来提高性能和内存利用率,而这些技巧需要额外的8个元素的空间来进行优化。首先,我们要明白ArrayList是基于数组的,我们都知道,申请数组的时候,只能申请一个定长的数组,那么List是如何通过数组扩容的呢?而LinkedList还实现了Queue和Deque接口,该接口比List提供了更多的方法,包括offer(),peek(),poll()等。1.检查新增元素后是否会超过数组的容量,如果超过,则进行下一步扩容。
2024-10-12 23:56:32
569
原创 Java集合篇——Set如何保证元素不重复
通过垃圾回收器来对不再使用的对象完成自动的回收,垃圾回收器主要负责对堆上的内存进行回收。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。手动回收的方式相对来说回收比较及时,删除代码执行之后对象就被回收了,可以快速释放内存。在这段代码中,通过死循环不停创建Test类的对象,每一轮循环结束之后,这次创建的对象就不再使用了。在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。手动垃圾回收,由程序员编程实现对象的删除。
2024-10-11 23:58:25
569
原创 什么情况下数据库和缓存不一致?
也就是说,假如一个读线程,在读缓存的时候没查到值,他就会去数据库中查间,但是如果查洵到结果之后,更新缓存之前,数据库被更新了,但是这个读线裎是完全不知道的,那么就致最终缓存会被車新用一个“旧值“覆盖掉,这也就寻致了缓存和数据库的不一致的现象。首先,在非并发的场景中,出现不一致的问题大家都能比较容易的理解,因为缓存的操作和数据库的操作是存在一定的时间差的。所以,这就必然会存在不一致的情况。所以,对于一个读线裎来说,虽然不会写数据库,但是是会更新缓存的,所以,在一些恃殊的并发场景中,就会导致数据不一致的况。
2024-10-11 23:57:15
700
2
原创 什么是双亲委派机制?
亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,再由顶向下进行加载。案例1比如com.itheima.my.A假设在启动类加载器的加载目录中,而应用程序类加载器接到了加载类的任务。1、应用程序类加载器首先判断自己加载过没有,没有加载过就交给父类加载器 - 扩展类加载器。2、扩展类加载器也没加载过,交给他的父类加载器 - 启动类加载器。3、启动类加载器发现已经加载过,直接返回。
2024-10-10 23:57:02
442
原创 JVM垃圾回收器G1和CMS
G1有初始标记、并发标记、最终标记、筛选回收四个阶段;CMS有初始标记、并发标记、重新标记、并发清理四个阶段。以最小的停顿时间为目标进行垃圾回收,但无法处理浮动垃圾,并发收集会造成内存碎片过多。CMS使用标记-清除算法,容易产生内存碎片。:G1收集范围包括老年代和新生代,而CMS只是老年代的收集器。:G1没有浮动垃圾,CMS在并发清除阶段会产生浮动垃圾。使用标记-整理算法,进行空间整合,没有内存空间碎片。可预测垃圾回收的停顿时间,建立可预测的停顿时间模型。使用标记-清除算法,容易产生内存碎片。
2024-10-08 23:56:14
518
1
原创 redis过期策略和内存淘汰机制
定期删除是Redis主动删除策略策略.它可以确保过的key能够及时删除,但是会占用CPU资源去扫描key,可能会影响Redis的性能。惰性删除是Redis的被动删除策略,它可以节省CPU资源,但是会导致过期的key始终保存在内存中,占用存空间。:Redis默认每100ms就机抽取一些设置了过期时间的key,并检具是否过,如果过期就删除。:对设置了TTL的key ,随机进行淘汰。: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰。: 对设置了TTL的key,基于LRU算法进行淘汰。
2024-10-07 23:38:10
494
原创 集合的排序方式
Java.utiI包中的List接口l继承了Collection接口,来存放对集合,所以对这些对象拄行腓序的时候,要么让对象类己实现同类对象的比较,要么借助比较器讲行比较排序。举例:学生实体类,包合姓名和年諗性,比较时先按姓名升序排序,如槊姓名相同则按年龉升序排序。
2024-10-07 22:40:27
333
原创 守护线程Deamon
守护线程是专门为其他线程(即用户线程或前台线程)提供服务的线程。它通常不直接执行业务操作,而是在后台执行一些系统性的、辅助性的任务。
2024-10-06 23:55:55
356
原创 springboot自动配置
程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息。中默认扫描的是启动类所在的当前包及其子包)两个文件里面定义的配置类(配置类中定义了。方法,读取当前项目下所有依赖。注解将这些配置类全部加载到。自动配置原理源码入口就是。注解,在这个注解中封装了。声明当前类是一个配置类。类型的数组中,最终通过。
2024-10-06 23:51:49
246
原创 微服务获取用户信息和OpenFeign传递用户
请求,因此我们可以将用户信息以请求头的方式传递到下游微服务。考虑到微服务内部可能很多地方都需要用到登录用户信息,因此我们可以利用SpringMVC的拦截器来实现登录用户信息获取,并存入。下单的过程中,需要调用商品服务扣减库存,调用购物车服务清理用户购物车。前端发起的请求都会经过网关再到微服务,由于我们之前编写的过滤器和拦截器功能,微服务可以轻松获取登录用户信息。编写微服务拦截器,拦截请求获取用户信息,保存到ThreadLocal后放行。改造网关过滤器,在获取用户信息后保存到请求头,转发到下游微服务。
2024-10-06 21:49:15
964
原创 springboot中配置优先级
1、右键启动类,点击Edit Configuration。选择Program arguements,就是。选择Add VM options,就是。通过以上的测试,我们也得出了优先级。点击Modify options。项目当中,常见的属性配置方式有。当中运行程序时,如何来指定。系统属性和命令行参数。系统属性、命令行参数。
2024-10-06 00:43:03
383
原创 网关路由登录校验
登录校验必须在请求转发到微服务之前做,否则就失去了意义。的过滤器来执行的,而且这个过滤器是整个过滤器链中顺序最靠后的一个。则会加载当前路由下需要执行的过滤器链(Filter chain。内部代码实现的,要想在请求转发之前做登录校验,就必须了解。对请求做判断,找到与当前请求匹配的路由规则(Route。),然后按照顺序逐一执行过滤器(后面称为Filter。逻辑都依次顺序执行通过后,请求才会被路由到微服务。如图中所示,最终请求转发是有一个名为。两部分,分别会在请求路由到微服务。微服务返回结果后,再倒序执行。
2024-10-05 23:57:39
669
原创 Spring Cloud之OpenFeign的具体实践
OpenFeign基于Feign框架开发,而Feign是Netflix开源的一个声明式Web服务客户端。OpenFeign通过定义接口、注解和动态代理等方式,将服务调用的过程封装起来,使得开发者只需要定义服务接口,而无需关心底层的HTTP请求和序列化等细节。现在我们有两个服务,一个购物车服务cart-service,一个商品服务item-service,点击购物车时,需要查询商品信息。也就是上图的的ItemClient,cart-service需要调用里面的方法。方式2:声明要用的FeignClient。
2024-10-05 23:38:07
1303
原创 JVM的内存模型
刚创建的对象在新生代的 Eden区中,经过GC后进入新生代的S0区中,再经过GC进入新生代的S1区中,15次GC后仍存在就 进入老年代。这是按照一种回收机制进行划分的,不是固定的。JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建 销毁时间。如果执行 的是JAVA方法,计数器记录正在执行的java字节码地址,如果执行的是native方法,则计数器为 空。若要分代,算是永久代(老年代),以前类大多“static”的,很少被卸载或收集,现回收废弃 常量和无用的类。
2024-10-03 23:56:17
1035
原创 MybatisPlus代码生成器的使用
代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成。首先需要配置数据库地址,在Idea顶部菜单中,找到tool,(有一些ideal版本是在。然后再次点击Idea顶部菜单中的tool(有一些版本也是other),然后选择。只不过代码生成器同样要编码使用,也很麻烦。在使用MybatisPlus以后,基础的。的插件,它可以基于图形化界面完成。的plugins市场中搜索并安装。然后重启你的Idea即可使用。的代码生成,非常简单。这里推荐大家使用一款。
2024-10-02 23:19:29
451
原创 IDEA中配置启动类的Active Profiles
当我在本机启动时,想使用application-local.yaml,而不是application-dev.yaml,那么可以这样配置:(我这是添加启动类一起的,不用去点开项目找)右键启动类,选择edit configuration。如现在有以下三个配置文件。选择springboot。
2024-10-02 22:41:15
2205
原创 InnoDB与MyISAM的区别
索引保存的是数据文件的指针。主键索引和辅助索引是独立的。4. InnoDB不保存表的具体行数。执行上述语句时只需要读出该变量即可。然后再通过主键查询到数据。3. InnoDB是聚集索引。1. InnoDB支持事务。数据文件是和索引绑在一起的。一个变量保存了整个表的行数。但是辅助索引需要两次查询。通过主键索引效率很高。其他索引也都会很大。语言都默认封装成事务。
2024-10-01 23:57:55
261
原创 聊聊Mysql的MVCC
MVCC,是Multiversion Concurrency Control的缩写,翻译过来是多版本并发控制,和数据库锁一样,他也是一种并发控制的解决方案。我们知道,在数据库中,对数据的操作主要有2种,分别是读和写,而在并发场景下,就可能出现以下三种情况:读-读并发读-写并发写-写并发我们都知道,在没有写的情况下读-读并发是不会出现问题的,而写-写并发这种情况比较常用的就是通过加锁的方式实现。那么,读-写并发则可以通过MVCC的机制解决。
2024-10-01 23:55:37
1156
原创 Mysql锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资(CPU、 RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访的一致性、有 效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。MySQL中的锁,按照锁的粒度全局锁:锁定数据库中的所有表。表级锁:每次操作锁住整张表。行级锁:每次操作锁住对应的行数据。按照锁类型,可分问共享锁(读锁)和排他锁(写锁)
2024-09-29 23:39:56
736
原创 RabbitMQ消息转换器
只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:数据体积过大,有安全漏洞,可读性差。在当你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。使用我们这里可以使用一个JSON转换器。可以使消息体的体积更小、可读性更高。堪比三年模拟五年高考,又臭又长。依赖,则无需再次引入。
2024-09-13 23:19:21
550
1
原创 RabbitMQ延迟消息——DelayExchange插件
当一个队列中的消息满足下列情况之一时,可以成为死信1. 消费者使用或basic.nack声明消费失败,并且消息的requeue参数设置为false2. 消息是一个过期消息,超时无人消费3. 要投递的队列消息满了,无法投递如果一个队列中的消息已经成为死信,并且这个队列通过dead-letter-exchange属性指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机就称为死信交换机而此时加入有队列与死信交换机绑定,则最终死信就会被投递到这个队列中。死信交换机有什么作用呢?
2024-09-13 23:03:58
1054
2
原创 RabbitMQ消费者确认和重复机制
极端情况就是消费者一直无法执行成功,那么消息requeue就会无限循环,导致mq的消息处理飙升,带来不必要的压力,为了应对上述情况Spring又提供了消费者失败重试机制:在消费者出现异常时利用本地重试,而不是无限制的requeue到mq队列。如果消费者再次执行依然出错,消息会再次requeue到队列,再次投递,直到消息处理成功为止。即:当消费者处理消息结束后,应该向RabbitMQ发送一个回执,告知RabbitMQ自己消息处理状态。测试可以发现:当消息处理发生异常时,消息依然被RabbitMQ删除了。
2024-09-13 22:07:11
800
1
原创 RabbitMQ生产者重复机制与确认机制
一般情况下,只要生产者与MQ之间的网路连接顺畅,基本不会出现发送消息丢失的情况,因此大多数情况下我们无需考虑这种问题。:当网络不稳定的时候,利用重试机制可以有效提高消息发送的成功率。在开启确认机制的情况下,当生产者发送消息给MQ后,MQ会根据消息处理的情况返回不同的。3.持久消息投递到了MQ,并且入队完成持久化,返回ACK ,告知投递成功。2.临时消息投递到了MQ,并且入队成功,返回ACK,告知投递成功。1.当消息投递到MQ,但是路由失败时,通过。生产者发送消息时,出现了网络故障,导致与MQ的连接中断。
2024-09-12 11:35:24
1059
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人