自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL锁篇-锁类型

为了避免这种情况,Innodb引擎通过可重复读的隔离级别来实现这种逻辑备份,备份数据库的时候开启事务创建RV,事务执行期间使用RV的快照数据,基于MVCC的支持保证备份期间业务能对数据正常操作。MDL的释放是在事务提交后,假设线程A执行一个长事务,先加上MDL读锁,线程C此时修改表结构,申请MDL写锁申请不到,阻塞住,此时后续对这个表的全部select操作都会阻塞。并且存在锁互斥关系,这里和间隙锁不太一样,间隙锁是兼容多个锁锁在同一个范围的,但是记录锁是不支持的,因此 Next-Key Lock也不支持。

2025-09-05 16:14:19 965 1

原创 深入理解 jemalloc:从内存分配机制到技术选型

jemalloc(Jealloc)是由 Jason Evans 开发的高性能内存分配器,最初为 FreeBSD 系统设计,后因优异的性能被广泛应用于各类开源项目。其核心目标是 “低延迟、低碎片、高并发友好。

2025-09-03 21:12:26 1542

原创 深度解析Netty架构工作原理

BIO是通过流方式处理数据,NIO是通过缓冲区(也称为块)处理数据,块IO比流效率高,且BIO是基于字符或字节流操作,NIO基于Channel和Buffer操作。一个selector对应一个处理线程,一个selector对应多个channel。channel正常情况下对应一个buffer,有时候可能对应多个,buffer的本质是内存块,底层是数组Selector会根据不同事件在channel上切换,buffer是双向的,可读可写,channel也是双向的,可以写入也可以流出。

2025-09-03 17:17:02 1032

原创 Redis-底层数据结构篇

压缩列表适合小数据量下的链表操作,虽然查找元素的时间复杂度是O(n),但是由于数据量小加上利用上了CPU缓存,本质上更加高效,并且内存上更加节省,即使发生连锁更新这种极端情况的开销也是在可以接受的范围内记忆:一排书架上放书,好找。但是书之间的厚度不一,如果插入一本书超出书架,就要扩大空间并重新放后面的书。耗时up。

2025-09-02 20:56:37 912

原创 工单流转之框架选型

背景如下:我们有一个问题工单,要经过很多状态的流转实现工单的完成,在初期可以简单使用if-else去实现,但是基于一个扩展性而言,后续肯定要通过其他手段来实现工单的流转,避免硬编码以及性能上这些方面的问题。

2025-09-02 09:35:57 830

原创 后端笔试题-多线程JUC相关

ReentranLock的Candition实现精确的线程唤醒,避免了synchronized的随机唤醒问题,并且增加线程中断的处理等。a打印完后就加1,进入等待状态,让b醒来进行打印,b打印完进入等待,唤醒a进行打印,交替操作实现。通过“参数配置→任务拆分→并行计算→结果汇总”四步,实现了素数查找任务的多线程并行加速。遍历所有PrimeCounter实例,累加每个线程的素数计数得到totalPrimes。计算并输出总耗时(endTime - startTime)和总素数数量。

2025-09-01 16:57:25 504

原创 推荐系统中Redis 数据存储:二进制序列化协议选型与优化

Java 实现的推荐系统需将核心数据(用户画像、商品特征)存储进 Redis,供实时推荐接口查询。推荐数据中包含、用户行为序列、商品属性集合,导致单条数据占用 Redis 磁盘 / 内存空间较大。目前采用 JSON(FastJSON)文本序列化协议,虽可读性强,但存在。的问题,需探索适配推荐系统的二进制序列化协议,寻找最优数据存储方案。

2025-09-01 15:45:14 778

原创 操作系统-虚拟内存篇

内存交换的本质如下,a和b两个段之间有100m空间碎片无法被利用,将b传入磁盘再重传内存中,重传的时候直接紧跟a后面实现,对于这个内存交换空间也成为Swap空间,是从磁盘划分出来用于磁盘和内存的空间交换。不过内存碎片分为外部内存碎片和内部内存碎片,对于分段来说,是按程序大小分配的段空间,一般不存在内部内存碎片,只会存在外部内存碎片,也就是段段之间的空间无法再分配导致浪费的情况。分页的映射实际上是和分段差不多的,不过做了优化,由于页很小,因此页数是很多的,如果做一一映射会导致大量内存用来存储页表。

2025-08-30 23:01:29 947

原创 RAG 系统核心:深入理解向量相似度匹配与文本向量化

文本向量化是将非结构化的文本(如句子、段落、文档)转化为低维或高维数值向量的过程。其核心目标是:让计算机通过 “向量距离” 衡量文本语义相似度 —— 向量越接近(距离越小),文本语义越相似。文本 A:“猫在追老鼠” → 向量 A:[0.23, 0.11, -0.45, ..., 0.67]文本 B:“猫咪追逐耗子” → 向量 B:[0.21, 0.13, -0.42, ..., 0.65]向量 A 与向量 B 的距离极小,计算机可判断两者语义相似。

2025-08-29 22:28:03 656

原创 一文带你搞懂大事务优化以及多线程事务!

多线程导致事务失效的核心是 “线程隔离 + 事务上下文不共享”,因此解决方案的本质是 “避免在事务内启动多线程执行数据库操作”,或通过 “分布式事务” 保证跨线程 / 跨服务的一致性。),同时启动子线程执行 “更新库存” 和 “记录操作日志”,期望三者在同一事务中(订单创建失败则库存 / 日志回滚):若业务允许 “同步执行”,则将子线程的写操作(如更新库存、记录日志)放回父线程的事务中,完全避免多线程。等场景时,事务边界内就塞进了过多、过长、过重的操作,此时这个事务就演变为 “大事务”。

2025-08-29 15:28:44 1479

原创 CPU高负载案例

调整垃圾回收器参数:例如调整新生代与老年代的比例(-XX:NewRatio),调整Survivor区比例(-XX:SurvivorRatio)。现象:线程状态可能显示为 BLOCKED 或 WAITING(等待锁),CPU高是因为线程在用户态和内核态间频繁切换,试图获取锁。分析GC日志:使用工具(如GCeasy、GCE Viewer)分析,判断是Young GC过于频繁还是Full GC。此时需要结合GC日志判断。优化算法:检查循环内的逻辑,是否存在不必要的计算或可优化的数据结构。

2025-08-29 11:31:35 659

原创 操作系统-基础知识面试常见篇

僵尸进程: 子进程终止,但是父进程还在执行,父进程没调用wait()/ waitpid()等系统调用来获取子进程的状态信息,释放子进程占用资源,导致子进程的PCB依然在系统中。出现的原因可能是子进程直接通过exit()进行结束进程生命,进程会释放全部资源但PCB依然在系统中。这种情况下子进程称为僵尸进程孤儿进程:一个进程的父进程已终止或不存在,但是进程依然在运行,这种情况下的进程就是孤儿进程。如果出现这种情况,操作系统会把孤儿进程交给init()进程来管理并进行回收。

2025-08-28 23:11:19 955

原创 Nginx原理及设计详解

抛砖引玉问题在客户端向后端服务器发出请求的过程中,会经历哪些链路这里实际上经过了很多链路,包含了我们本次的标题中的内容可以从小林八股中的网络开始讲解析http请求 -》DNS服务器解析 -》TCP/IP/以太网头打包 -》Nginx反向代理 + 负载均衡 -》 网关 -》Web防火墙 -》真实服务器这里就不对防火墙和打包各种协议头部分进行细讲,主要集中讲解 Nginx的作用。

2025-08-28 11:48:29 719

原创 JVM之CMS、G1|ZGC详解以及选型对比

小D原本是奴隶A(被检查的灰色)的孩子,如果被发现是要打去矿洞做奴隶的,小A为了小D不重复他的命运(也被检查),把小D染色得跟已确定身份的富豪B(b和b的全部孩子已被检查,黑色)一个颜色,然后说是富豪B的孩子,富豪B也认可了这个孩子,上级就不会再去查一次小D的身份(因为默认b的孩子都检查过了)于是小D成功逃脱了自己要当矿工的命运。对于JVM来说,一个对象的地址只使用前42位,43-46用来存储的是额外的信息,也就是说,如果使用ZGC,我们可以在43-46位分别标注额外信息来实现染色指针帮助GC回收。

2025-08-27 14:52:58 903

原创 Kafka架构以及组件讲解

副本的基本单元是分区,副本数不会大于 broker 数,因为副本一般和 leader 不在一个 broker 中,副本和副本也是在不同 broker 中的。对分区中的每个记录分配一个连续 id 记为 offset,以消费者为单位保留的唯一元数据是消费者在日志中的偏移量或位置。作为消息系统来说,第一肯定是解耦,解除了生产者和消费者的直接联系,通过 MQ 来作为媒介。Partition 数据查找的时候是顺序查找的,因此数据量大的时候就会很慢,通过分段 + 二分 + 索引解决。

2025-08-27 14:48:08 1723 2

原创 一文速通HashMap常见八股

对传入的键进行哈希计算,这个哈希函数会根据键对象的 hashCode 方法返回一个整数哈希值。例如,对于自定义的对象作为键,需要正确重写 hashCode 方法来确保哈希值的均匀分布。得到哈希值后,通过位运算等方式计算出该键值对在数组中的存储位置。通常是将哈希值与数组长度 - 1 进行按位与操作,这样可以确保索引在数组范围内。若计算出的位置没有元素,则直接将键值对插入到该位置。如果该位置已经有元素(发生哈希冲突),则需要进一步处理。

2025-04-25 14:30:54 654 1

原创 SpringBoot集成LiteFlow实现轻量级工作流引擎

通过注解定义组件,并实现具体的业务逻辑@OverrideSystem.out.println("发送邮件");LiteFlow 是一个功能强大且灵活的规则引擎框架,适用于复杂的业务流程编排。通过组件化的方式,可以将复杂的业务逻辑拆分为独立的组件,通过规则进行编排,实现系统的高度灵活性和扩展性。同时,LiteFlow 提供了丰富的功能,如热加载、监控、日志等,方便开发者使用。

2025-04-25 12:21:00 1772

原创 多线程事务?拿捏!

场景:有一批1万或者10万数据,插入数据库,怎么做。

2025-04-24 21:22:11 258

原创 分布式事务最全详解

总结2PC能提供原子性操作,但有以下的问题待解决性能方面:执行过程中,参与者都是事务阻塞的,其他请求没法获取资源,牺牲了可用性,不适合高并发高性能场景可靠性:如果协调者在二阶段的时候宕机,全部资源都处在锁定状态,新协调者上位也没法解决(新协调者没法跟旧参与者联系,类似上下文不一致)数据一致性:在超时时间之前,一部分参与者收到commit请求执行了,一部分由于网络问题没收到commit没有执行,会带来短期数据不一致的问题1.没拿到全部回滚的ack确认码怎么处理?

2025-04-24 19:53:39 1358

原创 参考MVCC原理实现全局地址库的读取优化

在高并发、大数据量的业务场景中,传统的快照机制虽然简单,但在数据一致性和内存管理方面存在明显不足。通过引入 MVCC 的版本链机制,我们不仅解决了数据一致性问题,还优化了内存使用,提升了系统的整体性能和稳定性。这一优化实践为类似场景提供了有价值的参考。图一 直接访问全局地址库带来的问题图二 地址库版本链法优化快照法。

2025-04-23 13:56:08 1169

原创 一文带你速通接口幂等

在数据库加个额外字段 version 作为版本控制的字段,假设当前版本为5,并且用户重复发送了5次更新请求,但第一次请求成功后,版本改为6,其他4条请求自然就失效了。比如get请求就一直是幂等的,而post请求就不是幂等就了,有时候post请求就要做幂等处理来保证每个用户只能操作一次。接口是否做幂等处理取决于业务的特殊需求,一般情况下不需要引入接口幂等性,接口幂等会带来额外开销和业务复杂度。通过分布式ID作为数据库中的主键,就能保证一张表只能存在一条唯一主键记录,对于“插入”时的幂等性比较适用。

2025-04-22 23:21:52 946

原创 从0到1搞懂Raft算法

概念:Raft 是管理复制日志的一致性算法。通过选举一个领导者来管理复制日志的变更,领导者负责接收客户端请求,将日志条目复制到其他服务器,并且在日志安全复制后通知副本提交日志。技术实现流程选举阶段:在 Raft 集群启动或者领导者故障时,会触发选举过程。每个节点都从 “追随者” 状态转换为 “候选人” 状态,会给自己投票并且向其他节点发送请求投票(RequestVote)消息。如果一个节点获得了大多数节点的投票,它就成为新的领导者。日志复制阶段。

2025-04-22 15:24:46 883

原创 《动态规划从入门到精通:LeetCode Hot100经典题目详解与Java实战》

选择能完整描述问题状态的最小变量集合例题:爬楼梯(LeetCode 70)// dp[n]表示到达第n阶的方案数。

2025-02-17 11:54:45 656

原创 Mysql一行数据如何存储(操作系统)

深入Mysql理解数据存储

2025-02-17 11:33:35 640

原创 《Java 8 Stream流与Lambda表达式:从入门到精通,轻松玩转集合操作!》

通过Steam流写出优雅代码~~

2025-02-14 13:54:44 315

原创 小红书八股面经一份(JAVA开发)

mysql索引底层采用的是b+树的结构,一开始mysql的索引采用的是b树的结构,当数据量达到一定程度的时候,b树存在深度过大的问题,那么磁盘io次数就会飞速上升,导致查询效率慢。b+树就很好的解决了这个问题,比如存储2000万条数据的时候,b+树的实际存储深度也就3,4层,实际上就是通过减少树的深度来减少查询时的io次数,io实际上是一个重操作。但是3,4,7在上次存储kakuqo的时候已经标记成为1了,那么系统会判断ka存在,实际上ka是不存在的。eg:ka经过三个哈希函数映射到了3,4,7.

2025-02-12 19:48:47 1089

原创 深入浅出:8种常见排序算法的效率对比与应用场景(JAVA)

快速排序、桶排序、归并排序、堆排序

2025-02-12 16:28:15 856

原创 本地缓存与分布式缓存:如何高效解决数据一致性问题?

多级缓存中保证本地缓存数据一致性解决方案

2025-02-12 11:38:17 673

原创 算法基础之排序算法大总结1!!

数组排序算法总结(包含分析优化)

2025-02-11 20:14:06 489

原创 零拷贝原来这么简单!

一文带你搞懂零拷贝并在JAVA实战使用

2025-02-11 18:11:10 1505

原创 《深入浅出线程池:池化技术详解》

线程池的出现是针对线程管理效率低下问题的解决方案。通过线程池,开发者可以将线程作为资源池进行统一管理,避免了频繁创建和销毁线程的内存开销,同时提高了系统的执行效率。理解线程池的核心参数和运作逻辑,对于开发高效的并发系统至关重要。线程池的拒绝策略帮助我们管理并发任务时的压力和风险。每种策略适合不同的场景,可以根据实际需要选择合适的策略。关键在于理解不同策略的特点,并根据任务的重要性和对系统的影响来做出决策。如果任务必须保证执行,使用会比较合适;如果任务可以适当延迟或丢弃,可以选择或。

2025-02-09 22:01:38 899

原创 一文搞懂线程池应用以及动态线程池原理!

这个AtomicInteger类型,是对线程池的运行状态和线程池中有效线程的数量进行控制的一个字段, 它同时包含两部分的信息:线程池的运行状态 (runState) 和线程池内有效线程的数量 (workerCount),高3位保存runState,低29位保存workerCount。实际上,线程池的参数设计根据程序扩展和业务流量的变化是需要实时进行更新的,那么我们可以考虑使用动态线程池来解决这个问题,把线程池的配置参数放在分布式配置中心上,程序的参数从分布式配置中心读取,就能够实现实时更新功能。

2024-12-26 11:17:48 1160 2

原创 RabbitMQ消息丢失、消息重复、消息积压处理思路

处理方法:RabbitMQ提供了一个publisher confirm生产者确认机制,消息发到MQ后会发一个确认码返回生产者,表现消息是否处理成功。消费者消费完了后准备向队列发送ack确认码时,由于网络抖动或者消费者突然挂了,ack码无法按时发出,于是启动重试机制,导致了重复消费问题。生产者生产速度高于消费者消费速度,导致消息堆积,如果队列里的消息满了,之后的消息可能就变成死信消息,会被丢弃。解决方法:消息持久化,就是把消息持久化到磁盘里,MQ默认是用内存去存储消息的。三个都要持久化才能保证消息的持久化。

2024-12-09 21:42:02 652

原创 Dubbo基本使用与原理详解

一文入门Dubbo,深入了解Dubbo背后运作原理

2024-12-03 22:35:58 1159

原创 仲恺软工复习文档

实际上高内聚低耦合是一起的,你的程序每个模块功能都是高内聚的,那么必然低耦合,每个模块中代码都是高度和该模块功能相关联的,这就是高内聚,如果你的模块很大程度上依赖于其他模块的正常运行,那么如果一个模块崩了,整个项目就直接垮掉,这是绝对不满足现代程序设计的要求的,因此当下框架采用MSCM架构来设计程序还是大智慧的,我们要修改功能模块就找Controller层对应接口,然后从对于接口到实现层对应方法,再从实现层到mapper层对应方法,很容易就能修改单个功能而不会影响到其他接口的正常运行。

2024-11-02 17:09:51 986

原创 一文搞懂在JAVA中实现RAG(检索增强生成)模式!

问答接口主要流程是:传入问题和对应要查的ES库->问题进行向量化->使用ES的cos余弦函数算法实现查找相关性文档->这里的文档要做限制(因为大模型支持传入的token是有限的,token就是传入的内容单位)->问题和召回内容都传入prompt中组合成传给大模型的信息。下图就是RAG模式的一个大致流程,我个人觉得预训练和RAG模式一起使用可能会导致一些问题,比如我预训练的数据中把LLM训练成一个厨师,然后我提问的时候,召回的信息都是法律信息,那么大模型肯定会乱掉,传回的信息肯定质量也出问题。

2024-10-31 15:08:18 1725 1

原创 面向后端开发HTTP常见面试题学习

有兴趣可以使用一下,对同一个接口发送请求,有时候就是304,直接读浏览器缓存,而不是在服务器调用接口,这里我就不写清楚了,实际上后端开发也不会去纠结那么深,项目遇到这方面问题再进行了解即可。两者最大的差别就是Post需要发送Body报文给后端来获取对应处理资源,body是不限制长度的,如果是Get请求的话,一般是用query参数拼接在url上面的,url一般是有限制长度的,如果url过长就会直接报错。HTTP是超文本传输协议,是一种双向的协议,客户端向服务器,服务器向客户端。这两个方法是安全幂等的吗?

2024-10-31 10:55:37 487

原创 计算机网络原理分析复习

TCP/IP 网络模型:同一台设备有多个进程,进程之间通信有多种方式,但是如果是不同设备之间进行通信,就需要网络这个媒介来通信了,但是设备是多种多样的,比如我手机端发给电脑端,电脑端又分为linux、windows系统等等,为了兼容性,协商出了一套通用的网络协议。简单总结就是,IP协议就是知道了两个地点之间的距离,然后具体怎么走到那个地方要看路由,也就是导航,我们生活里两个地方之间有不同的路线,我们可以选择走不同的路线,换成网络就是走不同的路由。网络层有区分设备的编号,使用IP地址来对设备进行编号。

2024-10-30 15:14:38 988

原创 超详细的SpringBoot集成RabbitMQ教程实现收发消息!!

RabbitMQ集成SpringBoot学习

2024-10-24 14:22:38 1428

原创 JAVA后端实习面经2篇自测题+答案

进程是动态运行的,一个进程是由多个线程组成的,多个线程可以共享进程的方法区和内存空间,但每个线程都有自己的程序计数器、虚拟机栈、本地方法栈。ThreadLocal的实现是基于Thread类中的ThrealLocalMap实现的,它的key是ThrealLocal的线程,value就是保存的数据值。ThreadLocal在使用的时候要显式调用remove()方法,因为GC回收的时候是不会去回收这个线程的,这会导致内存泄露的问题。Mysql中有很多索引,根据他们的类型又分为。索引个数:联合索引,单列索引。

2024-10-20 18:45:36 830

空空如也

空空如也

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

TA关注的人

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