自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 从 0 到 1 掌握 自研企业级分布式 ID 发号器

在分布式系统架构成为主流的今天,你是否曾被这些问题困扰:海量订单的 ID 追踪混乱、分布式数据库分片时 ID 冲突、微服务间数据一致性难以保障?其实,这些问题的核心都指向一个关键基础设施 ——**分布式 ID 发号器**。当订单系统在 3 个机房 12 台服务器上同时运转,当用户日志分散在 20 个节点的集群中,当微服务间需要用 ID 串联起复杂的业务链路 —— 你生成的 ID 不仅要唯一不重复,还得兼顾性能、安全性和业务场景需求。这就是分布式 ID 发号器的核心价值,也是企业筛选中高级开发工程师的隐性

2025-07-15 10:20:59 552

原创 线上事故处理记录

线上事故处理案例摘要 本文记录了两个线上事故处理过程:1. MySQL导致CPU飙升:通过top定位mysqld进程,show processlist发现慢SQL,添加索引优化后仍有问题,最终增加Redis缓存层解决;2. Java进程CPU过高:top定位Java进程,top -Hp查看线程,jstack导出堆栈,转换线程ID为16进制后定位到空循环代码。事故原因均为代码评审不到位,前者缺少索引和缓存,后者存在性能问题代码。

2025-07-10 11:26:29 366

原创 数据一致性解决方案总结

本文总结了分布式系统中常见的数据一致性问题及解决方案。主要包括:1)数据库主从同步延迟问题,可通过缓存标记强制读主库;2)双主库数据冲突问题,可通过影子主库、ID步长或分布式ID解决;3)缓存与数据库不一致问题,可采用写时缓存(强一致性)或读时缓存(最终一致性);4)Redis主从同步问题,可通过强制读主节点或配置同步条件解决。文章针对不同场景提出了相应方案,并分析了各方案的优缺点及适用场景,为分布式系统设计提供了数据一致性保障的实践参考。

2025-07-09 22:21:23 1065

原创 JVM参数通用模板与调优

本文介绍了针对不同业务场景的JVM参数优化方案。对于响应优先的业务系统(4c8g服务器),推荐使用CMS垃圾收集器,设置4g堆内存、2g新生代,并配置详细的GC日志记录。对于吞吐量优先的系统(8c16g服务器),建议采用G1垃圾收集器,设置8g堆内存,并优化GC停顿时间。文章强调JVM调优的核心是内存预估和分配,需要根据系统QPS和对象产生量进行合理配置,同时指出参数如老年代年龄阈值需根据具体业务场景调整。最后提醒大内存系统优先考虑G1收集器。

2025-07-09 22:07:45 331

原创 SpringBoot3+LangChain4j:构建企业级 AI 办公助手

《SpringBoot3 + LangChain4j企业级实战》课程助力Java开发者掌握AI技术。课程基于SpringBoot3框架,结合专为Java设计的LangChain4j工具,实现多模态AI能力整合,涵盖本地模型部署、RAG检索增强等前沿技术。通过"智能培训办公助手"实战项目,学员将经历从需求分析到架构设计的全流程开发,并获得9个可复用资料包。课程适合Java工程师、技术负责人和AI爱好者,帮助突破AI开发瓶颈,掌握Java生态下的AI应用能力。618优惠期间享受5.9折特惠,

2025-06-20 13:26:10 909

原创 三张图带你学会Kafka、RabbitMQ、RocketMQ常见方案:消息不丢失、消息积压、顺序消费

三张图带你学会Kafka、RabbitMQ、RocketMQ常见方案:消息不丢失、消息积压、顺序消费

2025-04-19 23:52:38 261

原创 注册时用户名不可重复设计方案

对于这类数据量很小的系统来说,一张表完全可以存放下所有的用户数据,而且直接去查询db也不会很慢,对于这种系统来说,那就可以直接查db了。对于这类系统来说,应该是符合大部分企业的情况的,数据量没有那么小,但是又没有大厂那么大,对于这类系统来说,其实可以将数据放在redis中或者是使用一下布隆过滤器,注册的时候就可以判断这个数据是否存在了,而且数据量不太大的情况下定期重构布隆过滤器的时间开销其实也是可以接受的。对于使用布隆过滤器这种场景,有概率会发生误判,所以布隆过滤器的使用也是需要配合db来进行兜底的。对于大

2024-10-25 21:19:44 596

原创 各种消息队列经典问题解决方案——消息丢失、顺序消费、消息积压、重复消费

各种消息队列经典问题解决方案——消息丢失、顺序消费、消息积压、重复消费

2024-05-08 21:17:17 2027

原创 线程池参数应该如何设置-教你如何battle面试官

线程池参数应该如何设置-教你如何battle面试官

2024-01-30 17:59:46 585 1

原创 幂等性常用的解决方案

​ 但是唯一索引的添加也是一个技术活,如果我们对一个单一的字段设置为唯一索引的话,如果你的这个业务场景种可以进行数据的真正删除的话那么这么设计是没有问题的,但是如果你的业务中要求你的数据不能真正的删除而是需要进行留档,用户的删除只是进行逻辑删除的话,我们设计的单一的字段为唯一索引的话,那么我们插入新数据的时候就会出现唯一索引冲突的问题了。在进行讲解方案之前,我想先说一下什么是幂等性,下面是我用自己的理解说的,不是专业的术语,对于同样的多次请求,只会对第一次请求进行处理,多次请求返回的结果是相同的。

2023-06-01 17:59:08 868

原创 订单业务中的重要问题:超卖问题的解决方案

超卖问题,通俗的来说就是我们商家只有100件库存但是卖出去了100+件商品,出现了多买的问题。出现的场景:举个简单的例子:比如此时只剩下了最后一个商品,有两个人在抢这最后一个商品,此时A进行到了下单的页面,但是网速很慢卡在了这里,此时库存的数量还是没有扣除的一直在转圈圈,但是此时另一个人的网速快已经下单并且支付成功了,此时数据库中的库存数量已经减一变成了0,突然此时A结束转圈了去支付了,也下单了,那么库存就变成了-1,这只是有两个人在同时抢,那么你想想如果有10w人在一起抢呢?

2023-05-28 17:42:19 1575

原创 MySQL45讲第1篇-第14篇读书笔记

解决方案: 因为这个登录名的前面六位和后缀都是固定的,所以不管我们是使用前缀索引还是倒序存储都不能达到很好的效果,那么我们应该怎么办呢?我们可以将入学年份和顺序编号这9位做为一个索引,利用hash字段的思想,hash的规则不是crc32函数了,而是简单的字符串转数字。

2023-05-10 20:16:56 240

原创 自己造一个简易的IOC轮子

​ 6、去遍历这个文件夹下的所有的文件,因为我们要扫描这个包以及下面的所有子包中标注了@Be的类。​ 3、在Java中全类名的书写格式是这样的“com.lyq”,以".“分割的,因为我们要去操作系统的文件中去获取对应的文件,所以这个格式肯定是不对的,所以我们需要对这个格式进行一个转义,将“.”替换成”\",这个过程要注意转义。​ 8、通过这个全类名我们可以得到对应的类class,然后我们要判断这个类是不是接口,因为接口是不能实例化的,所以如果是一个接口的话,我们是不处理的,我们只处理是一个类。

2023-05-10 16:56:43 603

原创 Java定时任务框架:Elastic-job、Quartz、XXL-JOB 学习

Java定时任务:Elastic-job、Quartz 、XXL-JOB 学习一、Elastic-job分布式定时任务框架学习一、Simple类型的任务快速开启一个simple任务的步骤1.创建一个maven工程2.导入elastic-job的依赖,使用的是最新版本2.1.5 <dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lit

2023-04-18 22:03:18 1890

原创 一篇文章带你学会并快速上手-ShardingSphere

一文带你学会ShardingSphere

2023-04-08 11:58:46 1859 1

原创 一篇文章带你打通Zookeeper的基本理论-包括paxos算法、Leader选举、ZAB协议

一篇文章带你了解zookeeper中所有理论知识,用问题做引导,保你看得懂

2023-04-05 11:34:39 406

原创 Spring Boot 学习笔记整理

spring boot 笔记1.配置文件1.application.properties2.application.yml作用:修改spring boot的默认设置YAML:比XML和JSON更适合做配置文件,以数据为中心2.YAML使用yaml语法可以将yml配置文件的属性绑定在JavaBean中,JavaBean中必须用两个注解@Component//将JavaBean添加到容器中才能使用这个功能@ConfigurationProperties(prefix = "person")//

2021-06-11 19:05:21 2003

原创 Spring Boot整合Spring Data JPA学习笔记

Spring Boot 整合Spring Data JPAORM思想主要目的:操作实体类相当于操作数据库表建立两个关系:1.建立实体类和表的映射关系2.建立实体类中的属性和表中字段的映射关系不再重点关注sql语句(这是ORM思想我感觉最好的一个地方)实现了ORM思想的框架:mybatis,hibernateJPA底层实现数据库语言的还是hibernateSpring Boot 整合Spring Data JPA 的时候Dao层的repository接口类继承的四个接口的详解Spring

2021-04-15 17:48:22 329

原创 153. 寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值题目描述已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]]

2021-04-08 19:12:30 122

原创 66. 加一

**给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。 示例 2: 输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。 示例 3: 输入:digits = [0] 输出:[1]**代码如下 class

2021-03-30 18:51:46 98

原创 88. 合并两个有序数组

88. 合并两个有序数组给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例 2:输入:nums

2021-03-16 19:15:53 153

原创 121. 买卖股票的最佳时机

121. 买卖股票的最佳时机给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。思路:首先我们一次遍历然后找到一个最小值,然后我们再用最小值后面的值减去它求最大值 class Solution { public int maxProfit

2021-03-14 19:59:22 91

原创 283. 移动零

283. 移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。思路:首先我们先遍历数组,当遍历到不为0的数据的时候就将数据放在数组前面,最后剩下的就是0 class Solution { public void moveZeroes(int[] nums) {

2021-03-13 11:56:35 92

原创 力扣14题 最长公共前缀

力扣14题 最长公共前缀讲解题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。首先我们正常人的思路肯定是将一个字符串数组中的各个字符串的字母一个一个的比较,而不是那种训练过算法的人的算法思想所以今天我将来讲一下正常人的思路Java 代码如下 class Solution { public String longestCommonPrefix (String[]strs){ if(strs.length==0||strs==

2021-03-11 19:38:47 212

原创 能够动态调整数组大小的实现

**能够动态调整数组大小的实现所有集合类抽象数据类型实现的模板**代码如下: **package stack;import java.util.Iterator;public class ResizingArrayStack<Item> implements Iterable<Item>{ private Item[] a=(Item[])new Object[1];//栈元素 private int N=0;//元素个数 public boo

2021-02-23 21:51:14 592

原创 利用双栈实现加减乘除等表达式(包括不省略括号)计算

**利用双栈实现加减乘除等表达式(包括不省略括号)计算**首先我们明确一下这个问题的算法非常简单,读者不需要有心理压力。。看完就会算法的思路:我们首先需要创建两个栈,两个栈一个用来存放数据叫做操作数栈,另一个栈用来存放运算符叫做运算符栈。首先我们从左向右的读取表达式,遇到“(” 我们忽略不需要对左括号做出什么反应,如果我们读取到+、-、、/的时候我们将他们压入运算符栈,读到数字的时候我们把它压入操作数栈,**如果我们读到”)“的时候,我们将操作数中的一个数字弹出栈,然后将运算符栈中的最上面的运算符弹

2021-02-23 21:21:30 483

原创 关键路径讲解

关键路径详解最近数据结构刚刚学到关键路径这里,老师为了赶进度开始讲的飞快,可能上课一不留神就会跟不上老师的思路与节奏,只好课下自己学习一下关键路径,这里给他做一个总结,也算是自己的一种记录。这是一个简单的AOE网,它是一个有向边的图,每两个节点之间的a0,a1之类的东西叫做时间,最后我们求得关键路径也和他们有关系。事件后面跟着的数字是权值,我们可以理解为做完这个事件所需要的时间。首先我们要知道我们要求的关键路径是什么,关键路径就是这个时间所需要完成的最早时间和最晚时间一样,说明这个时间必须再规定的时间

2020-11-14 21:47:10 3074 2

转载 在类外如何访问私有成员

(1)通过公共函数为私有成员赋值class Test {private: int x, y;public: void setX(int a) { x=a; } void setY(int b) { y=b; } void printXY(void) { cout<<“x=”<<x<<’\t’<<“y=”<<y<<endl...

2020-11-01 20:45:50 6605

空空如也

空空如也

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

TA关注的人

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