- 博客(50)
- 收藏
- 关注
原创 DeepSeek Harness 记忆系统漫游指南:一本永不失忆的账本,一扇可调节的观察窗
模型服务的缓存认"请求前缀",前缀变了缓存就失效。专门设计一套缓存管理逻辑,小心翼翼地维护前缀稳定——这是把"缓存"当成一个要管理的对象,往往越管越复杂。
2026-08-19 20:45:05
334
原创 从“让两个程序说上话“开始:小白也能懂的 Protobuf 与 RPC
本文通过一个订单服务与用户服务交互的真实任务,介绍了 Protobuf 和 RPC 的核心概念与应用。文章采用任务驱动方式,首先展示传统 HTTP+JSON 方案的痛点(包体大、解析慢、无契约),进而引出 Protobuf 的解决方案:通过.proto文件定义数据结构契约,实现高效二进制编码。随后解释 RPC 框架如何让远程调用如同本地函数,并重点说明 Protobuf 与 RPC 框架的协作机制——protoc编译器通过插件生成各语言的桩代码,实现"契约驱动开发"。
2026-07-24 11:39:03
200
原创 从零理解 TypeScript 项目的架构与构建原理
本文是一篇TypeScript项目构建原理的入门指南,作者通过一个虚构的待办事项项目(包含网页版、命令行版和日期工具库三个子包)来讲解核心概念。文章采用问题导向的方式,按照项目开发的时间线组织内容: 首先解释了项目、包、依赖等基础术语 重点分析了package.json文件的关键字段及其作用 介绍包管理工具(npm/pnpm)和TypeScript编译器(tsc) 讲解如何抽离共享代码为独立库 介绍monorepo组织方式实现包间共享 解释开发/生产环境的差异和构建原理 最后提供速查表方便复习。
2026-07-20 13:21:30
317
原创 Mysql日志——当mysql执行一个事务的时候,三个日志的记录顺序是什么?
MySQL事务执行过程中,日志记录顺序遵循严格流程:首先写入Undo Log记录修改前数据,然后准备Redo Log并标记为Prepare状态。提交时采用两阶段提交机制:先写入Binlog逻辑日志,再将Redo Log状态改为Commit。这种设计通过Undo Log实现回滚,Redo Log确保数据持久性,Binlog支持主从复制,三者协同工作保证事务的原子性和一致性。两阶段提交机制是关键,它确保Redo Log和Binlog在崩溃恢复时能保持数据一致,避免主从不一致或数据丢失问题。
2026-03-09 13:15:05
436
原创 吃透设计模式:从原理到落地(如何选型),Java/Spring开发场景
本文系统讲解了设计模式的核心分类及Java实现,涵盖创建型(单例、工厂)、结构型(适配器、代理)和行为型(策略)三大类模式。通过具体代码示例展示各模式的实现方式,并关联Spring框架中的实际应用场景(如Spring Bean单例、AOP代理等),帮助开发者理解设计模式的核心思想与落地实践。文章采用“概念讲解+代码演示+框架映射”的三段式结构,使抽象的设计模式具象化,便于读者快速掌握并应用于实际开发。
2026-03-08 21:55:23
489
原创 MilvusVectorStore 使用指南 ——基于spring-ai(可用于搭建Rag)
本文介绍了Spring AI中的MilvusVectorStore组件,它实现了向量存储功能,支持将文档嵌入存储到Milvus向量数据库并进行相似性搜索。文档详细说明了配置方法(自动配置或手动构建)、核心功能(添加/删除文档、相似性检索)以及高级特性(元数据过滤、监控)。使用前提需要运行Milvus服务并添加相关依赖,注意嵌入维度需与模型匹配,集合会自动创建。通过示例展示了如何集成到Spring Boot应用中构建RAG系统。
2026-03-05 19:00:00
714
原创 Milvus Collection 基本操作(Java SDK)
本文介绍了Milvus中Collection(集合)的基本操作指南,包括创建、删除、检查存在性、查看详情、获取统计信息等核心功能。通过MilvusServiceClient实例调用方法,所有操作返回R<T>类型结果对象,可通过getStatus()和getData()处理响应。操作涵盖集合生命周期管理(创建/删除)、元数据查询(描述/统计)、内存管理(加载/释放)及高级功能(重命名/属性修改)。文章还提到可选的简化高阶API接口,为开发者提供了全面的集合操作参考。
2026-03-05 13:41:42
488
原创 Spring AI Alibaba ReactAgent 多智能协作指南
本文档基于 AgentToolExample.java,展示了如何将子智能体作为工具供主智能体调用,实现多智能体协作。核心推荐使用类型化(Typed)方式定义输入输出,通过 inputType 和 outputType 自动生成 JSON Schema,确保代码安全性和可维护性。文档对比了类型化与手动编写 Schema 的差异,提供了完整类型化 Agent 工具、仅类型化输入/输出以及多子 Agent 协作的实践示例,并强调优先使用 Java 类型系统处理 Schema 转换。最佳实践建议始终优先采用类型化
2026-03-04 14:20:01
439
原创 Spring AI Alibaba ReactAgent工具添加学习笔记:methodTools与tools
本文记录了学习Spring AI Alibaba中ReactAgent工具添加功能的过程。通过分析源码发现,methodTools通过扫描带有@Tool注解的方法自动创建工具,而tools则需手动创建ToolCallback。对比两种方式后,推荐使用methodTools结合@Tool注解的方式,代码更简洁且易于维护。文章还详细介绍了@Tool和@ToolParam注解的使用方法,为开发者提供了实用的工具添加指南。
2026-03-03 10:46:58
844
原创 SpringBoot从零构建符合工程规范的Redis配置类(全解析)
作为Java开发新手,使用SpringBoot集成Redis时,往往会直接用默认配置,结果遇到序列化乱码、缓存穿透、类型丢失等问题。本文从0开始,一步步教你编写符合企业工程规范的Redis配置类,涵盖RedisTemplate自定义、ObjectMapper优化、RedisCacheManager配置等核心内容,每一步都标注作用和解决的问题,方便复习和团队学习。
2026-02-09 21:36:31
848
原创 算法学习记录19——保姆级理解「买卖股票的最佳时机 II」从暴力DFS→动态规划
摘要: 动态规划(DP)的本质是对暴力枚举的优化。以「买卖股票的最佳时机 II」为例,从暴力DFS出发,每天只有持有/不持有两种状态,对应三种操作(不操作、买入、卖出)。暴力解法枚举所有路径,但存在冗余——只需保留每天两种状态下的最大利润即可。DP状态定义dp[i][0]和dp[i][1]分别表示第i天不持有/持有股票的最大利润,转移方程完全复刻DFS操作逻辑: 不持有:max(昨天不持有, 昨天持有+今天卖出) 持有:max(昨天持有, 昨天不持有-今天买入) 最终结果为最后一天不持有的利润。核心逻辑:先
2026-02-08 20:40:37
643
原创 缓存更新策略——由浅入深
本文系统介绍了三种常见缓存更新策略:内存淘汰(Redis自动清理)、超时剔除(TTL过期)和主动更新(业务逻辑同步)。重点解析了主动更新的三种高级模式:Cache Aside(读写分离维护)、Read/Write Through(统一服务封装)和Write Behind(异步延迟写回),通过类比和伪代码说明其原理、优缺点及适用场景。文章强调Cache Aside模式最适合大多数Web应用,而Write Behind适用于高性能写入场景,为开发者选择缓存策略提供了实用指导。
2026-01-19 14:00:00
915
原创 StringRedisTemplate 和 RedisTemplate 的区别是什么?
摘要:StringRedisTemplate和RedisTemplate是Spring操作Redis的两个核心类。前者专用于字符串操作(key/value均为String),默认使用可读的字符串序列化;后者是通用模板,支持任意Java对象但默认采用JDK序列化(会产生二进制乱码)。实际开发中,推荐优先使用StringRedisTemplate配合JSON工具处理对象序列化,因其简单、可读且开箱即用,适合大多数缓存场景;而RedisTemplate需自定义序列化配置后才适合存储复杂对象。两者的选择应基于数据类
2026-01-18 14:40:31
365
原创 OS八股:HTTP 与 WebSocket 的通信模型差异 —— 理解等待、轮询、阻塞与全双工
本文对比了HTTP和WebSocket的核心差异,重点解析了全双工通信、轮询机制和阻塞I/O等关键概念。HTTP基于请求-响应模型,无法实现服务器主动推送,需通过轮询模拟实时通信,效率低下。而WebSocket通过一次握手建立持久连接,支持双向实时数据传输,适用于聊天、游戏等场景。文章还澄清了"等待响应"不会阻塞CPU,并比较了阻塞/非阻塞I/O的特点。最后总结了WebSocket的优势:低延迟、高效帧结构、自动重连等特性,使其成为实时应用的理想选择。
2026-01-14 14:13:10
796
1
原创 算法学习记录19——快慢指针的两种写法和坑
摘要: 本文深入解析快慢指针算法的两种常见写法及其应用场景。宽松写法(A)和严格写法(B)在循环终止条件上的细微差异,会导致指针最终停留在链表的不同中点位置(前中点或后中点)。作者通过五大典型应用场景(寻找中间节点、链表归并排序、判断回文链表、Floyd判圈算法和链表转BST)详细对比了两种写法的适用情况,并总结出记忆口诀:"要后中点用A,要前中点用B"。文章还提供了速查表,帮助开发者根据不同算法需求快速选择正确的实现方式,避免常见的逻辑错误。
2025-12-26 20:52:32
816
原创 OS八股:为什么进程间通信开销大?线程间通信为什么快?
摘要: 进程间通信(IPC)开销远高于线程间通信(TIC),核心差异在于内存隔离性与内核介入程度。进程因独立地址空间需通过内核中转(如管道、Socket),触发上下文切换与数据拷贝;线程共享内存,可直接访问变量,仅需用户态同步(如CAS)。关键优化包括:1)优先多线程减少IPC;2)使用无锁结构(Atomic类)避免内核锁;3)高频场景用共享内存(mmap)。选择依据:安全隔离选进程,性能优先选线程,通信密集用共享内存+无锁同步。
2025-12-22 21:05:06
688
原创 算法学习记录18——并查集 vs Set + BFS/DFS
本文对比了LeetCode 2092题的两种解法:Set+BFS和并查集(Union-Find)。Set+BFS通过按时间分组处理会议,从已知秘密者出发遍历连通分量,具有直观、高效剪枝的优点。并查集解法需为每个时间点新建并查集,操作虽快但需处理所有节点且容易出错。分析表明,对于分阶段状态传播问题,Set+BFS更合适;而动态连通性查询场景仍需并查集。两者适用场景不同:Set+BFS适合离线传播状态,并查集更适合在线动态连通性判断和高频集合合并操作。
2025-12-19 13:09:49
1070
原创 算法学习记录17——力扣“股票系列题型”
dp[j][0]:在「最多 j 次交易」的限制下,不持股的最大利润dp[j][1]:在「最多 j 次交易」的限制下,持股的最大利润最多 j 次交易而不是「已经完成 j 次交易」。这是后面所有结论的根源。是否需要对 k 倒序遍历,关键不在于 DP 的形式,而在于 j 表示什么。j 的含义是否需要倒序已经用掉 j 次交易✅ 必须倒序最多允许 j 次交易❌ 可以正序再补一句非常重要的经验:在「最多 k 次交易」的股票 DP 中,即便同一天发生“买入 → 卖出”,
2025-12-17 16:20:57
343
原创 算法学习记录16——Floyd 判圈算法(环形链表 II)
。看题解了解到了,感觉本质上还是数学一开始我对这个算法只是有个模糊的印象——“快慢指针能判断有没有环”,但具体怎么找到环的入口?为什么那样做是对的?这些细节我其实并不清楚。于是,我决定花点时间彻底搞懂它,并把整个思考过程记录下来。
2025-12-15 13:56:33
620
原创 算法学习记录15——有向图的环检查(课程表)
✅三色法不是为了炫技,而是为了准确表达三种必要状态。❌仅用两色 + 全局重置会导致效率灾难和逻辑脆弱。✅ 如果你用visitedpath_set,其实也是三状态,只是实现方式不同。💡算法设计的关键,是建模清楚“状态”的含义,而不是追求形式上的简化。“灰色”不是可有可无的中间色,而是检测环的唯一可靠依据。我删掉的,真的是冗余,还是核心?写于 2025 年 12 月 14 日,周日下午。调试完代码,喝了一口冷掉的咖啡,终于搞懂了三色法的深意。
2025-12-14 20:32:31
875
原创 算法学习记录14——单调栈学习笔记
一定要存索引,不是值!值可能重复,而且我们需要知道位置来更新答案或计算距离(比如柱状图面积)。方向很重要从左往右:通常求“右侧”的第一个更大/小元素。从右往左:可以求“左侧”的第一个更大/小元素。相等元素怎么处理?一般题目中“更大”指严格大于,所以相等时不弹出。但要看题意,有时需要弹出(比如“下一个不小于”)。哨兵技巧(进阶)在数组开头或结尾加一个极小/极大值,可以避免边界判断。比如在柱状图问题中,在末尾加 0,确保所有柱子都被弹出并计算面积。
2025-11-28 15:16:07
862
原创 算法学习记录13——中位数贪心
中位数贪心是基于中位数特性的优化策略,核心结论是:在最小化 “点到所有目标位置距离之和” 的场景中,选择中位数作为决策点最优。
2025-11-15 19:35:03
774
原创 算法学习记录11——Python 多变量赋值问题
当用Python实现链表反转时,多变量赋值的顺序会导致结果差异。两段看似相似的代码中,正确的last, head.next, head = head, last, head.next会先基于原状态计算右侧值再赋值,确保指针正确反转;而错误的head, head.next, last = head.next, last, head会因先移动head导致错误修改指针,使链表断裂。这揭示了Python多变量赋值的执行机制:先并行计算右侧表达式值,再顺序完成左侧赋值操作。在链表操作中必须注意这种细微差别。
2025-11-03 18:46:10
543
原创 算法学习记录10——01背包和完全背包
我最早搞懂的是 0-1 背包。有 n 个不同物品,每个物品只有 1 个,要么放进背包,要么不放,求背包能装下的最大价值。比如这个例子:有 3 个物品,重量分别是 2、3、4,价值分别是 3、4、5,背包容量是 5。每个物品只能选一次,怎么选价值最大?答案是选前两个(总重 5,总价值 7)。dp[j]代表「当背包容量为 j 时,能获得的最大价值」。这个定义很关键,把二维问题压缩成了一维(省空间)。每个物品可以无限次选,只要背包装得下。还是用之前的例子:物品重量 2、3、4,价值 3、4、5,背包容量 5。
2025-10-31 09:38:44
713
原创 算法学习记录06——哈希链表构建LRU算法
学习记录——力扣LeetCode【146】设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构
2025-10-24 14:00:00
851
原创 算法学习记录03——二叉树学习笔记:从两道题看透后序位置的关键作用
练完这两道题,我自己总结了一个小规律:以后在做二叉树的题目时,先看题目是不是和 “子树” 有关 —— 比如求子树的节点数、子树的高度、子树的最大值、判断两棵子树是否对称等等。如果是,那大概率要用到后序遍历。而且这类题的解题步骤也很固定:先给递归函数定一个明确的 “返回值”—— 比如求子树节点数,返回值就是当前节点子树的节点数;求子树高度,返回值就是当前节点子树的高度;递归处理左子树和右子树,拿到它们的返回值;在后序位置,用左子树和右子树的返回值,计算当前节点的结果;。
2025-10-21 21:54:46
974
原创 算法学习记录01——快速幂取模:轻松计算“a的b次方对p取模”
在编程和数学竞赛中,我们经常会遇到这样的问题:如何快速计算abmodp。比如,计算3100mod7是多少?如果直接计算3100,那将是一个天文数字,不仅计算慢,还可能溢出。今天,我们就来聊聊一个高效又实用的算法——快速幂取模。
2025-10-16 14:02:49
1096
原创 图像分类数据集难度怎么评?
图像分类数据集的难度可不是凭感觉判断的!从 MNIST 到 ImageNet,为什么有的数据集训练起来轻松,有的却让模型频频出错?这篇文章整理了评估数据集难度的核心方法,包括距离度量、信息熵、分离度等关键指标,还对比了经典数据集的难度差异。无论是想选合适的训练数据,还是理解模型性能差异,这些实用知识都能帮你快速入门,小白也能看懂哦~
2025-10-14 20:35:10
862
原创 图像处理踩坑:浮点数误差导致的缩放尺寸异常与解决办法
在做图像预处理(按最短边缩放 + 中心裁剪)时,我遇到了 DataLoader 报错 “Trying to resize storage that is not resizable” 和 “stack expects each tensor to be equal size”。排查后发现,罪魁祸首是浮点数误差导致缩放后的图像尺寸不符合预期,进而引发批量拼接失败。本文会详细讲清楚问题根源、排查过程,以及兼顾 “精准缩放” 和 “极端情况鲁棒性” 的解决方案,希望能帮到遇到同样 bug 的朋友。
2025-10-09 15:57:16
1048
原创 Linux服务器NAS挂载教程:使用Truenas
本文档用于配置 Linux 服务器自动挂载 NAS 设备的 NFS 共享资源,确保系统启动时自动建立连接。
2025-09-29 19:00:00
798
原创 双网卡服务器校园网访问故障排查与解决
本文记录双网卡服务器(校园内网固定 IP + 路由器分配公网 IP)在校园网环境下,外部设备通过校园网直连无法访问内网 IP 的故障排查过程。核心定位路由表回包策略问题,通过配置策略路由实现校园网流量精准转发,同时保留双网卡功能,为同类网络配置问题提供参考。
2025-09-27 21:59:32
1172
1
原创 PyTorch 模型参数获取方法介绍:state_dict 、parameters 、named_parameters 等
在 PyTorch 模型训练和部署过程中,灵活获取和操作模型参数是一项基础且重要的技能。本文整理了我在学习过程中总结的 PyTorch 参数获取方法,包括 parameters ()、named_parameters ()、state_dict () 等常用接口,详细对比了它们的区别、适用场景,展示了如何在实战中选择合适的方法。无论是模型训练中的参数优化、部分层冻结,还是模型保存加载,掌握这些方法都能让我们更高效地处理模型参数。
2025-09-22 21:42:24
1152
1
原创 快速入门 PyTorch 数据加载三兄弟:Dataset、Sampler 与 DataLoader
初学 PyTorch 时,Dataset、Sampler、batch_sampler 和 DataLoader 的关系总让人混淆。本文以个人学习笔记的形式,用 “餐厅运营” 的通俗类比,拆解各组件的核心作用与关联逻辑,搭配实战代码举例,帮大家快速理清数据加载的底层流程,避开理解误区。
2025-09-21 18:29:21
792
原创 Python编程技巧:浅谈dict的解包(**dict)
本文详细解析了 Python 中字典的 ** 操作符的用法,通过实际案例讲解字典解包与合并的原理,介绍了这一技巧在配置合并、函数参数传递、字典更新等场景的应用,帮助 Python 初学者快速掌握字典的高级用法,提升代码简洁性和效率。
2025-09-16 21:06:19
755
原创 从 torch.no_grad () 到PyTorch 计算图
在 PyTorch 深度学习框架中,torch.no_grad()是一个极为关键且实用的功能,对模型训练与推理流程影响深远。本文以torch.no_grad()为切入点,深入浅出地阐释 PyTorch 计算图相关知识。详细讲解计算图构建机制、自动求导原理,阐述torch.no_grad()关闭梯度计算、暂停计算图记录的工作方式,以及在推理、验证等场景中节省内存、提升速度的显著作用。
2025-09-15 20:35:10
1070
原创 USB接口与通用串行总线控制器
摘要:本文通过快递中转站的比喻,解释了Windows设备管理器中"通用串行总线控制器"的组成结构。笔记本物理USB接口对应"USB根集线器",外接扩展器接口则显示为"通用USB集线器",两者都由"USB主控制器"统一管理。关系链可简化为:主控制器→根集线器→物理接口(笔记本自带),或主控制器→根集线器→外接集线器→扩展器接口。这种层级结构帮助用户理解USB设备的连接路径和数据传输过程。
2025-09-08 13:52:19
4225
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅