自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 问答 (3)
  • 收藏
  • 关注

原创 JVM 常用的参数说明与配置指南

在 Java 应用的运行中,合理配置 JVM 参数对于系统的性能优化和稳定运行至关重要。本文详细介绍了常见的 JVM 参数,包括模式参数、堆内存参数、垃圾回收器参数、日志打印参数、dump 日志参数等,并提供了不同内存大小下的参数设置示例和模板,帮助您更好地理解和配置 JVM 参数,以提升 Java 应用的性能和可靠性。本文全面涵盖了 JVM 参数的各个方面,从模式选择到具体的堆内存、垃圾回收器、日志打印和 dump 日志等参数的配置。

2024-07-31 10:30:00 3113

原创 探索 Lombok自动注入注解 之 @RequiredArgsConstructor :原理、实践、踩坑及填坑

注解@RequiredArgsConstructor 是 Lombok 提供的一个注解,其主要作用在于简化@Autowired的书写过程。在编写 Controller 层或 Service 层代码时,常常需要注入众多的 mapper 接口或 service 接口。若每个接口都使用@Autowired进行标注,代码会显得繁琐。而注解能够替代@Autowired注解,但需注意,在类上添加时,需要注入的类必须使用final进行声明。

2024-07-25 10:49:03 4600

原创 扁鹊三兄弟的启示,保证系统稳定的秘诀

总之,提升系统稳定性,我们要借鉴扁鹊三兄弟的智慧,像扁鹊大哥一样在事前减少故障数量,像扁鹊二哥一样在问题还小时快速发现,像扁鹊一样在出现问题时迅速恢复。多管齐下,从预防、发现到恢复,全方位保障系统的稳定健康运行。

2024-07-05 18:30:27 1384

原创 Kafka 为何如此之快?深度解析其背后的秘密

综上所述,Kafka 在发送端、存储端和消费端的一系列优化策略,使得它能够在大数据处理场景中展现出惊人的速度和性能。无论是构建实时数据管道、流处理应用还是大规模的消息系统,Kafka 都是一个可靠且高效的选择。希望通过这篇文章,能让您对 Kafka 为什么快有更深入的理解。

2024-07-02 15:46:36 1050

原创 三层限流:为高并发系统保驾护航

在高并发网络环境中,确保系统的可用性、稳定性以及防范恶意流量攻击至关重要。为此,在我们的项目中构建了三层限流设计。第一层是 Nginx 层面的 IP 限流,借助 Nginx 的 http_limit_req_module 模块,依据用户 IP 设限,这是抵御恶意 IP 的 DDoS 攻击、阻挡大量非法请求深入系统的首道防线。第二层为 gateway 针对用户层级的限流,通过用户的唯一标识如 user_id,控制每个用户在单位时间内的请求数量,确保公平,避免单一用户过度占用资源而影响他人体验。

2024-07-01 15:33:50 1024

原创 剖析 Kafka 消息丢失的原因

Kafka消息丢失的原因通常涉及多个方面,包括生产者、消费者和Kafka服务端(Broker)的配置和行为。下面将围绕这三个关键点,详细探讨Kafka消息丢失的常见原因,并提供相应的解决方案和最佳实践。总的来说,Kafka消息丢失是一个涉及多个环节的问题,需要从生产者、Broker和消费者三个层面综合考虑。通过合理的配置和策略,结合监控和及时的应对措施,可以大幅降低消息丢失的风险,确保数据在分布式系统中的可靠传递。

2024-06-18 21:28:18 2127

原创 深入浅出 SQL 优化:全面提升查询性能的技巧

在数据驱动的世界中,SQL 查询优化是提升数据库性能的关键。通过深入研究执行计划,分析查询语句,优化表连接,限制条件和排序等方面,我们可以显著提高查询效率,为用户提供更快速的响应。本文将深入探讨 SQL 优化的关键技术,帮助您提高数据库的性能。因本文篇幅较长,所以绘制了一张SQl查询优化概要的脑图,方便大家更系统的了解本文的结构。MySQL Query Optimizer通过执行explain命令告诉我们它将使用一个怎么样的执行计划来优化query。

2024-04-22 09:08:20 2899

原创 从 Oracle 到 MySQL 数据库的迁移之旅

添加一套针对MuSQL数据库CRUD的Dao和Mapper代码,同时我们写了一个注解以切面的方式实现根据配置实例化Oracle的Dao、MySQl的Dao、同时调用Oracle和MySQLDao的功能。我们有额外的数据核对方案,通过应用读Oracle,再异步读取MySQL并进行对比的方式进行业务表的数据核对。Oracle和MySQL的函数有一定对的相似性也要有一定的区别,下面表格列出了Oracle和MySQL常用函数的对比和区别。将正式环境的机器的数据库读取的配置设置为从MySQL数据库读取。

2024-04-11 14:08:57 1474

原创 文档在线预览 总结篇

四个在线预览的方式的实现和效果可以说是各有千秋,但或多或少也都存在一定的问题,比如转图片的都是存在要处理多图片的问题,转html存在复杂样式丢失的问题,纯前端实现存在前端开发量较大、除了图片、pdf外其他格式的预览效果不尽完美的问题。

2023-05-28 01:00:18 2727 2

原创 【LeetCode热题100】搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。请必须使用时间复杂度为 O(log n) 的算法。nums 为 无重复元素 的 升序 排列数组。

2024-08-09 10:41:10 327

原创 通过拦截获取登录用户信息的实现

综上所述,此段代码构建了完善的登录用户信息管理和拦截机制,确保系统在处理用户请求时能精准获取和处理用户信息,并妥善进行错误处理和内存管理。

2024-08-09 10:36:23 969

原创 【LeetCode热题100】合并 K 个升序链表

输入:lists = [[1,4,5],[1,3,4],[2,6]]请你将所有链表合并到一个升序链表中,返回合并后的链表。lists[i].length 的总和不超过 10^4。给你一个链表数组,每个链表都已经按升序排列。输出:[1,1,2,3,4,4,5,6]将它们合并到一个有序链表中得到。lists[i] 按 升序 排列。输入:lists = [[]]输入:lists = []

2024-08-08 22:51:53 164

原创 【LeetCode热题100】环形链表

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输入:head = [1], n = 1。进阶:你能尝试使用一趟扫描实现吗?输出:[1,2,3,5]链表中结点的数目为 sz。

2024-08-08 22:49:39 213

原创 一个注解实现自动分页

AutoPage/*** @description: 自动分页注解/*** @description: 自动分页注解/*** @description: 自动分页注解*/通过以上对自动分页注解的详尽阐释、实现流程以及使用实例的展现,我们成功构建了一种高效、便捷且实现了解耦的分页解决办法。使用自动分页注解,仅需添加一个注解就能完成分页操作,无需在代码中重复进行繁琐的分页处理。

2024-08-07 10:15:00 1231

原创 【LeetCode热题100】两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入:l1 = [2,4,3], l2 = [5,6,4]每个链表中的节点数在范围 [1, 100] 内。输入:l1 = [0], l2 = [0]输出:[8,9,9,9,0,0,0,1]题目数据保证列表表示的数字不含前导零。输出:[7,0,8]

2024-08-06 16:41:40 158

原创 通用分页处理:从繁琐到简洁的转变

在处理需要对整个表的数据进行处理或者数据同步的场景中,由于数据量通常较大,我们常常会采用不断地分页查询来进行操作。通常情况下,我们需要编写一个分页查询数据表的方法,例如下面的// 处理后面数据i++) {在处理大量数据的表操作或数据同步时,为应对数据量过大的情况,通常采用分页查询。最初的实现方式存在繁琐和重复编写的问题。经过多次类似场景的经历,通过运用模板方法模式和通用的PageHelper。

2024-08-06 16:33:54 475

原创 【LeetCode热题100】合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输入:l1 = [], l2 = [0]两个链表的节点数目范围是 [0, 50]输入:l1 = [], l2 = []输出:[1,1,2,3,4,4]

2024-07-31 10:00:00 379

原创 【LeetCode热题100】反转链表

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5]链表中节点的数目范围是 [0, 5000]输入:head = [1,2]输出:[5,4,3,2,1]输入:head = []

2024-07-28 20:42:51 220

原创 【LeetCode热题100】环形链表II

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。输入:head = [3,2,0,-4], pos = 1。输入:head = [1,2], pos = 0。解释:链表中有一个环,其尾部连接到第二个节点。解释:链表中有一个环,其尾部连接到第一个节点。输出:返回索引为 1 的链表节点。解释:链表中没有环。

2024-07-28 20:39:55 238

原创 【LeetCode热题100】环形链表

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。输入:head = [3,2,0,-4], pos = 1。给你一个链表的头节点 head ,判断链表中是否有环。输入:head = [1,2], pos = 0。解释:链表中有一个环,其尾部连接到第二个节点。解释:链表中有一个环,其尾部连接到第一个节点。输入:head = [1], pos = -1。解释:链表中没有环。

2024-07-27 20:07:08 275

原创 FieldHandChain 重新定义对象字段处理方式

本文介绍了一个利用反射技术结合责任链模式和策略模式编写的 FieldHandChain 工具类,它支持对对象字段进行多种固定处理操作,如清除不可修改字段的值、过滤表情符号、替换非标准字符和特殊字符、设置默认值、去除字符串前后空格等。通过实现 FieldHand 接口,可以方便地扩展新的功能。文中还展示了各个功能的实现代码和使用案例,并给出了相应的执行结果示例。这个工具类能够简化对象字段的处理过程,提高开发效率和代码的可维护性。

2024-07-27 11:15:00 1021

原创 一个注解实现分布式锁加锁

首先,我们定义一个注解key:redis 锁的键,支持 SpEL 表达式。waitTime:等待时间,默认为 0 毫秒。expireTime:过期秒数,默认为 -1,使用 watchDog。timeUnit:超时时间单位。errorMsg:报错信息。

2024-07-23 16:47:30 713

原创 一个注解解决重复提交问题

首先我们先定义一个注解,注解包含以下几个参数 :waitTime: 等待时间,默认0秒expireTime: 锁过期时间,默认10秒: 执行完成后是否释放锁,默认是timeUnit: 超时时间单位,默认毫秒errorMsg: 报错信息,默认 "点击太快了,请慢一点!/***/@Component/*** 等待时间,默认0秒*//*** 锁过期时间,默认10秒*//*** 执行完成后是否释放锁,默认是*//*** 超时时间单位,默认毫秒*/

2024-07-22 15:04:41 1210

原创 【Leetcode】9. 回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。解释:从左向右读, 为 -121。从右向左读, 为 121-。因此它不是一个回文数。是指正序(从左向右)和倒序(从右向左)读都是一样的整数。解释:从右向左读, 为 01。因此它不是一个回文数。进阶:你能不将整数转为字符串来解决这个问题吗?例如,121 是回文,而 123 不是。输入:x = -121。输入:x = 121。

2024-07-22 14:44:12 257

原创 缓存和数据库双写的四种策略分析

在本文当中,我们探讨了不同的缓存策略以及它们各自的优缺点。在实际应用中,请仔细评估您的目标,理解数据访问(读/写)模式,并选择最为适宜的策略或者组合策略。例如,如果在实际应当使用 write-around/read-through 时选择了 write-through/read-through(访问写入数据的频率较低),那么缓存中将会存在无用的垃圾。可以说,如果缓存足够大,或许没有问题。但在众多实际的高吞吐量系统中,当内存永远不够大并且需要考虑服务器成本时,正确的策略至关重要。

2024-07-18 17:35:32 811

原创 【Leetcode】14. 最长公共前缀

输入:strs = [“flower”,“flow”,“flight”]输入:strs = [“dog”,“racecar”,“car”]编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。strs[i] 仅由小写英文字母组成。解释:输入不存在公共前缀。

2024-07-18 17:26:34 230

原创 探讨Java 事件驱动模型的实现

事件驱动编程模型架构有助于我们在实际开发过程中制定出更为合理的设计决策,构建出更为健壮、高效和可维护的应用系统。通过深入领会并熟练运用事件驱动编程,我们能够更出色地应对不断变化的业务需求,提升软件开发的质量和效率。最后在使用时请牢记一句话:与聚合核心逻辑有关的,走应用服务编排,与核心逻辑无关的,走事件驱动模型,采用独立事务模式。

2024-07-16 18:13:25 975

原创 如何比较两个对象字段的差异,对象比较工具类实现

的工具类,用于比较两个对象之间的差异,并将差异以Map的形式返回。该类的主要方法是diffToMap,它接受两个对象作为输入,并可选地接受一个忽略字段的列表。该方法首先将输入对象转换为JSON字符串,然后将JSON字符串转换为Map,最后比较两个Map的差异并返回结果。该类还包含一些辅助方法,如和doCompare,用于处理JSON到Map的转换和比较两个Map的差异。

2024-07-16 18:13:01 545

原创 如何将两个对象合并在一起,对象合并工具类的实现

在编程中,经常需要对数据进行合并操作。所以我写了一个工具类用于将不同的对象或数据进行合并,以满足在特定场景下的数据整合需求。以下是工具类的使用说明工具类通过多种merge方法的实现,为我们提供了灵活且高效的数据合并解决方案,使得在处理对象和数据的合并操作时更加便捷和可靠。希望以上说明和测试示例能够帮助您更好地理解和使用工具类。工具类的依赖gson。

2024-07-05 18:29:01 536

原创 jvm参数模板

2.这个参数控制着CMS垃圾收集器的触发条件,它指示JVM应仅根据初始化占用阈值来启动CMS垃圾回收周期,而不是依赖于默认的启发式算法来决定何时启动回收。直接内存(也是我们说的堆外内存,unsafe分配的内存,或者DirectByteBuffer的api分配的内存。这个参数用于控制堆内存占用的阈值,当达到这个阈值时,G1收集器会开始其垃圾回收过程。3.4两参数用来开启老年代空间压缩,以及收集了多少次进行压缩,减少内存碎片。这个默认值是JVM内部设定的,过小的元空间导致oom。一、8G以下jvm参数模板。

2024-07-02 16:13:06 266

原创 雪花算法的原理以及实现

有这么一种说法,自然界中并不存在两片完全一样的雪花的。每一片雪花都拥有自己漂亮独特的形状、独一无二。雪花算法也表示生成的ID如雪花般独一无二。雪花算法 (SnowFlake )算法,是 Twitter 开源的分布式 id 生成算法。其核心思想是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。

2024-07-01 16:02:54 626

原创 【LeetCode热题 100】搜索二维矩阵 II

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20。输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5。每列的所有元素从上到下升序排列。每行的元素从左到右升序排列。每列的元素从上到下升序排列。

2024-06-22 20:24:37 351

原创 【LeetCode热题 100】螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]输出:[1,2,3,6,9,8,7,4,5]

2024-06-22 20:19:02 445

原创 【LeetCode热题 100】三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]输入:nums = [0,1,1]输入:nums = [0,0,0]解释:唯一可能的三元组和为 0。输出:[[0,0,0]]

2024-06-20 11:26:34 392

原创 【LeetCode热题100】两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案。输入:nums = [2,7,11,15], target = 9。输入:nums = [3,2,4], target = 6。进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?输入:nums = [3,3], target = 6。

2024-06-20 11:20:54 261

原创 解决接入sleuth链路追踪后xxl-job定时任务的日志无日志问题

随着业务规模的不断的增大, 系统的复杂度也越来越高, 公司软件架构也进入到了分布式微服务的阶段, 在这样的情况下每一次请求都有可能跨越多个项目, 传统的日志监控方式无法满足调用链路追踪, 这就导致问题定位/诊断服务变得复杂。但是使用中发现xxl-job的日志是没有traceId的,只能根据线程id来筛选日志,且跨服务后的日志查不到了。通过增加以上类,即可实现traceId注入,同时也增加了统一日志打印,不需要在每个定时任务入口都打印日志(如果不需要也可以去掉)。

2024-06-18 21:30:33 266

原创 Redis的五大数据类型的数据结构

数据类型和底层数据结构对应关系每种数据结构特性不一样,操作时间也不一样。数据结构的时间复杂度。

2023-08-29 22:27:14 654 1

原创 Redis 为什么这么快?

作为一名后端软件工程师,工作中你肯定和 Redis 打过交道。但是Redis 为什么快呢?很多人只能答出Redis 因为它是基于内存实现的,但是对于其它原因都是模棱两可。那么今天就一起来看看是Redis 为什么快吧:Redis 为什么这么快?

2023-08-26 22:42:52 775

原创 《深入理解Java虚拟机》读书笔记:基于栈的字节码解释执行引擎

虚拟机是如何调用方法的内容已经讲解完毕,从本节开始,我们来探讨虚拟机是如何执行方法中的字节码指令的。上文中提到过,许多Java虚拟机的执行引擎在执行Java代码的时候都有和两种选择,在本章中,我们先来探讨一下在解释执行时,虚拟机执行引擎是如何工作的。基于栈的字节码解释执行引擎。

2023-08-25 16:10:47 221

原创 《深入理解Java虚拟机》读书笔记:方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最普遍、最频繁的操作,但前面已经讲过,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用)。

2023-08-24 22:18:20 127

空空如也

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

TA关注的人

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