自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一文弄懂 美团leaf 分布式唯一ID

Leaf根据不同业务的需求分别实现了 Leaf-segment和Leaf-snowflake两种方案,前者基于数据库的自增主键,后者基于Snowflake算法。雪花ID详解雪花IDLeaf-segment方案与批量缓存架构方案类似,只不过它没有依赖数据 库的自增主键,而是在数据库中为每个业务场景都记录目前可用的唯一 ID号段。服务实例在本地缓存一批可用的唯一 ID号段供业务请求使用,当某业务请求发现唯一 ID号段用完时,再从数据库中批量获取新的唯一 ID号段。具体的数据表设计如下所示。不同业务方的唯一 ID

2025-06-10 14:18:12 1188

原创 一文弄懂Snowflake雪花ID 分布式唯一ID

例如:唯一 ID生成器服务的某个实例的时间为2023年1月1日 11时05分05秒,经过NTP时间校准后,此服务实例的时间变为2023年1月1日11时 05分00秒,此时此服务实例生成的唯一 ID与5s前生成的ID产生了重复。​ Snowflake算法是想告诉我们:需要将所考虑的高并发与分布式环境下的变量都体现 在唯一 ID上,不是必须使用41位表示毫秒级时间戳、5位表示机房、5位表示服务实例、 12位表示同一毫秒内的并发请求,而是应该按照实际的业务情况进行灵活调整。对于毫秒精度也是同样的道理。

2025-06-10 14:13:39 1111

原创 消息队列模型 rocketmq

生产者,消费者,Broker都会在NameServer进行注册,并向NameServer发送心跳包,NameServer可搭建集群,但是节点之间不进行互相通讯,每个Broker与NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer。广播消费:每条消息会被订阅了这个topic的每个消费者组中的所有消费者消费,如有消费者组A和组B和组C,则组A、组B、组C中所有的消费者都要消费这条消息。单向发送:直接发送,不管是否成功。接收消息,消息持久化,提供消息。

2025-06-12 18:45:22 673

原创 分布式唯一ID生成器 最详解

​ 无论一个业务实体的数据被分散到多少个数据库中,每条数据的唯一 ID都 是全局的,这个全局唯一 ID就是分布式唯一 ID。​ 占用8字节(64位)的long类型整数适合用作唯一 ID,因为:一是long类型虽然占 用的空间较小,但是可表示的ID范围却非常大;二是long类型整数很容易实现递增的效 果。。

2025-06-12 18:42:50 727

原创 CompletableFuture api及解释

result用于存储当前CF的结果,stack(Completion)表示当前CF完成后需要触发的依赖动作(Dependency Actions),去触发依赖它的CF的计算,依赖动作可以有多个(表示有多个依赖它的CF),以栈(CompletableFuture就是帮你处理这些任务之间的逻辑关系,编排好任务的执行方式后,任务会按照规划好的方式一步一步执行,不需要让业务线程去频繁的等待。allOf的方式是让内部编写多个CompletableFuture的任务,多个任务都执行完后,才会继续执行你后续拼接的任务。

2025-06-11 21:49:34 831

原创 JAVA CAS 详解

而且只要出了锁的范围,就会同步到主存。如果不是2,例如变成5了,那么实际值5,就和预期值2不一样了, 说明这段时间内有其它线程对其修改了,那我就不能动他,否则就产生覆盖了,因为我的12是基于2来计算出来的。CAS,compare and swap,比较并交换,就是这种“锁”,其实已经不能说是一种锁了,它更像一种思想,但是另一方面也能说是一种锁,因为上面的“比较”并“交换”是必须是原子的,不然比较完是符合预期的,但就在你准备交换的前一刹那,其它线程来修改了,那还是不一致了,所以CAS还基于了。

2025-06-11 21:47:58 549

原创 JAVA 线程池 BlockingQueue详解

BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。boolean add(E e) :将元素添加到队列尾部,如果队列满了,则抛出异常 IllegalStateException。boolean offer(E e):将元素添加到队列尾部,如果队列满了,则返回 false。

2025-06-09 13:26:25 846

原创 JAVA ThreadLocal 详解

当threadlocal对象不再使用时,使用弱引用可以让对象被回收;因为仅有弱引用没有强引用的情况下,对象是可以被回收的。弱引用并没有完全解决掉对象回收的问题,Entry对象和value值无法被回收,所以合理的做法是手动调用remove方法进行回收,然后再将threadlocal对象的强引用解除。

2025-06-09 13:24:23 774

原创 JAVA 对象 详解

对象结构:对象头(元数据和指向class的指针)、实例数据、对齐填充数组对象:对象头(元数据和指向class的指针)、数组长度、数组数据、对齐填充一、当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程二、对象所需内存的大小在类加载完成后便可完全确定,开始在堆中为对象分配空间,有不同的分配算法:​ 选择哪种分配方式由Java堆是否规整决定,而Java堆是否规

2025-06-08 21:00:30 669

原创 JVM 类加载器 详解

Tomcat采用自定义类加载器破坏了双亲委派,实现了Web应用之间的类的隔离JDBC:​ JDBC中使用了DriverManager来管理项目中引入的不同数据库的驱动,比如mysql驱动、oracle驱动。​。

2025-06-08 20:58:13 1034

原创 JVM 垃圾回收器 详解

最基础、历史最悠久的收集器,是一个单线程工作的收集器,工作于新生代,使用标记-复制算法: 简单而高效(与其他收集器的单线程相比),对于内存资源受限的环境,它是所有收集器里额外内存消耗最小的;对于单核处理器或处理器核心数较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择ParNew收集器实质上是Serial收集器的多线程并行版本,ParNew收集器除了支持多线程并行收集之外,其他与Se

2025-06-07 17:58:33 1096

原创 jvm 垃圾收集算法 详解

这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储。Java堆划分为新生代(Young Generation)和老年代(Old Generation)两个区域。在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活的少量对象, 将会逐步晋升到老年代中存放。

2025-06-07 17:49:04 1142

原创 Rocketmq消息队列 消息模型 详解

生产者,消费者,Broker都会在NameServer进行注册,并向NameServer发送心跳包,NameServer可搭建集群,但是节点之间不进行互相通讯,每个Broker与NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer。广播消费:每条消息会被订阅了这个topic的每个消费者组中的所有消费者消费,如有消费者组A和组B和组C,则组A、组B、组C中所有的消费者都要消费这条消息。单向发送:直接发送,不管是否成功。接收消息,消息持久化,提供消息。

2025-06-05 20:00:56 875

原创 JVM 类初始化和类加载 详解

加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序:它在某些情况下可以在初始化阶段之后再开始(),这是为了支持Java语言的运行时绑定特性(也称为动态绑定或晚期绑定)。​ 这里是按部就班地“开始”,而不是按部就班地“进行” 或按部就班地“完成”,强调这点是因为这些阶段通常都是互相交叉地混合进行的,会在一个阶段执行的过程中调用、激活另一个阶段。

2025-06-05 15:45:08 1129

原创 JVM 内存溢出 详解

OOM 类型触发原因解决方案堆内存溢出对象过多/内存泄漏调整-Xmx,优化代码元空间溢出动态类过多限制栈溢出(线程数过多)线程数超出系统限制使用线程池,调整-Xss直接内存溢出NIO 分配过多直接内存调整通过jstatjmapjstack监控内存使用。生成堆转储文件(),用 MAT 分析内存泄漏。避免过度依赖反射、动态代理等易触发元空间问题的技术。如何避免 OOM?1. 堆内存溢出• 诊断工具:​ • 使用jvisualvmMAT。

2025-06-04 18:43:33 1463

原创 JVM 内存结构 详解

Java虚拟机在运行Java程序过程中管理的内存区域。

2025-06-04 12:21:27 849

原创 位图和布隆过滤器和布谷鸟过滤器

位图其实就是哈希的变形,他同样通过映射来处理数据,只不过位图本身并不存储数据,而是存储标记。通过一个比特位来标记这个数据是否存在,1代表存在,0代表不存在。位图通常情况下用在数据量庞大,且数据不重复的情景下判断某个数据是否存在。例如下面这道十分经典的题目给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。关于这道题目,解法其实有很多。1.快速排序后二分搜索。(内存可能不够,要16G内存)

2025-06-03 21:18:36 1130

原创 多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题

表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最小操作次数。表示 text1 的前 i 个字符与 text2 的前 j 个字符的最长公共子序列的长度。如果 text1[i-1] 与 text2[j-1] 相等(注意索引偏移),那么可以通过。f[i][j]为到达(i,j)处 的最短路径和。

2025-03-25 12:39:27 573

原创 动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题

若string 为 true,即f[n+1] = true,则string一定存在 倒数 j 个字母组成的单词 在词典中,且f[i-j]为true;状态转移:集合s 为 nums数组前i-1个数比nums[i]小的所有元素,元素记为a,状态表示:f[i]表示所有以第i个数结尾的上升子序列的集合,值为最长递增子序列的长度;​ 状态转移:若f[i-nums[i]] 为 true,则f[i]为true;f[i]表示偷取前i家的最高金额。

2025-03-25 12:38:24 1364

原创 技巧 力扣hot100热门面试算法题 面试基础 核心思路 背题

与力扣环形链表IIhttps://leetcode.cn/problems/linked-list-cycle-ii/思路相同,快慢指针找入环的第一个元素。如果一个数是众数,它出现的次数一定超过数组长度的一半,因此,即使我们在计数过程中将部分非众数的票数与之抵消,剩余的票数仍然会支持真正的众数。此处众数是指多数元素,指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。当前数为2,交换到靠后位置,但idx不增加,继续判断当前位置。当前数为0,交换到靠前位置,idx++,纯模拟,注释解释的很完美。

2025-03-24 18:23:22 400

原创 贪心算法 力扣hot100热门面试算法题 面试基础 核心思路 背题

那么如果假设今日卖出,遍历到此处时历史最低价是已知晓的信息,就降低了时间复杂度,只需要遍历一遍并记录实时最小值和实时最大利润即可;如果假设今日买入,未来最高点是未知的,需要遍历后续数组,所以时间复杂度变成n^2;贪心策略:在当前位置所能跳到的区间内,找下一次能跳到更远的位置。返回到达 nums[n - 1] 的最小跳跃次数。​ 遍历,记录下每个字母最后出现的下标;​ 再次遍历,合并区间,计算长度。

2025-03-24 16:21:23 624

原创 堆排序 力扣hot100热门面试算法题 面试基础 核心思路 背题 数组中第K个最大元素 前k个高频元素 数据流的中位数

删除任意一个元素 heap[k] = heap[size];up(k) OR down(k) OR 不变;子节点存在的话,若自己比子节点大,与两个子节点中较小的节点 交换;删除最小值 heap[1] = heap [size];修改任意一个元素 heap[h] = x;插入一个数字 heap[++size] = x;小顶堆,保存较大的一半,且元素总数为奇数的话,size比B大1;求集合当中最小值 return heap[1];大顶堆,保存较小的一半;

2025-03-23 12:36:44 436

原创 手写堆排序 数组模拟堆

heap从1开始。

2025-03-23 12:34:23 400

原创 栈 力扣hot100热门面试算法题 面试基础 核心思路 背题 滑动窗口最大值 字符串解码 每日温度 柱状图中最大矩形 有效的括号 最小栈

栈的核心思路:每个数都要进栈or队列,但是要及时维护栈or队列,当某元素没有存在的意义时就删掉,关键是思考栈尾什么时候有用与没用。题解链接https://leetcode.cn/problems/sliding-window-maximum/solutions/3067170/dan-diao-dui-lie-by-ecstatic-allenmzl-y2xt。

2025-03-22 19:38:21 1315

原创 二分查找 力扣hot100热门面试算法题 面试基础 核心思路 背题 寻找两个正序数组的中位数 搜索插入位置 搜索二维矩阵 在排序数组中查找元素的第一个和最后一个位置 寻找旋转排序数搜索旋转排序数组

两次二分。

2025-03-22 18:49:21 451

原创 回溯 力扣hot100热门面试算法题 面试基础 核心思路 背题 括号生成 单词搜索 分割回文串 N皇后 全排列 子集 电话号码的字母组合 组合总和

从字符串的起始位置开始,递归地尝试在每个位置插入分隔符,但仅当当前子串是回文时才真正插入。若无法继续形成有效分割,则回溯,即移除最后一个加入的子串并尝试其他分割点。当遍历完整个字符串时,若形成了一种有效的回文分割,则将其保存。常规dfs题,但是此题最重要的就是剪枝,因为已经排序,当第i个数使sum > target,则数组接下来的数都没必要进行计算。正斜线:用直线方程表示: y-x+n=0 (加n是为了有偏移量,因为坐标必须>0,y-x有可能<0)理解dfs的递归后的"恢复原状"。

2025-03-20 21:31:59 450

原创 图论 力扣hot100热门面试算法题 面试基础 核心思路 背题 岛屿数量 腐烂的橘子 课程表 实现 Trie (前缀树)

它首先统计了网格中的新鲜橘子数量,并将所有初始腐烂橘子的位置加入队列。然后,算法通过模拟每分钟腐烂橘子的扩散过程,不断从队列中取出腐烂橘子,检查其相邻位置是否有新鲜橘子。b. prerequisites 中的每个关系 [a, b] 表示课程 a 依赖于课程 b,在图中表现为一条从 b 到 a 的有向边。b. 如果在 DFS 的过程中遇到一个节点正在访问(flags[i] == 1),说明存在环。-1:已访问(表示当前节点的所有后续节点都已检查完毕,无需再次访问)。1:正在访问(表示当前节点在递归栈中)。

2025-03-20 19:45:22 459

原创 算法题常用API java

s.trim();

2025-03-19 16:54:31 701

原创 二叉树 力扣hot100热门面试算法题 面试基础 核心思路 背题 将有序数组转换为二叉搜索树 二叉树的层序遍历 验证二叉搜索树 二叉搜索树中第k小的元素 二叉树的右视图 二叉树展开为链表 从前序与中序

二叉树

2025-03-19 13:29:45 1762

原创 关于链表的几种模版思想

插入删除。

2025-03-18 13:04:35 313

原创 链表 力扣hot100热门面试算法题 面试基础 核心思路 背题 LRU 合成K个升序链表 环形链表II 合成两个有序链表 两数相加 删除链表的倒数第N个节点 两两交换链表中的节点 K个一组反转链表等

一定要有模版思想,特别是反转链表,直接记住。

2025-03-18 13:03:20 828

原创 数组 力扣hot100热门面试算法题 面试基础 核心思路 背题 缺失的第一个正数 和为k的子数组 最大子数组和 合并区间 轮转数组 除自身以外数组的乘积

这个算法的时间复杂度是O(n),因为我们只对数组进行了两次遍历。空间复杂度是O(1),因为我们只使用了常数级别的额外空间(用于临时存储交换过程中的值)。因为求的是 某个长前缀和 - 某个短前缀和 = k ,所以 某个长前缀和 - k = 某个短前缀和;我们在记录前缀和的同时,记录最小值;key:不同前缀和的值,value:前缀和=key的个数。不重合的数组直接放进去,先不考虑区间右端点,后续遍历时,发生重合再进行更改。前缀和的思想:最大子数组和 = 长前缀和-短前缀和 的最大值;反转,反转,再反转。

2025-03-17 12:50:14 514

原创 子串 力扣hot100热门面试算法题 面试基础 核心思路 背题 和为k的子数组 滑动窗口最大值 最小覆盖子串

考点:前缀和。

2025-03-17 12:48:15 294

原创 矩阵 hot100热门面试算法题 面试基础 核心思路 背题 旋转图像 搜索二维有序矩阵 矩阵置零 螺旋矩阵 有效的数独 生命游戏

根据规则向八个方向搜索,坐标法 遍历图。easy:先记录下行和列,再置零。一层一层旋转+偏移量。

2025-03-16 13:22:43 380

原创 滑动窗口 hot100热门面试算法题 面试基础 核心思路 背题 长度最小的子数组 无重复字符的最长子串 找到字符串中所有字母异位词 最小覆盖子串 滑动窗口最大值

题解链接https://leetcode.cn/problems/sliding-window-maximum/solutions/3067170/dan-diao-dui-lie-by-ecstatic-allenmzl-y2xt。–用哈希字典的key来判断是否重复,用value来记录字符的位置。思路很好想,就是滑动窗口,维护两个左右指针(先移动右指针,匹配成功后,移动左指针,直到再次不匹配,移动右指针),找出最小。关键是用什么数据结构,我先用的map存,时间只能超过30%,优化后用数组存,时间超90;

2025-03-16 13:03:01 338

原创 双指针 hot100热门面试算法题 面试基础盛最多水的容器 接雨水 三数之和

题解链接https://leetcode.cn/problems/container-with-most-water/solutions/3050881/hen-jian-duan-de-dai-ma-shuang-zhi-zhen-mfmxs。

2025-03-15 21:43:46 346 1

空空如也

空空如也

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

TA关注的人

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