- 博客(60)
- 收藏
- 关注
原创 知识图谱入门到实战:推荐系统实战实现
Neo4j是基于属性图模型的开源图数据库,核心优势在于高效处理实体间的多跳关联查询,完美适配知识图谱的网状数据结构。属性图模型:数据由“节点(Node)”“关系(Relationship)”“属性(Property)”三部分组成。节点和关系都可携带键值对形式的属性(如用户节点的age属性、购买关系的time属性);无 schema 灵活性:无需预先定义固定表结构,可根据业务需求动态添加节点、关系和属性,适配推荐系统中多变的实体关联场景;高效关联查询。
2026-01-07 20:34:00
605
原创 一文带你成为AI吹水高手
自主做事、能交互、能响应变化、能学新东西。比如生活助手Agent,能看到你的日程(感知)、自己规划行程(决策)、帮你订车票(干活),还能根据你的喜好调整推荐(学习)。1986年:Minsky在《思维的社会》中首次提出Agent概念,奠定理论基础;1995年:Wooldridge提出Agent的弱/强定义,明确“自主感知与执行”的核心特征;2010年代:基于规则的Deliberative架构主导,如IBM Watson,需人工预设大量规则;
2026-01-07 17:40:22
790
原创 MQTT从入门到实战
MQTT的核心是发布/订阅模型,依赖Broker中转消息,适合轻量级物联网设备通信。Spring Boot集成MQTT的关键是配置客户端工厂、消息通道和适配器,业务逻辑集中在消息处理器中。实战中要根据业务场景选择合适的QoS等级,平衡可靠性和传输效率。后续可以扩展的方向:一是搭建本地Mosquitto服务器,实现设备的局域网通信;二是增加消息持久化功能,避免服务重启后数据丢失;三是集成前端页面,实现设备状态的可视化监控。这些扩展能让项目更贴近实际应用场景,进一步加深对MQTT的理解。对比维度。
2026-01-07 16:54:28
591
原创 Kafka 高性能架构设计原理分析
很多人会把Kafka简单理解成消息队列,但其实它的定位是“分布式事件流平台”。官方定义是:一个开源的分布式事件流平台,被成千上万的公司用于构建高性能数据管道、流分析、数据集成和关键任务应用。简单说,Kafka不仅能像消息队列一样实现系统间的异步通信,还能支撑大规模的实时数据处理场景,这也是它区别于传统MQ的核心优势。AR(Assigned Replicas):分区的所有副本统称AR。
2026-01-05 20:21:27
950
原创 速成搞懂分布式锁的来龙去脉
此时线程B成功加锁,而线程A执行完业务后,在finally里把线程B的锁给删了,导致线程B的业务还在执行,又有新的线程C加锁成功,出现并发安全问题。为了解决主从复制的问题,Redis官方提出了RedLock算法,核心思路是:不用主从架构,部署多个独立的主节点(至少5个),客户端需要在超过半数的节点上加锁成功,才算整体加锁成功,以此保证容错性。如果主节点加锁成功后,还没把锁数据复制到从节点就宕机了,从节点切换成主节点,此时新主节点没有这把锁,其他线程可以加锁成功,导致锁失效。
2026-01-05 17:50:04
696
原创 OptaPlanner入门以及实战教学
OptaPlanner是轻量级、可嵌入的Java开源规划引擎(AI约束求解器),核心作用是:在满足一系列约束条件的前提下,对复杂问题找到“相对最优解”。用大白话解释:就像你请了一个“智能规划助手”,你把所有限制条件(比如“老师A周三下午不能上课”“房间B只能上理科课”)和优化目标(比如“尽量让老师连堂”“减少学生换教室的次数”)告诉它,它就会在合理时间内给出一份最符合要求的安排,不用你手动一点点试错。资源分配类:员工排班、车辆路径规划、云资源调度;日程安排类:课程表规划、会议安排、设备维护调度;
2026-01-03 21:22:41
1054
原创 搜索系统架构入门篇
搜索引擎有狭义与广义之分:狭义上,是基于软件技术开发的互联网数据查询系统,典型如百度、Google,供用户快速检索所需信息;广义上,是信息检索系统的核心组成部分,完整的信息检索系统还包含信息抽取、信息过滤、信息推荐等模块。搜索引擎是“工程技术+算法模型”的复杂系统,核心流程可概括为“离线构建数据基础,在线响应用户需求”:离线模块通过爬取、解析、索引构建,为搜索提供高质量数据储备;在线模块通过Query理解、召回、排序的漏斗式流程,精准匹配用户需求,返回优质结果。
2026-01-03 16:18:46
1239
原创 java转go语言入门基础篇(二)
协程(goroutine):Go的轻量级并发载体,比Java Thread更轻量、高效,启动仅需go关键字,是实现百万级并发的基础;信道(channel):协程间的安全通信桥梁,遵循“通信共享内存”理念,天然支持同步和并发安全,可替代Java的“共享内存+锁”通信模式;锁(sync包):并发安全的兜底保障,Mutex(互斥锁)和RWMutex(读写锁)分别对标Java的synchronized和ReentrantReadWriteLock,适合共享变量修改场景;上下文(context)
2026-01-02 16:54:41
633
原创 java转go速成入门笔记篇(一)
/ 1. 定义map:map[键类型]值类型// 方式1:先声明,后初始化userMap = make(map[int]User, 10) // make是Go内置函数,用于初始化map(指定初始容量10)// 方式2:声明+初始化一步到位1: {Name: "张三", Age: 25},2: {Name: "李四", Age: 30},// 2. 新增/修改(键存在则修改,不存在则新增)userMap[1] = User{Name: "张三", Age: 25}
2026-01-02 16:46:06
695
原创 DDD领域设计精讲
DDD是一种应对复杂业务系统的软件设计方法论,其核心目标是让软件设计与业务需求精准对齐。将业务领域分解为可管理的子域,明确核心业务价值;通过“统一语言”消除业务与技术团队的沟通壁垒;在明确的“界限上下文”内构建领域模型,保障模型的一致性;通过战术设计(聚合、实体、值对象等)将业务规则转化为代码逻辑;通过上下文映射定义跨域协作规则,实现系统的柔性集成。
2026-01-02 16:42:52
1033
原创 MySQL锁篇-锁类型
为了避免这种情况,Innodb引擎通过可重复读的隔离级别来实现这种逻辑备份,备份数据库的时候开启事务创建RV,事务执行期间使用RV的快照数据,基于MVCC的支持保证备份期间业务能对数据正常操作。MDL的释放是在事务提交后,假设线程A执行一个长事务,先加上MDL读锁,线程C此时修改表结构,申请MDL写锁申请不到,阻塞住,此时后续对这个表的全部select操作都会阻塞。并且存在锁互斥关系,这里和间隙锁不太一样,间隙锁是兼容多个锁锁在同一个范围的,但是记录锁是不支持的,因此 Next-Key Lock也不支持。
2025-09-05 16:14:19
974
1
原创 深入理解 jemalloc:从内存分配机制到技术选型
jemalloc(Jealloc)是由 Jason Evans 开发的高性能内存分配器,最初为 FreeBSD 系统设计,后因优异的性能被广泛应用于各类开源项目。其核心目标是 “低延迟、低碎片、高并发友好。
2025-09-03 21:12:26
1695
原创 深度解析Netty架构工作原理
BIO是通过流方式处理数据,NIO是通过缓冲区(也称为块)处理数据,块IO比流效率高,且BIO是基于字符或字节流操作,NIO基于Channel和Buffer操作。一个selector对应一个处理线程,一个selector对应多个channel。channel正常情况下对应一个buffer,有时候可能对应多个,buffer的本质是内存块,底层是数组Selector会根据不同事件在channel上切换,buffer是双向的,可读可写,channel也是双向的,可以写入也可以流出。
2025-09-03 17:17:02
1086
原创 Redis-底层数据结构篇
压缩列表适合小数据量下的链表操作,虽然查找元素的时间复杂度是O(n),但是由于数据量小加上利用上了CPU缓存,本质上更加高效,并且内存上更加节省,即使发生连锁更新这种极端情况的开销也是在可以接受的范围内记忆:一排书架上放书,好找。但是书之间的厚度不一,如果插入一本书超出书架,就要扩大空间并重新放后面的书。耗时up。
2025-09-02 20:56:37
938
原创 工单流转之框架选型
背景如下:我们有一个问题工单,要经过很多状态的流转实现工单的完成,在初期可以简单使用if-else去实现,但是基于一个扩展性而言,后续肯定要通过其他手段来实现工单的流转,避免硬编码以及性能上这些方面的问题。
2025-09-02 09:35:57
852
原创 后端笔试题-多线程JUC相关
ReentranLock的Candition实现精确的线程唤醒,避免了synchronized的随机唤醒问题,并且增加线程中断的处理等。a打印完后就加1,进入等待状态,让b醒来进行打印,b打印完进入等待,唤醒a进行打印,交替操作实现。通过“参数配置→任务拆分→并行计算→结果汇总”四步,实现了素数查找任务的多线程并行加速。遍历所有PrimeCounter实例,累加每个线程的素数计数得到totalPrimes。计算并输出总耗时(endTime - startTime)和总素数数量。
2025-09-01 16:57:25
508
原创 推荐系统中Redis 数据存储:二进制序列化协议选型与优化
Java 实现的推荐系统需将核心数据(用户画像、商品特征)存储进 Redis,供实时推荐接口查询。推荐数据中包含、用户行为序列、商品属性集合,导致单条数据占用 Redis 磁盘 / 内存空间较大。目前采用 JSON(FastJSON)文本序列化协议,虽可读性强,但存在。的问题,需探索适配推荐系统的二进制序列化协议,寻找最优数据存储方案。
2025-09-01 15:45:14
790
原创 操作系统-虚拟内存篇
内存交换的本质如下,a和b两个段之间有100m空间碎片无法被利用,将b传入磁盘再重传内存中,重传的时候直接紧跟a后面实现,对于这个内存交换空间也成为Swap空间,是从磁盘划分出来用于磁盘和内存的空间交换。不过内存碎片分为外部内存碎片和内部内存碎片,对于分段来说,是按程序大小分配的段空间,一般不存在内部内存碎片,只会存在外部内存碎片,也就是段段之间的空间无法再分配导致浪费的情况。分页的映射实际上是和分段差不多的,不过做了优化,由于页很小,因此页数是很多的,如果做一一映射会导致大量内存用来存储页表。
2025-08-30 23:01:29
988
原创 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
710
原创 一文带你搞懂大事务优化以及多线程事务!
多线程导致事务失效的核心是 “线程隔离 + 事务上下文不共享”,因此解决方案的本质是 “避免在事务内启动多线程执行数据库操作”,或通过 “分布式事务” 保证跨线程 / 跨服务的一致性。),同时启动子线程执行 “更新库存” 和 “记录操作日志”,期望三者在同一事务中(订单创建失败则库存 / 日志回滚):若业务允许 “同步执行”,则将子线程的写操作(如更新库存、记录日志)放回父线程的事务中,完全避免多线程。等场景时,事务边界内就塞进了过多、过长、过重的操作,此时这个事务就演变为 “大事务”。
2025-08-29 15:28:44
1514
原创 CPU高负载案例
调整垃圾回收器参数:例如调整新生代与老年代的比例(-XX:NewRatio),调整Survivor区比例(-XX:SurvivorRatio)。现象:线程状态可能显示为 BLOCKED 或 WAITING(等待锁),CPU高是因为线程在用户态和内核态间频繁切换,试图获取锁。分析GC日志:使用工具(如GCeasy、GCE Viewer)分析,判断是Young GC过于频繁还是Full GC。此时需要结合GC日志判断。优化算法:检查循环内的逻辑,是否存在不必要的计算或可优化的数据结构。
2025-08-29 11:31:35
670
原创 操作系统-基础知识面试常见篇
僵尸进程: 子进程终止,但是父进程还在执行,父进程没调用wait()/ waitpid()等系统调用来获取子进程的状态信息,释放子进程占用资源,导致子进程的PCB依然在系统中。出现的原因可能是子进程直接通过exit()进行结束进程生命,进程会释放全部资源但PCB依然在系统中。这种情况下子进程称为僵尸进程孤儿进程:一个进程的父进程已终止或不存在,但是进程依然在运行,这种情况下的进程就是孤儿进程。如果出现这种情况,操作系统会把孤儿进程交给init()进程来管理并进行回收。
2025-08-28 23:11:19
1001
原创 Nginx原理及设计详解
抛砖引玉问题在客户端向后端服务器发出请求的过程中,会经历哪些链路这里实际上经过了很多链路,包含了我们本次的标题中的内容可以从小林八股中的网络开始讲解析http请求 -》DNS服务器解析 -》TCP/IP/以太网头打包 -》Nginx反向代理 + 负载均衡 -》 网关 -》Web防火墙 -》真实服务器这里就不对防火墙和打包各种协议头部分进行细讲,主要集中讲解 Nginx的作用。
2025-08-28 11:48:29
752
原创 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
948
原创 Kafka架构以及组件讲解
副本的基本单元是分区,副本数不会大于 broker 数,因为副本一般和 leader 不在一个 broker 中,副本和副本也是在不同 broker 中的。对分区中的每个记录分配一个连续 id 记为 offset,以消费者为单位保留的唯一元数据是消费者在日志中的偏移量或位置。作为消息系统来说,第一肯定是解耦,解除了生产者和消费者的直接联系,通过 MQ 来作为媒介。Partition 数据查找的时候是顺序查找的,因此数据量大的时候就会很慢,通过分段 + 二分 + 索引解决。
2025-08-27 14:48:08
1753
2
原创 一文速通HashMap常见八股
对传入的键进行哈希计算,这个哈希函数会根据键对象的 hashCode 方法返回一个整数哈希值。例如,对于自定义的对象作为键,需要正确重写 hashCode 方法来确保哈希值的均匀分布。得到哈希值后,通过位运算等方式计算出该键值对在数组中的存储位置。通常是将哈希值与数组长度 - 1 进行按位与操作,这样可以确保索引在数组范围内。若计算出的位置没有元素,则直接将键值对插入到该位置。如果该位置已经有元素(发生哈希冲突),则需要进一步处理。
2025-04-25 14:30:54
696
1
原创 SpringBoot集成LiteFlow实现轻量级工作流引擎
通过注解定义组件,并实现具体的业务逻辑@OverrideSystem.out.println("发送邮件");LiteFlow 是一个功能强大且灵活的规则引擎框架,适用于复杂的业务流程编排。通过组件化的方式,可以将复杂的业务逻辑拆分为独立的组件,通过规则进行编排,实现系统的高度灵活性和扩展性。同时,LiteFlow 提供了丰富的功能,如热加载、监控、日志等,方便开发者使用。
2025-04-25 12:21:00
1879
原创 分布式事务最全详解
总结2PC能提供原子性操作,但有以下的问题待解决性能方面:执行过程中,参与者都是事务阻塞的,其他请求没法获取资源,牺牲了可用性,不适合高并发高性能场景可靠性:如果协调者在二阶段的时候宕机,全部资源都处在锁定状态,新协调者上位也没法解决(新协调者没法跟旧参与者联系,类似上下文不一致)数据一致性:在超时时间之前,一部分参与者收到commit请求执行了,一部分由于网络问题没收到commit没有执行,会带来短期数据不一致的问题1.没拿到全部回滚的ack确认码怎么处理?
2025-04-24 19:53:39
1388
原创 参考MVCC原理实现全局地址库的读取优化
在高并发、大数据量的业务场景中,传统的快照机制虽然简单,但在数据一致性和内存管理方面存在明显不足。通过引入 MVCC 的版本链机制,我们不仅解决了数据一致性问题,还优化了内存使用,提升了系统的整体性能和稳定性。这一优化实践为类似场景提供了有价值的参考。图一 直接访问全局地址库带来的问题图二 地址库版本链法优化快照法。
2025-04-23 13:56:08
1180
原创 一文带你速通接口幂等
在数据库加个额外字段 version 作为版本控制的字段,假设当前版本为5,并且用户重复发送了5次更新请求,但第一次请求成功后,版本改为6,其他4条请求自然就失效了。比如get请求就一直是幂等的,而post请求就不是幂等就了,有时候post请求就要做幂等处理来保证每个用户只能操作一次。接口是否做幂等处理取决于业务的特殊需求,一般情况下不需要引入接口幂等性,接口幂等会带来额外开销和业务复杂度。通过分布式ID作为数据库中的主键,就能保证一张表只能存在一条唯一主键记录,对于“插入”时的幂等性比较适用。
2025-04-22 23:21:52
962
原创 从0到1搞懂Raft算法
概念:Raft 是管理复制日志的一致性算法。通过选举一个领导者来管理复制日志的变更,领导者负责接收客户端请求,将日志条目复制到其他服务器,并且在日志安全复制后通知副本提交日志。技术实现流程选举阶段:在 Raft 集群启动或者领导者故障时,会触发选举过程。每个节点都从 “追随者” 状态转换为 “候选人” 状态,会给自己投票并且向其他节点发送请求投票(RequestVote)消息。如果一个节点获得了大多数节点的投票,它就成为新的领导者。日志复制阶段。
2025-04-22 15:24:46
891
原创 《动态规划从入门到精通:LeetCode Hot100经典题目详解与Java实战》
选择能完整描述问题状态的最小变量集合例题:爬楼梯(LeetCode 70)// dp[n]表示到达第n阶的方案数。
2025-02-17 11:54:45
706
原创 小红书八股面经一份(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
1105
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅