- 博客(40)
- 收藏
- 关注
原创 基于fegin远程调用的重试功能
在微服务场景中,可能因为系统中网络抖动,导致调用超时或者失败, 按照我们分布式事务角度来看的话, 如果我们在业务中只调用了一次远程的服务查询(只去查询用户服务的某个信息),如果查询失败, 从而导致整个业务回滚, 这种代价是我们不想看到,所以我们就可以基于fegin的远程调用, 提高成功的可能性, 尽可能的避免回滚。
2024-06-05 23:13:59
783
原创 CompletableFuture的底层他是如何实现的
CompletableFuture是Java8中引入的新特性,像我们平常遇到的, 某一个计算过程依赖于另外一个计算过程的结构,这些结构就类似于一种链表的形式来体现,每一个阶段都代表着一种异步的操作, 然后这些阶段又是相互依赖的, 基于一种链式的操作.官方点来解释就是每个 CompletableFuture 都有一个与之关联的 Completion 链,它可以包含多个 Completion 阶段,每个阶段都代表一个异步操作,并且可以指定它所依赖的前一个阶段的计算结果。
2024-06-04 22:45:44
493
原创 Java中基于AOP注解的方式实现分布式锁
基于AOP的方式来实现分布式锁,主要是为了简化锁的开发,也可以方式事务的粒度大于锁的粒度, 导致出现数据不一致的问题,也能使得代码更加优雅规范,话不多说咱们上代码。1.第一步 导入pom依赖,根据自己项目实际情况来。2.第二步 自定义注解。3.第三步,自定义切面。
2024-05-28 16:08:00
714
原创 什么是SPI,和API有啥区别
SPI是一种特殊类型的接口,用于服务的提供者和消费者之间动态解耦。它允许第三方为一个已存在的接口提供多种实现,并且这些实现可以在运行时被发现和加载,从而实现了高度的可插拔性和扩展性。Java 中区分 API 和 SPI,通俗的讲:API 和 SPI 都是相对的概念,他们的差别只在语义上,API 直接被应用开发人员使用,SPI 被框架扩展人员使用。: 通常由服务提供者(如库、框架的开发者)实现,而服务消费者(可能是应用开发者或其他框架)则通过SPI机制发现并使用这些实现。
2024-05-26 22:15:45
1130
原创 泛型中K T V E ? Object等分别代表的含义
Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。S、U、V – 这几个有时候也有,这些字母本身没有特定的含义,它们只是代表某种未指定的类型。E – Element (在集合中使用,因为集合中存放的是元素)– 表示不确定的java类型(无限制通配符类型)T – Type(Java 类)N – Number(数值类型)V – Value(值)
2024-05-25 22:26:27
625
原创 数据库缓存 buffer pool详解
buffer pool, 又称之缓存池, 是mysql中为了提升查询性能而引入的缓存, 如果每次查询和修改都去操作磁盘的话, 性能就会很差, 从而引入Buffer Pool包含多个缓冲页(默认大小通常为16KB),每个缓冲页都有对应的控制信息,如表空间编号、页号等。当数据库请求数据时,首先会在Buffer Pool中查找所需的数据页。如果找到了(称为缓存命中),则直接使用该数据;
2024-05-24 23:40:02
757
原创 分库分表后如何进行分页查询
在我们做了分库分表之后,数据会散落在不同的数据库中,这时候跨多个库的分页查询、以及排序等都非常的麻烦。如果分的库不多,那么我们还可以通过扫表的方式把多个库中的数据都取出来,然后在内存中进行分页和排序。比如我要查询limit 100,100 的话,有三个库,那我就分别到这三个库中把0 - 200之间的数据都取回来,然后再在内存中给他们排序,之后,再取出第100-200之间的数据。这种做法非常的麻烦,而且随着偏移量越大,当要分的页很多的时候,可想而知这种方法根本就不靠谱。
2024-05-23 23:36:28
1229
原创 Mybatis-Plus分页插件如何实现的
MyBatis-Plus支持分页插件——PaginationInnerInterceptorPaginationInnerInterceptor采用的是物理分页方式,物理分页是在数据库中进行分页,即直接在SQL语句中加入LIMIT语句,只查询所需的部分数据。物理分页的优点是可以减少内存占用,减轻数据库的负载,缺点是无法对结果进行任意操作,比如说在分页过程中做二次过滤、字段映射、json解析等。
2024-05-22 22:16:29
740
原创 限流、降级、熔断有什么区别
目的:限制系统处理请求的速率,确保系统不会因为过载而崩溃。实现:通过对单位时间内允许通过的请求数量进行限制,比如使用令牌桶或漏桶算法。当请求超过设定的阈值时,超出的请求会被拒绝、排队或返回错误信息。应用场景:一般是被调用方对调用方进行限流。举个例子,我提供了一个查询用户信息的服务,给集团内外的很多个调用方使用,但是我为了保证我的可用性,我会对每个调用方做限流,防止某个调用方不守规矩,把我的服务打挂了。
2024-05-21 23:29:28
671
原创 Spring的事务传播机制
在复杂的业务场景中,多个事务方法之间的调用可能会导致事务的不一致,如出现数据丢失、重复提交等问题,使用事务传播机制可以避免这些问题的发生,保证事务的一致性和完整性。默认的传播机制是REQUIRED,如果不存在事务则开启一个事务,如果存在事务则加入之前的事务,总是只有一个事务在执行,每次执行新开一个事务,如果当前存在事务,则把当前事务挂起,有事务则加入事务,没有事务则普通执行,有事务则暂停该事务,没有则普通执行,强制有事务,没有事务则报异常,有事务则报异常。
2024-05-20 21:16:54
614
原创 JVM是如何判断内存是否存活
JVM有两种算法来判断对象是否存活,:给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题。循环引用会导致对象无法被回收,最终会导致内存泄漏及内存溢出。
2024-05-18 22:09:24
1022
原创 自定义一个starter
ConditionalOnProperty(prefix = XxlJobProperties.PREFIX, value = "enabled", havingValue = "true")约定了当我们配置了spring.xxl.job.enable=true的时候才会生效。以上就定义好了一个starter,只需要在需要的地方引入,并且配置上相应的配置项就行了,配置项内容就是我们定义在XxlJobProperties中的。这里我们以自定义一个xxl-job的starter为例,介绍下如何简化配置。
2024-05-15 21:27:02
563
原创 Spring 中的 Bean 作用域
如我们定义类的成员变量的时候使用的public、private等这些也是作用域的概念。Spring的Bean的作用域,描述的就是这个Bean在哪个范围内可以被使用。不同的作用域决定了了 Bean 的创建、管理和销毁的方式。在 ServletContext 的生命周期内,只创建一个 Bean 实例。在 Websocket 的生命周期内,只创建一个 Bean 实例。每个 HTTP 请求都会创建一个新的 Bean 实例。每个 HTTP 会话都会创建一个新的 Bean 实例。适用于全应用程序级别的共享数据。
2024-05-14 22:20:35
507
原创 HashMap详解
哈希冲突(Hash Collision或Hash Conflict),也称为哈希碰撞,是指在使用哈希表这一数据结构时,两个或更多的不同键(关键字)通过哈希函数计算后得到相同的哈希值,从而被映射到哈希表中的同一位置。因为哈希表的理想情况是每个键值对都能直接根据哈希值定位到一个唯一的位置上,所以哈希冲突是哈希函数的非唯一性导致的必然现象,尤其是在哈希表大小有限的情况下。
2024-05-13 23:48:03
1212
原创 布隆过滤器详解
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,由伯顿·布隆(Burton Howard Bloom)在1970年提出。它主要用于测试一个元素是否属于某个集合,尽管存在一定的误报率(false positive rate),但不会产生误删(false negative),即如果布隆过滤器报告一个元素可能在集合中,这可能是错误的;但如果它报告元素肯定不在集合中,那一定是正确的。
2024-05-12 22:11:29
643
原创 分布式事务?哪几种方式实现?一文看懂!
分布式事务是指在分布式系统中涉及到多个数据库或多个应用程序之间的事务处理,这些数据库或应用程序可能分布在不同的物理节点上,甚至可能位于不同的地理位置。在分布式事务中,需要确保所有参与者的事务操作都能够保持一致性,即所有参与者的事务要么全部提交成功,要么全部回滚。举个例子, 比如说我们在是春晚的直播舞台, 每个城市的场地需要安排乐队、灯光、音响等。为了确保音乐会成功,每个地方的准备工作必须协调一致,要么所有城市都准备妥当顺利开演,要么任何一个地方出问题了,所有城市都取消。
2024-05-11 22:46:34
1983
原创 一次完整的GC流程
Java的堆由新生代(Young Generation)和老年代(Old Generation)组成。新生代存放新分配的对象,老年代存放长期存在的对象。新生代(Young)由年轻区(Eden)、Survivor区组成(From Survivor、To Survivor)。默认情况下,新生代的Eden区和Survivor区的空间大小比例是8:2,可以通过-XX:SurvivorRatio参数调整。
2024-05-10 23:31:25
1090
2
原创 MySQL中的事务隔离级别
在RR这种隔离级别下,当我们使用快照读进行数据读取的时候,只会在第一次读取的时候生成一个Read View,后续的所有快照读都是用的同一个快照,所以就不会发生不可重复读的问题了。所以,这种隔离级别是可以避免脏读的发生的。InnoDB的RR级别中,基于MVCC+间隙锁,是在某种程度上是可以避免幻读的发生的,但是没有办法完全避免,当一个事务中发生当前读的时候,会导致幻读的发生。Serializable)是最高的隔离级别,前面提到的所有的隔离级别都无法解决的幻读,在可串行化的隔离级别中可以解决。
2024-05-09 21:51:41
656
1
原创 如何实现本地缓存
本地缓存是一种数据存储技术,它将数据暂时存储在本地的物理内存(如RAM)或者其他快速访问的存储介质中,以便快速检索,减少对远程数据源(如数据库或外部API)的访问需求。这种技术能够显著提升数据读取速度,降低网络延迟,减少外部系统负载,并提高应用程序的整体性能和响应能力。
2024-05-08 23:45:44
856
原创 三色标记法详解
三色标记法可以在不同类型的垃圾回收器中实现,如CMS(Concurrent Mark-Sweep)和G1(Garbage First)中,尤其是那些追求减少“Stop-The-World”暂停时间的收集器,通过并发标记的方式提高应用的响应速度。:在这个过程中,垃圾回收器会从灰色对象开始遍历整个对象图,将被引用的对象标记为灰色,并将已经遍历过的对象标记为黑色。这个过程中,垃圾回收器会从灰色对象重新开始遍历对象图,将被引用的对象标记为灰色,并将已经遍历过的对象标记为黑色。因此,初始标记阶段的时间比较短。
2024-05-07 21:31:19
1154
1
原创 Redis的几种集群模式
哨兵节点是一种特殊的Redis节点,用于监控主节点和从节点的状态。当主节点发生故障时,哨兵节点可以自动进行故障转移,选择一个合适的从节点升级为主节点,并通知其他从节点和应用程序进行更新。原来的主从架构中,引入哨兵节点,其作用是监控Redis主节点和从节点的状态。当Sentinel检测到主节点故障时,它可以自动进行故障转移,将一个从节点提升为主节点,从而实现自动的故障恢复,保证系统的高可用性。它会从所有健康的从节点中选举一个新的主节点,并将所有从节点切换到新的主节点,实现自动故障转移。
2024-05-06 23:36:34
694
原创 NIO BIO AIO详解
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。线程发起IO请求后,不需要阻塞,立即返回,也不需要定时轮询检查结果,异步IO操作之后会回调通知调用方。
2024-05-05 23:42:48
524
3
原创 MySql中深度分页的问题
MySql深度分页的问题,就是比如我们需要所查询出的表数据量较大,需要进行查询结果返回集的后面部分,所出现的性能问题。比如说我们有一个一百万数据量的表,我们分页需要查询99990,10,数据库通常情况下会先扫描前99990条数据, 再进行分页返回最后10条,这样就会导致查询接口性能变慢,随着OFFSET值的增大,查询性能会显著下降。这是因为MySQL需要扫描从第一条记录到OFFSET指定的位置,然后返回LIMIT数量的结果,这在大数据集中会导致大量的磁盘I/O操作和较慢的查询响应时间。
2024-05-02 20:39:46
986
1
原创 Java中线程池的详解以及各个参数的含义
Java中的线程池是通过类实现的,它是Executor框架中的一个核心组件,用于管理和控制线程的创建、执行和销毁。线程池的主要优势在于能够复用线程,减少线程创建和销毁的开销,同时还可以根据系统的负载动态调整线程数量,以达到优化资源使用和提升系统响应性的目的。: 所有线程池的接口,只有一个方法。: 增加Executor的行为,是Executor实现类的最直接接口。: 提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService 接口。
2024-05-01 23:48:34
1146
1
原创 MySql中什么是回表? 如何减少回表的次数
所谓的回表,就是指的是我们根据非主键索引,找到主键的值,再根据主键的值, 找到该索引上对应的叶子节点的值, 这个过程我们称之为回表,其实也很好理解再INNERDB中, 我们使用的主键索引查询的时候效率更高, 因为直接拿到对应这一行的数据, 不需要回表,比如索引覆盖和索引下推技术, 也可以减少回表的次数首先我们创建一个组合索引索引下推:查询过程中,比如我们有一个组合索引首先mysql会先查询到key1=123的列, 再根据这些列返回对应的key2和key3符合条件的值进行筛选。
2024-05-01 00:42:17
646
1
原创 如何统计一个Bean中的方法调用次数
在这里, 我们可以通过SpringAOP的方式来统计Bean的调用方式,每次执行方法前或者后进行几次计数统计。这个主要就是考虑好如何避免并发情况下不准,以及如何使用AOP实现代理。接下来我们只需要在被统计的bean添加注解可以了。
2024-04-30 00:15:00
395
原创 如何基于SpringEvent做事件驱动
这里我们需要注意一点, 用到@Async中最好使用自定义的线程池, @Async中关于线程池的使用部分在AsyncExecutionInterceptor中,在这个类中有一个getDefaultExecutor方法, 当我们没有做过自定义线程池的时候,就会用SimpleAsyncTaskExecutor这个线程池。并发大的时候会产生严重的性能问题。Spring框架中的事件机制建立在观察者模式的基础上,允许应用程序中的组件注册监听器来监听特定类型的事件,并在事件发生时执行相应的操作。定义一个事件的监听者。
2024-04-29 00:18:04
587
原创 mysql有哪几种锁
这样,其他的事务获取表锁的时候吗可以基于意向锁来判断是否有其他事务是否加过锁, 并且根据类型来判断是否能获取锁, 这样的优点是可以在不阻塞其他事务的情况下, 为当前事务锁定, 防止并发操作时带来的问题。注意, 这条会对命中的所有数据的索引 添加排他锁, 当没有索引时会锁表, 当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。锁定整个数据表,不论事务涉及表中的多少行,都会锁定整个表。分为意向共享锁(IS)和意向排他锁(IX) 为上方的共享锁和排他锁的条件。
2024-04-27 20:18:20
726
原创 什么是数据库的ACID? 以及mysql是如何保证的
1.原子性(Atomicity):要求事务作为一个不可分割的最小工作单位执行。事务中的所有操作要么全部成功完成,要么全部不发生(回滚)2.一致性(Consistency):每个事务都必须从一个有效状态转换到另一个有效状态,不会破坏数据库的整体逻辑结构3.隔离性(Isolation):每个事务之前都是相互隔离的 互补影响 通常采用锁机制、时间戳、多版本并发控制(MVCC)等技术来管理并发事务4.持久性(Durability)
2024-04-26 21:06:42
314
2
原创 如何实现百万级数据从Excel导入到数据库
我们要知道 导入功能数据量一旦大起来的话, 批量插入数据库, 就会出现很多问题,1. 比如说 excel文件会很大, 如果一次加载到内存中, 如果jvm设置的内存不足以支撑, 就会导致内存溢出2.百万级数据读取时, 我们进行业务操作, 导入到数据库这一操作, 插入的会导致很慢, 同时也需要考虑性能问题。
2024-04-25 22:39:04
1864
1
原创 ThreadLocal详解。以及对应会出现的问题
ThreadLocal为java下的一个类,主要用于解决线程间数据隔离的问题。简单来说,它为每个线程提供了一个独立的变量副本,使得每个线程在访问该变量时,实际上获取到的是自己线程独有的副本,而不是其他线程可见的共享变量。这样就避免了线程间的竞态条件和数据同步问题,尤其适用于那些需要在线程内保持状态,但又不希望这个状态被其他线程干扰或者影响的情况。总结来说 就是可以用来解决多线程程序中并发问题, 每个线程共享一个变量来保证各个线程之间的变量访问与修改, 其中线程之间互相不影响。
2024-04-23 19:44:30
887
原创 Java注解的作用是啥?以及其中构成?如何通过自定义注解实现日志打印
java注解用于为java代码提供一些元数据,是一种标识, 通常作用在一个类或者一个字段 通常情况下 是和反射AOP结合起来使用, 在开发过程中这一方面我们是基础借出到的 中间件都会定义注解, 跟在 @ 符号后面的通常是注解的名称,如 @Override、@Deprecated、@Table、@Column 等。4.@Retention 指定被作用的类的注解的生命周期, 选择在源代码、编译或运行时候保留选项,有三个可选的枚举值 SOURCE,CLASS,RUNTIME, 默认是CLASS。
2024-04-22 17:17:14
379
原创 Java中动态代理如何实现,以及与静态代理的区别
Java中 的动态代理, 基本是我们都会用到, 但其实感知不会那么明显, 主要的应用层面是SSM那一套比较熟悉, 例如AOP Servlter中的过滤器(MVC中的拦截器其实关系并不大,他更像是一种中间件),.mybatis中的分页插件, 或者说是我们针对分页参数的初始化操作, 事务,日志,权限,都离不开动态代理的身影子JDK动态代理片段
2024-04-21 18:05:31
596
1
原创 Java的反射机制? 为什么反射慢
Java反射机制是一种在运行时分析类、接口、字段和方法的能力,允许程序在运行时动态地创建对象、访问和修改它们的私有属性、调用方法、处理泛型信息等。这种机制为程序提供了高度的灵活性,使开发者能够在不知道具体类型信息的情况下操作对象,或者在运行时根据条件决定如何操纵对象 总结来说, 就是在程序运行时, 能够利用反射机制来获取这个对象的所有信息,包括属性与方法。
2024-04-20 22:10:15
490
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人