- 博客(709)
- 资源 (7)
- 收藏
- 关注
原创 到底应不应该使用@Builder
大多数同学使用@Builder无非就是为了链式编程,然而@Builder并不是链式编程的最佳实践,它会额外创建内部类,存在继承关系时还需要使用@SuperBuilder注解,设置默认值时也需要额外的@Builder.Default去设置默认值,无疑增加了很多不必要的复杂度。
2025-01-19 20:57:14
14848
10
原创 数据库治理之冷热数据分离
作为数据库存储,历史订单信息状态修改频率低并占用大量数据库存储空间,期望历史数据与生产最新的数据进行分离,当前数据库保留最近一个月的数据作为热库,历史交易存在另一个库作为冷库。当然也可以是状态维度,比如订单的状态,已完结的订单定义为冷数据,未完结的订单定义为热数据。很高,如果更新状态时,需要进行进行冷热数据分离,删除热库中的数据,并将数据写入冷库中,需要使用到分布式事务。我的冷热数据怎么拆分的:已过起飞时间 + 订单状态=“完成”的数据都是冷数据,其余为热数据。当冷热数据存在冲突时,以热库的数据为准。
2025-01-10 05:30:00
20825
13
原创 主从数据库数据不一致问题解决方案
即远端直接内存访问,是一种高性能网络通信技术,具有高带宽、低延迟、无CPU消耗等优点。主要解决网络传输中服务器端数据处理的延迟问题。Remote:数据通过网络与远程机器间进行数据传输;Direct:没有内核的参数,有关发送传输的所有内容都卸载到网卡上;Memory:在用户空间虚拟内存与RNIC网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制;Access操作;
2025-01-06 05:30:00
18396
4
原创 大循环引起CPU负载过高
由于代码中大循环非常小号cpu资源,通过分析这里方法的作用在于遍历判断获取数据,优先使用hashmap代替,用空间换时间,经过修复后重新发布,cpu利用率明显下降,恢复正常。【1】使用循环时需要特别注意大循环,有限使用O(1)的hashmap,大循环对于cpu性能的压榨问题表现的淋淋尽致。【2】镜像机器由于是使用生产流量转发,所以高度贴近生产实际发布,所以每次发布前,先使用镜像机器预发布,可以尽可能的将潜在问题暴露出来,性能实验室中提供了cpu热点,内存分配热点和锁竞争热点的Flamegraph。
2025-01-03 05:30:00
14465
15
原创 CR规范之存储过程
存储过程是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。存储过程在数据库技术中属于一种服务端编程方式,是一组预编译的SQL语句集,常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等,可以在执行过程中接受参数输入,并返回查询结果。
2025-01-02 05:30:00
15116
8
原创 MySQL日志体系的深度解析:功能与差异
因为功能的不同,redo log 存储的是物理数据的变更,如果我们内存的数据已经刷到了磁盘了,那redo log的数据就无效了。这也应该容易理解,毕竟回滚嘛,跟需要修改的操作相反就好,这样就能达到回滚的目的。的存在为了:当我们修改的时候,写完内存了,但数据还没真正写到磁盘的时候。时,并不是马上就刷入中继日志里,而是由操作系统决定何时来写入,虽然安全性降低了,但减少了大量的磁盘。中继日志里,这样是最安全的,因为在崩溃的时候,你最多会丢失一个事务,但会造成磁盘的大量。我们还是会对这次的事务回滚,将无效的。
2025-01-01 05:30:00
15999
16
原创 为什么要用ZGC
ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,ZGC可以说源自于 Azul System 公司开发的C4收集器[基本不用调优]它的设计目标包括:【1】停顿时间不超过10ms(STW减少了)之所以能做到这一点是因为它的停顿时间主要跟 GCRoot扫描有关,而 GCRoot数量和堆大小是没有任何关系的(停顿时间不会随着堆的大小,或者活跃对象的大小而增加,影响它的是 GCRoot对象);
2024-12-31 05:30:00
2263
13
原创 LightHouse 性能优化神器
我们使用F12打开当前项目的控制台,点击LightHouse后能够看到点击后,就会对网页进行性能分析。需要注意的是浏览器的缓存会影响性能分析的分数,所以在分析之前需要对缓存进行清理。【1】:是否清除缓存,模拟用户第一次进入页面就勾选,清除缓存;【2】:模拟限制,勾选之后Lighthouse在测试过程中限制网速与CPU。Latency延迟:150ms;Throughput上行下行网速:;;CPU4x CPU谷歌开发者工具也可设置网络限速。CPU4x CPU;谷歌开发者工具也可设置网络限速。【1】
2024-12-30 05:30:00
18788
6
原创 Spring Boot spring.factories文件详细说明
经常看到 spring.factories 文件,却没有对它进行深入的了解和分析,今天我们就一起揭开面纱看看它的内在。spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boot 自动配置模块的 META-INF 目录下,用于声明该模块提供的自动配置类、条件性配置类、环境后处理器等。以下是对 spring.factories 文件的详细说明:
2024-12-27 05:30:00
10648
16
原创 Reactor 错误重试使用分享
在使用 Reactor 进行响应式编程时,错误处理和重试机制是非常重要的部分。Reactor 提供了多种方式来处理错误和实现重试机制。【1】使用 retry 操作符retry 操作符可以在发生错误时重新订阅序列。你可以指定重试的次数。.retry(3);上面的代码会在发生错误时重试 3 次。【2】使用 retryWhen 操作符retryWhen 操作符提供了更灵活的重试机制,可以根据特定条件或延迟策略进行重试。上面的代码会在发生错误时,每隔 1 秒重试一次,共重试 3 次。
2024-12-26 05:30:00
11942
5
原创 Reactor 错误处理
命令式编程的最后一个相似之处是清理,可以通过使用“使用块finally来清理资源”或使用“Java 7 try-with-resource 构造”来完成,doFinallyonComplete是关于当序列终止(使用或)或取消时要执行的副作用onError。后备方法:如果您想要的不仅仅是一个默认值,而且您有另一种(更安全)的方式来处理数据,那么您可以使用onErrorResume。类似onErrorReturn,onErrorComplete具有允许您根据异常的类或过滤要回退的异常的变体Predicate。
2024-12-24 05:30:00
6348
8
原创 深入解析 Spring WebFlux:原理与应用
WebFlux 是 Spring Framework 5 引入的一种响应式编程框架,和Spring MVC同级,旨在处理高并发和低延迟的非阻塞应用。这是一个支持反应式编程模型的新Web框架体系。顺便一提,Spring Cloud Gateway在实现上是对Spring WebFlux的拓展。
2024-12-23 05:15:00
9064
121
原创 N 皇后 II
回溯的具体做法是:依次在每一行放置一个皇后,每次新放置的皇后都不能和已经放置的皇后之间有攻击,即新放置的皇后不能和任何一个已经放置的皇后在同一列以及同一条斜线上。右移一位,由于棋盘的最左列对应每个整数的最低二进制位,即每个整数的最右二进制位,因此对整数的移位操作方向和对棋盘的移位操作方向相反(对棋盘的移位操作方向是。对于每个方向的斜线,需要找到斜线上的每个位置的行下标与列下标之间的关系。每次放置皇后时,三个整数的按位或运算的结果即为不能放置皇后的位置,其余位置即为可以放置皇后的位置。
2024-12-23 00:15:00
995
1
原创 Spring Boot应用关闭分析
本文挖掘了Spring Boot的关闭方式,并列举了关闭方式,从原理、源码的角度阐述了Spring Boot的关闭代码及扩展点。同时,额外说明了一些系统特性 和原理,比如,程序退出码和信号机制。
2024-12-20 05:30:00
13989
108
原创 Spring boot启动原理及相关组件
ConfigurationClassPostProcessor的优先级为最高,它会对项目中的@Configuration注解修饰的类(@Component、@ComponentScan、@Import、@ImportResource修饰的类也会被处理)进行解析,解析完成之后把这些bean注册到BeanFactory中。在github里,我把Spring Boot应用启动的拓展组件(自定义的应用初始器、监听器、事件、ApplicationRunner)都写了例子,可参照阅读。
2024-12-19 05:30:00
11460
85
原创 SpringBoot 新特性
新增了一个自动配置注解 @AutoConfiguration,用来代替之前的 @Configuration,用于标识新自动配置注册文件中的顶级自动配置类,由 @AutoConfiguration 注解嵌套、导入进来的其他配置类可以继续使用 @Configuration 注解。Spring Boot 3.0 的发布,其最低要求 Java 17,并向上兼容支持 Java 19,Spring Boot 3.1 可以支持 Java 20 了,因为前段时间 Java 20 发布了。
2024-12-18 05:30:00
7892
71
原创 O(1)插入、删除和随机元素
删除操作的重点在于将变长数组的最后一个元素移动到待删除元素的下标处,然后删除变长数组的最后一个元素。获取随机元素操作时,由于变长数组中的所有元素的下标都连续,因此随机选取一个下标,返回变长数组中该下标处的元素。,且可以保证在删除操作之后变长数组中的所有元素的下标都连续,方便插入操作和获取随机元素操作。,需要将变长数组和哈希表结合,变长数组中存储元素,哈希表中存储每个元素在变长数组中的下标。的时间内完成插入和删除操作,但是由于无法根据下标定位到特定元素,因此不能在。的时间内判断元素是否存在,因此不能在。
2024-12-18 00:15:00
1697
1
原创 SpringBoot3 升级介绍
Springboot是Spring家族中的一个框架,它是用来简单应用程序的创建和开发过程,化繁为简,简化SSM(SpringMVC + Spring + MyBatis)框架的配置。比如说在使用SSM框架开发的时候,我们需要配置web.xml,配置spring,配置mybatis,并将它们整合到一起,而是用Springboot就不同了,它采用了大量的默认配置来简化这些文件的配置过程。
2024-12-17 05:30:00
9661
133
原创 两数之和(Hash表)
但是我想偏了,我一直想的是在三数之和中如果当前数和前一个数相等,那么会直接跳过。这里的话应该是可以根据前一个数对答案的贡献度直接推出来当前数的贡献度的。所以刚开始的思路就是先统计每一个数出现的次数,然后再按照两数之和的方法去算,只不过算的时候要考虑两个数出现的次数相乘才是所有的组合。面试完又想了一下另一个思路,可以按照三数之和内层循环的思路,用两个指针分别指向首尾,,那么可以不用计算,直接加上上一次的答案,同理,第一次遇到2也是,但是由于。的时候,不能直接加上上一次的答案,应该加上上一次的答案。
2024-12-17 00:15:00
832
2
原创 @Build 与 @SuperBuild 的区别
中,子类的方法如果要重写父类的方法,那么子类方法的返回类型必须是父类方法返回类型的子类型或者相同类型。可以使用已有的对象构建新的对象,旧对象的属性值会被保留和覆盖。可以读取父类的属性。使用时需要在子类和父类上都加上这个注解。既然是没有无参构造函数,那么就在子类上添加无参构造函数。一起使用,会遇到编译冲突,导致构造器生成失败。是两个独立的类型,不是继承关系,因此不符合。在涉及到继承相关的子父类字段时,如果使用。方法,但是返回类型不匹配导致的。属性,强制生成无参构造函数:这样。注解无法解析父类的属性,而。
2024-12-16 05:30:00
11134
81
原创 删除有序数组中的重复项
首先注意数组是有序的,那么重复的元素一定会相邻。要求删除重复元素,实际上就是将不重复的元素移到数组的左侧。分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示当前元素的下标位置,初始时两个指针都指向下标。,即相等的元素在数组中的下标一定是连续的。利用数组有序的特点,可以通过双指针的方法删除重复元素。的每个元素都不相同且包含原数组中的每个不同的元素,因此新的长度即为。此时数组中没有重复元素,按照上面的方法,每次比较时。指向的元素原地复制一遍,这个操作其实是不必要的。,返回删除后数组的新长度。
2024-12-16 00:15:00
773
1
原创 Kryo深拷贝工具
Kryo 是一个快速高效的 Java 二进制对象图序列化框架。该项目的目标是高速、小尺寸和易于使用的 API。该项目在需要持久化对象的任何时候都很有用,无论是文件、数据库还是通过网络。
2024-12-13 05:30:00
9189
112
原创 Dead Code Clean
死代码通常包括如下两种:1、不可达代码不会被执行的代码,又可被细分为控制流不可达和分支不可达,具体定义如下:控制流不可达:如果不存在从程序入口到达某一段代码的路径,则该段代码就是控制流不可达。分支不可达:对于分支语句(if & switch),如果条件值是固定的,则其中一个分支都不会被走到,这些分支的代码即为分支不可达。2、无用代码会被执行,但执行结果不会被用到的代码。
2024-12-12 05:30:00
8660
85
原创 可视化逻辑表达式编辑器
QueryBuilder 是一个用于创建查询和过滤器的 UI 组件。QueryBuilder的特点1、支持的输入属性丰富,常见的 字符串,整数,浮点数,布尔类型,日期类型,数组列表等都支持2、高度可定制。QueryBuilder是由规则以及规则组组合而成的查询以及过滤组件,规则以及规则组可以层层嵌套,所以复杂的规则也可以配置出来。3、支持的生成脚本语句多。QueryBuilder的最终目的是,通过配置规则树,最终把规则树转化为我们想要的脚本语句。
2024-12-11 05:30:00
9911
65
原创 Codescene 高阶使用
这个功能可以模拟当团队中某一个开发人员离职或者转岗后,会对团队开发工作的哪些代码部分造成影响,下图是模拟了当团队一位开发人员离开后影响的情况,图中红色部分是我们需要关注的内容,所涉及的相关代码需要进行交接。不健康的代码预示着维护成本的增加和更多的缺陷。就像崎岖不平的道路会减慢你的驾驶速度一样,代码中的崎岖不平的道路也会给理解带来障碍)点击存在健康风险对象的X-ray选项,会进行方法级别的问题扫描,这个功能可以让开发人员聚焦到最需要进行重构的类方法,如图的方法会提示存在健康风险的方法有哪些代码问题。
2024-12-10 05:30:00
11282
84
原创 AWS Lambda 案例分析
函数式 + 云服务 = Function as a Service(Fass)当我们讨论函数式编程(Functional Programming, FP)时,我们谈论的是一种编程范式,它强调使用函数来构建软件。在函数式编程中,计算被视为对数据的一系列函数应用,而状态和可变数据被避免。这种范式源于数学中的 λ 演算(lambda calculus),它提供了一种形式化的框架,用以表达计算过程。函数式编程是一种强大的工具,可以帮助我们构建更清晰、更可靠、更高效的软件系统。
2024-12-09 05:30:00
13078
83
原创 Spring Bean 的生命周期和获取方式
InitializingBean 接口只有一个函数:afterPropertiesSet()这一阶段也可以在 bean正式构造完成前增加我们自定义的逻辑,但它与前置处理不同,由于该函数并不会把当前 bean对象传进来,因此在这一步没办法处理对象本身,只能增加一些额外的逻辑。执行初始化之后的后置处理器的方法。执行接口规定的初始化。包含了获取实体解析器、验证模式,以及 Document 对象的逻辑,XML 是半结构化数据,XML 的验证模式用于保证结构的正确性,常见的验证模式有 DTD 和 XSD 两种。
2024-12-06 05:30:00
11941
94
原创 ChannelInboundHandlerAdapter 与 SimpleChannelInboundHandler 的区别
是不错的选择,如果操作是异步的话,那他的逻辑就有点麻烦了,例如你把数据交给另外的线程处理了,还没处理就会释放了。方法被调用时引用计数减1,当计数减少到0的时候会被显示清除,再次访问被清除的对象会出现访问冲突(这里想起了JVM判断对象是否存活的引用计数算法)。是提供了一种默认实现,子类如果要继承,需要覆盖父类中的方法,并且不需要调用。处理自由的优点也就提现出来了,可以更好的处理更多的特定场景。的好处是可以处理不同的类型对象,并且可以做释放。的好处则是更自由,在异步的场景下更适合。
2024-12-05 05:30:00
2228
48
原创 Tomcat 都有哪些核心组件
当请求的uri与所有的 path都不匹配时,使用该默认Web应用来处理。但是,需要注意的是,在自动部署场景(配置文件位于xmlBase中),不能指定path属性,path属性由配置的文件的文件名,WAR文件的文件名或应用目录的名称自动推导出来。在后文中,提到 Context、应用或 Web应用,他们都代指Web应用,每个 Web应用基于 WAR文件,或 WAR文件解压后对应的目录(这里称为应用目录)Context 是 Host 的子容器,每个 Host 都可以定义任意多的 Context元素。
2024-12-04 05:30:00
5673
69
原创 快乐数题解
在龟兔赛跑的寓言中,跑的慢的称为 “乌龟”,跑得快的称为 “兔子”。该分析建立在对前一种方法的分析的基础上,但是这次我们需要跟踪两个指针而不是一个指针来分析,以及在它们相遇前需要绕着这个循环走多少次。因此,我们可以硬编码一个包含这些数字的散列集,如果我们达到其中一个数字,那么我们就知道在循环中。的数字,用这么小的数字,编写一个能找到所有周期的强力程序并不困难。我们不是只跟踪链表中的一个值,而是跟踪两个值,称为快跑者和慢跑者。2、要计算出总的时间复杂度,我们需要仔细考虑循环中有多少个数字,它们有多大。
2024-12-04 00:15:00
963
2
原创 分布式集群下如何做到唯一序列号
在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,也许有时候也会出现不是全局递增的情况。在业务上的区别,订单号尽可能要多些冗余的业务信息,比如:滴滴:时间+起点编号+车牌号 淘宝订单:时间戳+用户。集群也可以防止单点故障(系统中一点失效,就会让整个系统无法运作的部件)的问题。字节是所在主机的唯一标识符。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便地生成它。表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。通过创建顺序节点,可以确保每个节点的名称是唯一且递增的。
2024-12-03 00:15:00
4837
73
原创 SpringBoot 整合 Avro 与 Kafka
优质博文:IT-BLOG-CN【需求】:生产者发送数据至 kafka 序列化使用 Avro,消费者通过 Avro 进行反序列化,并将数据通过 MyBatisPlus 存入数据库。【1】Apache Avro 1.8;【2】Spring Kafka 1.2;【3】Spring Boot 1.5;【4】Maven 3.5;二、Avro 文件【1】Avro 依赖于由使用JSON定义的原始类型组成的架构。对于此示例,我们将使用Apache Avro入门指南中的“用户”模式,如下所示。该模式存储在src / ma
2024-12-02 00:15:00
19581
126
原创 HickWall 详解
然后给告警命名,Evaluate every 表示每隔多久执行一次这条告警规则,For 则表示在持续多久满足(我们马上就会填的)告警条件之后才真正发出告警。:可以从默认的 Graph 改成多种其它图表,每种图表的使用方式各异,请自行探索 / 查阅文档。的运算逻辑是这样的:浏览器会按照选取的时间范围和显示器的大小选取合适的间隔,例如显示的曲线是。假如有一个航班查询接口,它根据传入的参数,返回匹配的所有航班。查出了需要的数据,就可以继续调整看板的其它配置。(也就是 5 分钟)内的数据的均值,要是它的结果。
2024-11-29 05:30:00
3908
112
原创 无重复字符的最长子串
在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。我们使用两个指针表示字符串中的某个子串(或窗口)的左右边界,其中左指针代表着上文中「枚举子串的起始位置」,而右指针即为上文中的。
2024-11-29 00:15:00
772
4
原创 揭秘JIT编译器:如何大幅提升代码执行效率的秘密
优质博文:IT-BLOG-CN业务流量突增,机器直接接入大量流量,和会消耗太多资源,导致1-2分钟时间内的请求超时导致异常,因此采用流量预热的方式,让机器逐步接入流量,需要预热时长。目前服务接入,通过自动扩缩容应用流量变化,当流量激增时,对机器的启动速度带来了挑战,之前通过优化点火时间,已经将机器从容器创建到可接入流量优化到2分钟左右,但3min的预热时长成为了应对流量激增的瓶颈,因此优化机器从接入流量到能稳定服务的时长,目标缩减到2min以内。什么是服务预热: 应用在刚启动的时候处理相应速度会很慢,只有当
2024-11-28 05:30:00
34505
92
Nginx离线安装所需依赖配置
2024-02-20
java 高级开发 zzx博客链接.xmind
2020-04-06
ojdbc14-10.2.0.4.0.jar包
2017-03-27
ojdbc14-10.2.0.4.0.jar
2017-03-26
企业人事管理论文+源代码
2016-11-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人