自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 资源 (1)
  • 收藏
  • 关注

原创 多层时间轮实现延迟消息

多层时间轮通常包含多个时间轮,每一层的精度和范围不同。例如,第一层(细粒度)可以管理毫秒级任务,第二层(中等粒度)可以管理秒级任务,第三层(粗粒度)可以管理分钟级任务。对于单层时间轮来说,如果要拉长延迟的时间,要么增加时间轮中槽的数量,要么增大前进指针的时间间隔。:每个时间轮都有一个指针,用于指向当前时间槽,随着时间的推移指针向前移动。这里的代码实现只是一个demo,主要是为了了解其中的思想。:每个时间轮包含若干时间槽,每个槽代表一个时间片段。:每个时间槽中包含一个任务链表,用于存储定时任务。

2024-09-25 22:55:11 392

原创 时间轮实现延迟消息

时间轮的精度由每个时间槽的间隔决定。这是因为时间轮只是管理任务的到期时间,很难确保同一槽内任务的先后顺序。多层时间轮虽然扩展了定时任务的时间范围,但也增加了实现和管理的复杂度。时间轮通过时间槽来组织定时任务,时间槽的数量是固定的,这使得时间轮的内存开销是有限的,不会随定时任务数量的增多而大幅增加。时间轮非常适合管理大量定时任务,尤其是在需要处理高频率的定时任务的应用场景中,例如网络数据包重传、缓存过期和调度任务等。轮盘实现的延迟消息(也称为时间轮)是一种高效的时间调度算法,用于管理和执行时间延迟操作。

2024-09-24 21:34:37 342

原创 用idea debug时,怎么在某个map对象中再加个key value

在用idea 进行 debug时,我们经常喜欢对某行代码打断点,然后对某个对象重新设置值,以快速地实现我们预期想覆盖的场景。通常的方式是用鼠标右键点击某个对象,然后选择。进行设置值,但是如果想在map中添加新的key value,这种方式就爱莫能助了,针对这个场景,我们可以采用Evaluate Expression实现。当然了,直接通过Evaluate Expression的图标直接进入Evaluate Expression窗口,再对需要修改的对象进行修改也是可以的。

2024-02-21 20:50:03 1677

原创 数据库事务

我们在数据库表中看到的一行记录可能实际上有多个版本,每个版本的记录除了有数据本身外,还要有一个表示版本的字段,记为 row trx_id,而这个字段就是使其产生的事务的 id,事务 ID 记为 transaction id,它在事务开始的时候向事务系统申请,按时间先后顺序递增。如:拿转账来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。读的时候加共享锁,也就是其他事务可以并发读,但是不能写。

2024-02-04 22:23:47 1002

原创 commons lang包常用方法集锦

在开发代码的时候,有一些工具类帮助的情况下,会更高效的完成代码实现。我们经常用的有commons-lang和guava工具包。下面针对common-lang包下常用的几个工具类进行函数说明。

2024-01-07 22:45:17 1466

原创 函数式编程及应用

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的Java代码。Lambda 表达式描述了一个代码块(或者叫匿名方法),可以将其作为参数传递给构造方法或者普通方法以便后续执行。​()为 Lambda 表达式的参数列表(允许没有参数),->标识这串代码为 Lambda 表达式(也就是说,看到->就知道这是 Lambda),就是执行的代码,将“hello”打印到标准输出流。两者对比就可以看出代码的优雅程度。

2024-01-05 18:38:35 929

原创 es性能强悍的推演过程

es底层复用的Lucene的能力,Lucene在以前的文章中有所讲解,感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?blog本文主要讲解es的数据存储过程。Lucene中, 倒排索引一旦被创建就不可改变, 要添加或修改文档, 就需要重建整个倒排索引, 这就对一个index所能包含的数据量, 或index可以被更新的频率造成了很大的限制.

2023-11-13 19:36:36 375

原创 线程池创建、执行、销毁的原理解析

当一个线程执行完就会自动退出,但是我们知道线程池中的核心线程会一直存活着,想要一直存活,不退出程序就可以了,即循环,从上面的代码也可以看出来确实是这样的。从上面的解析可以看出,如果队列中没有任务时,小于核心数的线程(核心线程数不销毁的情况下)会一直阻塞在获取任务的方法,直到返回任务。当来第七个任务的时候,因为线程数量到最大限度了,taskQueue也满了,所以就会走拒绝策略,把其中一个任务给抛弃掉,具体抛弃哪个需要根据选择的拒绝策略来定。上面说了任务来了之后,是怎么创建线程的,又是怎么暂存任务的。

2023-11-10 18:00:54 1401

原创 JSONObject和JSONArray区别及注意事项

可以使用JSON.parse()方法,该方法会自动判断json的类型,然后调不同的方法进行反解析。若需要需要知道具体对象,通过如下的方式进一步判断就可以了。而JSONArray,顾名思义是由JSONObject构成的数组,用 [ { } , { } , …, { } ] 来表示。则会抛异常,即对象形式的json不能用parseArray进行解析,数组形式的json也不能用parseObject进行解析。JSONObject的数据是用 { } 来表示的,jsonObject对象如下。

2023-10-17 20:44:56 1423

原创 elasticsearch基本语法

elasticsearch简介基本语法索引创建索引修改索引删除索引查询简单查询精确查询条件查询Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建而成。它提供了一个快速、可扩展和分布式的全文搜索引擎,适用于各种类型的数据和用例。以下是 Elasticsearch 的一些主要特点和功能:分布式架构:Elasticsearch 使用分布式架构,可以在多个节点上存储和处理数据。它具有高可用性和容错性,可以自动处理节点故障和数据复制。

2023-10-08 16:43:50 329

原创 java中list对象拷贝至新的list对象并保持两个对象独立的方法

【代码】java中list对象拷贝至新的list对象并保持两个对象独立的方法。

2023-08-06 23:03:22 5873 1

原创 Get请求参数过多导致请求失败

这样,就可以加大请求头字节数量限制。这样虽然可以解决当前问题,但是指标不治本,对于请求参数过多的接口,最好是更换为post请求,或者从业务上思考,更换实现方式,减少类似大数据量传参。看了服务方没有打印日志,刚开始以为是客户端的问题,就在客户端侧打断点进行调试,但是结论是请求发给服务端了,并返回的结果,通过postman进行重新调佣,返回的结果如下。最后发现是tomcat默认请求头最长为8192,而get请求的参数全部在请求头里。在某几个Filter的doFilter方法打断点,请求没有走到断点处。

2023-06-17 17:26:48 1913

原创 java中堆栈的实现总结

与Stack不同,Java里的Queue不是一个类,而是一个接口。Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue,因此Java集合大致也可分成List、Set、Queue、Map四种接口体系.接口中共定义了6个主要的方法方法描述add在队列尾部插入一个元素(队列满时抛异常)offer在队列尾部插入一个元素(队列满时返回false)remove返回队列头部的对象,并从栈中移除它(队列为空时,抛异常)

2023-03-20 22:42:47 919

原创 有重复数值的旋转排序数组的搜索

已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k)上进行了,使数组变为(下标计数)。例如,在下标5处经旋转后可能变为。给你的数组nums和一个整数target,请你编写一个函数来判断给定的目标值是否存在于数组中。如果nums中存在这个目标值target,则返回true,否则返回false。你必须尽可能减少整个操作步骤。

2023-03-01 22:57:47 252

原创 “合并区间”问题解析及其思考

不管见没见过,这样的写法都是没问题的,因为数组也是一个对象,可以放在list中。super T> c),通过指定要比较哪个字段,就可以实现对二维数组的排序了。从第二个开始,比较区间左边界是否小于等于基准区间的有边界,若符合,则说明两个区间有重叠,可以聚合,也就是说两者的右边界,哪个大选哪个作为基准区间的右边界。List list 想转化为list,就可以通过list.toArray()方法直接转化为二维数组。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。//list转为二维数组。

2023-02-17 21:17:49 681

原创 跳跃游戏 II 解析

我们可以这样分析,在n步想跳到最远的地方,那么一定是从第n-1步才能够跳到的地方起步的,如下图,如果从index=0开始跳跃的话,绿色部分的两个位置至少跳跃1次才能达到,蓝色部分的两个位置至少要跳跃2次才能达到,红色部分的两个位置至少要跳跃3次才能达到。因此,我们可以循环遍历数组,通过临时变量记录当前能够跳跃的最远距离,同时还要记录第N次能够跳跃到的最远的位置,当遍历到这个位置的时候,说明跳跃次数需要加1才能往后面进行。上面是一个长度为7的数组,最少用3步就可以达到末尾:index=[0,1,4]。

2023-02-09 23:00:39 381

原创 回溯法及与深度搜索和递归概念的区别

什么时候达到了终⽌条件,树中就可以看出,⼀般来说搜到叶⼦节点了,也就找到了满⾜条件的⼀条答案,把这个答案存放起来,并结束本层递归。一般大家用深度搜索时,或多或少会剪枝,因此深度搜索与回溯法没有什么不同,可以在它们之间画上一个等号。深度搜索能够在候选答案生成到一半时,就进行判断,抛弃不满足要求的答案,所以深度搜索比暴力搜索法要快。这个题就是需要穷举出所有符合条件的答案,那么通过前面的讲述,我们就可以很容易想到用回溯法进行实现。回溯法⼀般是在集合中递归搜索,集合的⼤⼩构成了树的宽度,递归的深度构成的树的深度。

2023-02-05 21:50:33 1373

原创 搜索旋转排序数组

用二分查找就可以,只不过与常规的二分查找相比,有更复杂的判断条件。如下图,假如target介于left和mid之间,那么会有下面三种可能,所以只要把三种情况的条件找准确,那么就变成基本的二分查找了。,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。整数数组 nums 按升序排列,数组中的值。

2023-02-02 22:28:50 123

原创 有限状态机

在讲有限状态机之前,我们先了解一下什么是计算。计算,简单来说就是有一个问题,然后给出答案。比如知道边长,求正方形的面积;又比如知道两个点和已知路径,求最短路径等等,有无穷无尽的问题。如果用计算机的模型去处理这些问题的话,我们希望是统一的。那么怎么将问题统一化呢?把所有问题都变成判定问题,即是和否有限状态机,顾名思义,就是在有限个状态之间流转,即FSM的下一个状态和输出是由输入和当前状态决定的。

2023-01-08 23:05:26 2668

原创 apollo配置中心的client端分析

apollo是携程开源的一款配置中心的产品。什么是配置中心呢?我们在开发的过程中最简单的就是在代码中hard coding,写好之后直接部署到生产环境,但是这样的弊端是每次修改一个简单的配置,就需要重新改代码重新上线,极大的浪费人力。apollo的作用正是在不上线的情况下可以动态实时的修改系统的配置数据。...

2022-08-14 21:09:29 1979

原创 什么是长轮询

二是在配置中心的使用过程中,用户可能随时新增配置监听,而在此之前,长轮询可能已经发出,新增的配置监听无法包含在旧的长轮询中,所以在配置中心的设计中,一般会在一次长轮询结束后,将新增的配置监听给捎带上,而如果长轮询没有超时时间,只要配置一直不发生变化,响应就无法返回,新增的配置也就没法设置监听了。在上面长轮询的图中我们看到,客户端侧标注了一个timeout时间90s,服务端最长的hold时间是80s,两个时间只是个示例,代表的是服务端hold的时间要小于客户端设置的超时时间。那么什么是长轮询的呢?...

2022-08-05 22:41:13 6815

原创 Lucene构建索引的原理及源代码分析

​ Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。​ 在讲全文检索之前,我们先聊下数据的分类。那么什么是数据呢?提起数据,大家可能会说数据库里存的就是数据。.....

2022-06-26 21:48:48 2944

原创 CAT监控

CAT(Central Application Tracking)是一个实时和接近全量的监控系统,它侧重于对Java应用的监控。目前在中间件(MVC、RPC、数据库、缓存等)框架中得到广泛应用,提供系统的性能指标、健康状况、监控告警等。

2022-06-01 08:04:41 5834

原创 从根上理解操作系统(三)

我们在前面的文章中说过,分段是保护模式的基础,每个段都有CPL和DPL,只有当前段的CPL<=目标段的DPL,才可以访问,这正是保护模式对内核起保护作用的基础。但是用户态的两个进程,其CPL和DPL都是3,所以是理论上是可以互相访问的。所以为了互相隔离,互不影响,仅仅只有分段是不够的,还需要映射表。

2022-05-02 15:26:39 614

原创 从根上理解操作系统(二)

进程进程 = 进程资源 + 执行序列任务堆栈:每个任务有自己的64M地址空间,当一个任务刚被创建时,它的用户态堆栈指针被设置在其地址空间的靠近末端的部分。堆栈实际使用的物理内存则是由CPU分页机制确定。 每个任务都有自己的内核态堆栈,用于任务在内核代码中执行期间。其所在线性地址中的位置由该任务TSS段中ss0和esp0两个字段指定。ss0事实上任务内核态堆栈的段选择符,esp0是堆栈栈底指针。因此每当任务从用户代码转移进入内核代码中执行时,任务的内核态总...

2022-04-30 11:56:19 837

原创 从根上理解操作系统(一)

操作系统启动 在了解操作系统之前要有一个意识,那就是计算机的运行过程就是取指执行,什么意思呢?意思就是计算机会根据程序计数器的值获取代码指令然后执行它。 在启动的过程中,主要有四段程序:BIOS-> boot -> setup -> system,这四段程序由前往后依次执行。 按开机的时候,首先启动的就是BIOS程序,这段程序是提前固化在内存中的。CS和IP分别是段寄存器和偏移寄存器,CS左移4位+IP 就是寻址地址,在开机时,CS被赋...

2022-04-22 22:20:41 2488

原创 软件和硬件的关系-机器码怎么转成电路状态并执行的

一、概述机器语言是整个计算机体系中意义最深奥的接口-------它是硬件和软件相接的中间线。借由机器语言,程序员用符号指令表达的抽象思维被转换成执行在硅片上的物理操作,因此,既可以将机器语言看作编程工具,也可以将其看作硬件平台内部不可分割的一部分。存储程序的基本思想其实相当简单。计算机基于固定的硬件平台,能够执行固定的指令集。同时,这些指令能够被当成构建模块,组成任意的程序。在计算机操作的每一步,CPU从指令中取出一个字,对其进行解码,从而执行指定的指令,然后计算...

2022-01-18 22:44:46 3047 2

原创 芯片的底层原理

芯片的底层就是逻辑门电路组成的,在逻辑门的基础上不断抽象,从而组成了我们使用的计算机。所以,首先我们先了解一下门电路的底层实现。1. 门电路1.1 与门与门是两个输入,一个输出,当两个输入都是1的时候,输出才会是1,其他情况输出为0。下面通过继电器对与门的底层原理进行解释:中学物理我们学过电磁感应,就是在线圈通电的情况下,会产生磁效应。上图中我们可以看到如果两个线圈通电的话,会分别把它们上面的开关吸下来,从而使得开关闭合,那么最终就会导致灯泡...

2022-01-15 22:37:48 8203 5

原创 二分查找的边界问题一直出错?

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找的概念比较易懂,但是在实现上总是会边界考虑不周或陷入死循环的问题存在。下面介绍一种易于理解且放之四海而皆准的实现方法(不管要找的是<,<=,>,>=,都可以套用模板方法)。 先放伪代码public int searchInsert(int[] nums, int ...

2021-11-06 09:58:17 277

转载 LockSupport的park/unpark分析

https://blog.csdn.net/u013978512/article/details/120011860?spm=1001.2014.3001.5501这篇文章我们讲了AQS的实现过程,其中线程的阻塞和唤醒是通过LockSupport的park和unpark实现的,结尾抛出了个问题:唤醒在阻塞之前,会出现什么情况。答案是unpark可以在park之前,这样,被park的线程就不会阻塞,为了查看其中的缘由,发现https://www.cnblogs.com/yonghengzh/p/14280..

2021-09-08 23:10:54 454

原创 通过公平锁分析AQS

https://blog.csdn.net/chen7253886/article/details/52769111https://www.jianshu.com/p/38fe92bcca7eAbstractQueuedSynchronizer的属性有// 头结点,你直接把它当做 当前持有锁的线程 可能是最好理解的private transient volatile Node head;// 阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表p...

2021-09-04 19:13:17 295 1

原创 java多线程核心源码解析

其中ctl这个AtomicInteger的功能很强大,其高3位用于维护线程池运行状态,低29位维护线程池中线程数量https://www.cnblogs.com/trust-freedom/p/6681948.html

2021-08-29 14:55:12 502

原创 Timer源码分析

二、Timer的缺陷1、由于执行任务的线程只有一个,所以如果某个任务的执行时间过长,那么将破坏其他任务的定时精确性。如一个任务每1秒执行一次,而另一个任务执行一次需要5秒,那么如果是固定速率的任务,那么会在5秒这个任务执行完成后连续执行5次,而固定延迟的任务将丢失4次执行。2、如果执行某个任务过程中抛出了异常,那么执行线程将会终止,导致Timer中的其他任务也不能再执行。3、Timer使用的是绝对时间,即是某个时间点,所以它执行依赖系统的时间,如果系统时间修改了的话,将导致任务可能不会被执行。

2021-08-20 22:04:40 749

原创 Response Bean对象没有get方法导致无法返回参数

@RestControllerpublic class HelloController { @GetMapping("testGet") public HelloWordResp hello() { HelloWordResp helloWordResp = new HelloWordResp("a1", "a2"); return helloWordResp; }}public class HelloWordResp { pr.

2021-08-15 16:05:13 724

原创 spring plugin

在看swagger的源码的时候,发现swagger大量使用了spring-plugin,这个组件在其他地方并不常见,看了其Github:https://github.com/spring-projects/spring-plugin。被称为世界上最小的插件系统,看源码结构,可以看到确实很小,只有那么几个类而已: 下面用spring plugin写一个例子: @Configuration@EnablePluginRegistries({Vehicle....

2021-08-08 16:10:04 1907

原创 spring-kafka消费者源码分析

https://blog.csdn.net/qq_26323323/article/details/84938892这篇文章对spring-kafka消费端源码分析较为详细,可查看其customer初始化的过程。整个初始化的开始是从@EnableKafka开始讲起的初始化的工程归纳如下: 得到一个含有KafkaListener基本信息的Endpoint,最后Endpoint被封装到KafkaListenerEndpointDescriptor,KafkaListenerEndpo...

2021-07-25 09:52:25 980 3

原创 五、logback同步打印日志源码分析

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习..

2021-06-24 08:16:29 1087 1

原创 四、logback配置文件

Logger & Appender & LayoutsLogback 主要的三个类 logger,appender和layouts。这三个组件一起作用可以满足我们开发中根据消息的类型以及日志的级别打印日志到不同的地方。

2021-06-14 16:27:02 1595

原创 三、日志初始化的过程

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档日志初始化过程分析1、前言 上一篇文章我们讲了日志的发展史,在日志组件发展的过程中,为了使得日志组件过多的耦合在业务中,所以,在组件迭代的过程中,通过面向门面编程的思想,逐渐形成了上层门面接口和下层业务实现的完全解耦,从而达到了在更换日志实现的情况下,业务系统无感知...

2021-06-14 08:52:53 1951

原创 二、日志的发展史

系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习..

2021-06-04 22:43:23 696 1

空空如也

空空如也

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

TA关注的人

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