自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 工作过程中常用的linux命令

该文章主要用于个人使用,纯粹是个人经验之谈ls //查看当前目录文件ll //查看当前目录文件详细信息,常用于查看权限cd //进入文件夹cat //查看文件vim 创建/查看/修改文件pwd //查看当前目录rm -rf //强制性删除文件及一下文件mkdir 创建目录/文件夹cp a b 把a文件复制到bcp -r a b 把a目录所有文件复制到bmv a b 把a改成b/移动到blsof -i:8080 查看8080端口占用情况kill -9 pid 删掉线程

2020-11-13 15:45:24 678

原创 Java Protobuf+Zstd 压缩存储Redis实践&问题解决&对比Gzip压缩的大小和性能

压缩的大小提升了2倍多,数据写入优化了10%,读取优化了1倍,所以从存储和读写优化的很明显,写入的性能实际并没有提升多少。它在几乎不牺牲解压速度的前提下,显著降低带宽和存储成本,完美契合“中等规模、低频更新、高价值结构化数据”的场景。Zstd:用真空压缩袋仔细打包,体积小很多(比如 20cm × 20cm × 20cm),但打包要 10 秒。LZ4:用普通胶带快速打包,包裹体积大一点(比如 30cm × 30cm × 30cm),打包只要 5 秒。pom.xml (版本可变,因为项目有其他的,所以写死)

2025-12-25 19:12:31 1081

原创 Milvus IllegalAccessError:com.google.protobuf.LazyStringArrayList.emptyList()

milvus-sdk-java和 protobuf-java 版本冲突问题,AI 确实给你了明确的问题出现的原因,但是让你切换的版本是错的,不要过度依赖AI,这是我依旧坚持写博客的原因,所见即所得。之前的版本是3.21.7 导致的报错,Milvus 内部调用了 LazyStringArrayList.emptyList() 方法。但是3.21.7没有,所以改成3.24.0 修复。maven 树如下(Milvus -JAVA的依赖很混乱,大家要格外注意)

2025-12-19 18:32:28 178

原创 java <T> 是什么?

但是泛型中的 T 不是“绑定到某个参数位置”的,而是“代表一个类型”,它可以出现在参数、返回值或方法内部,只要逻辑上需要类型安全和复用。在 Java 中,< T> 和 < Object> 虽然都涉及“类型”,但它们在语义、用途和类型安全性上有本质区别。虽然 JVM 在运行时会类型擦除(把 T 擦成 Object),但在编译期,T 提供了严格的类型约束,而 Object 没有。📌 原则:不要为了“看起来高级”而加泛型。第一个< T>:泛型类型参数(类型变量) T 是一个占位符,代表“调用时确定的具体类型”。

2025-12-12 17:06:17 653

原创 后端认识网关Nginx、LVS 、Keepalived、VIP &&OpenResty、APISIX、 Kong 、 Janus&&Springcloud GateWay

前沿聊天:有没有发现,近几年随着工作的深入,好像除了nginx 最亲切外,什么LVS VIP(跟会员一样) APISIX Kong 还有微服务的GateWay,各种网关层面的名词喋喋不休的出现在你的脑子里。再加上需要增加云服务的鲁棒性,一层套一层,再优化迁移。o(╥﹏╥)o 要老命了,今天就把我知道的一些名词整理一下。

2025-12-11 18:44:45 651

原创 java 项目分层 PO、VO、BO、DTO、DAO、POJO个人项目实践中的见解

当自己建立一个项目的时候,拔剑四顾心茫然,当我在旧的项目里面扒拉屎的时候,脑子混乱。作者现在还没有读DDD领域,但是频繁的遇见这样的问题的时候,说明你已经到时候读读书了(后面看完了,会继续完善该文章的),同时也是和各位看官共勉。一种是基于 DDD(领域驱动设计) 的术语体(VO/DTO/BO/PO/DO),另一种是更偏向 工程实践中的 POJO 分类(vo/query/entity/dto)。发现一个问题,一个人的项目 自己做着做着就为了省事 混着用,多人团体项目,可能从一开始就用错了,大家就将错就错。

2025-12-09 13:58:11 498

原创 java多线程环境下 安全地初始化缓存(避免缓存击穿),同时兼顾性能 的双重检查锁方案

缓存击穿 是指:某个热点 key 在缓存中过期(或不存在)的瞬间,大量并发请求同时发现缓存没有数据,于是全部打到后端数据库(或昂贵服务,如 Milvus、Embedding API)上,导致系统负载骤增甚至崩溃。重复计算 是指:多个线程/请求对同一个输入(如相同的 nodeValue)同时执行相同的昂贵操作(如调用 Embedding 接口、查询 Milvus),而这些操作的结果完全一样,造成资源浪费。实际场景:刚上线,大量请求进行请求,但是缓存并未添加完成,导致重复调用。所以 第二次检查是必须的。

2025-12-08 18:31:18 362

原创 Java GZip 压缩实践 +实践思考 +进一步压榨性能和存储方案思考:Protobuf+ GZip

考虑到GZip是为了压缩数据,减少redis 存储压力,那之前使用过Protobuf和Gzip 有什么差异了,其实这个数据同事真实的测过,gzip 压缩的大小更大,protobuf 压缩的没那么大,但是效果很好。大多是由团队数据同事写入的,根据数据人员提供的信息,当前的redis 数据已经通过Gzip 压缩过了,所以需要我将数据读取,反序列化的时候应该手动转换成String。这说明:Protobuf 负责“高效表示”,压缩算法负责“进一步缩小体积”,两者是互补的。呦西,性能优化了,数据也变小了。

2025-12-04 17:34:14 398

原创 算法题:力扣 热题100道 中等难度128. 最长连续序列

1.这道题其实很有说法,看题目很简单,但是考察的知识点比较细,比较考验逻辑思考能力(就是尼玛难为人,给聪明人写的题)给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。看到 11 → 数:11,12,13 → 长度 3 ❌(重复!不在 → 说明 10 是开头 → 开始数 ✅。看到 10 → 数:10,11,12,13 → 长度 4 ✅(有用)看到 12 → 数:12,13 → 长度 2 ❌(又重复!看到 13 → 数:13 → 长度 1 ❌(完全没必要)

2025-12-04 11:13:54 320

原创 (旧)Spring Securit 实现JWT token认证(多平台登录&部分鉴权)

创建一个线程局部全量 AdminUserHolder.set(principal);放置用户信息,用于每个请求使用。✅ 创建一个 authenticated = true 的 Authentication 对象!1.创建全局安全配置:启用方法级安全(@PreAuthorize 等)5.自定义解析请求,返回当前用户主体;6.用户认证鉴权自定义实体类,类似securtiy 自带的类。通过认证的核心方法,这个方法后,就默认已经认证通过了。集成好的加载用户信息,看诸位看官选择了。3.JWT认证过滤器。

2025-12-02 18:42:41 346

原创 milvus 修改角色限制 unable to create role because the number of roles has reached the limit

https://github.com/milvus-io/milvus/issues/27356 坚定了修改这个配置是成功的,否则我在修改的时候会怀疑人生,因为一直修改不成功。刚开始改的时候maxUserNum 修改直接是成功,所以一直觉得是我们修改的问题,但是实际上,官网好像默认就是100个用户。经过长时间的尝试,重启各个协调器,还有proxy 节点都是失败的。

2025-11-12 19:28:54 280

原创 Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to ‘0‘ makes TLS connections and HTTPS

不生效,这说明 Yarn 的证书验证机制没有受到 npm 配置的影响,因为 Yarn 使用自己的配置系统和网络请求逻辑。npm config 对 Yarn 无效。RequestError: unable to verify the first certificate 这个错误表示。在项目中设置 .yarnrc.yml 文件。使用命令 yarn config get。yarn install 报错。windows 环境。

2025-11-04 17:14:13 291

原创 AI 工程: 部署triton inference server backend模型推理服务

Triton Inference Server是一个适用于深度学习与机器学习模型的推理服务引擎,支持将TensorRT、TensorFlow、PyTorch或ONNX等多种AI框架的模型部署为在线推理服务,并支持多模型管理、自定义backend等功能。前提背景:算法想要工程部署模型推理服务,基于之前的AI平台系统调用模型基于当前的请求特征是未embedding 过的,例子: [{a:‘1’}] ,现在需要调研模型推理工具实现 支持当下业务系统调用模型。单GPU、多GPU都可以支持,CPU也支持。

2025-10-21 15:24:12 855

原创 triton 模型推理 batchSize原理

Triton 把“多个请求”打包成“一个 batch”送给你的模型,但要求你把“一个 batch 的输出”拆成“多个响应”还给客户端。Step 2:Triton 将两个 tensor 沿 batch 维度合并。

2025-10-21 14:07:26 174

原创 triton backend 模式docker 部署 pytorch gpu模型 镜像选择

因为本次安装的是基于 pytorch pth模型,同时需要pytorch 进行数据处理成张量。所以选择 pyt-python-py3。虽然镜像说是提供了pytorch 但是依旧需要下载torch 包,可能是我选择的版本问题吧…确定镜像的版本,否则镜像是不能支持对应的版本的。nvidia的官网 不同版本对应的环境。可以看出 py3 < pyt < llm Py3。我是分开执行,各位可以直接一把启动哈。查看 机器的cuda 和驱动版本。我使用了nohup,避免每次启动。指定后端启动的python 库。

2025-10-21 13:58:47 713

原创 https私人证书 PKIX path building failed 报错解决

tips: 有可能导入后证书,过一段时间后还是会出现这个报错,本人遇到了一次,个人推断是证书文件的问题,因为我把之前的证书重新导入还是会报错,如果重新导入证书,导入,问题解决。另外,同事没有遇到该问题,留下了一个问题:是因为jdk 本身的问题还是因为idea 版本的问题…原因是请求的url不是通用的CA认证,是私人的证书,jvm 识别不出来,需要手动添加该网站的认证。CER和CRT都是用于存储证书的文件扩展名,主要区别在于它们的使用场景和编码格式。路径执行 ,这个时候可以重启idea ,看下请求是否可行。

2025-10-08 09:57:41 493 1

原创 java 方法内部变量重新创建对象:外部的变量未重新赋值 ->可变对象与引用传递

,这并不会影响方法外部对这个对象的引用。,这意味着当你将一个对象传递给一个方法时,你实际上传递的是这个对象在内存中的地址。因此,如果你在方法内部修改了对象的属性,这些修改在方法外部是可见的。4.想要解决这个问题,还是要操作原来的对象,上面的代码实际是想要对原来的对象重新操作,那我直接清空然后再赋值就好了,具体的业务需要具体分析。3.如果方法内部的参数变量 新创建了对象,那这个参数指向的是新的引用地址。当你把一个对象传入方法时,并不是复制整个对象,而是复制这个对象的引用(即内存地址)。

2025-08-25 16:50:37 265

原创 java switch case 如果某个 case 分支没有以 break; 结束,Fall-through行为

这是你看到 case “p4” 执行后还会继续执行 case “p5” 的原因。一旦进入某个匹配的 case 分支(比如 “p4”),就会从那个位置开始顺序执行代码,不再判断后续的 case 条件是否匹配,除非遇到 break;Java 的 switch-case 默认允许 fall-through,也就是说不加 break 就会继续往下执行。如果你希望每个 case 只执行自己对应的逻辑,就必须在每个 case 的最后加上 break;当 type 是 “p4” 时,程序进入 case “p4”。

2025-06-11 16:15:55 423

原创 多线程下使用缓存+锁Lock, 出现“锁失效” + “缓存未命中竞争”的缓存击穿情况,双重检查缓存解决问题

多线程情况下,想通过缓存+同步锁的机制去避免多次重复处理逻辑,尤其是I/0操作,但是在实际的操作过程中发现多次访问的日志。发现问题了,如果finally 及时删除锁,可能会出现下一个线程重新建立锁对象,然后多了查询缓存的性能消耗。这就导致多个线程可能都进入了 lock.lock() 后的代码块,并且都执行了实际查询逻辑。// 可选释放锁对象。当T2 进入的时候处理逻辑,发现没有锁,上锁,访问缓存。当T1 进入的时候处理完逻辑后,放入缓存,然后删除锁。这个可能出现锁失效的情况。为了避免这种情况存在。

2025-06-06 10:42:03 596

原创 RestTemplate 发送的字段第二个大写字母变成小写的问题探究

在使用RestTemplate 发送http 请求的时候,发现nDecisonVar 转换成了ndecisonVar ,但是打印日志用fastjson 打印的没有问题,换成jackson 打印就有问题。作为json 序列化方式,导致的问题,但是为什么出现这个问题呢?一直搜网上,其实也没有个准确的答案而且很多都是错的,所以我就根据我的理解解读一下。实体类使用的Lombok @data 进行的getter setter方法生成,发现lombok 和java bean 的规范有差异。

2025-05-21 19:49:44 467

原创 torch serve部署原理探索

TorchServe 采用的是 基于 Java 服务化框架 + JNI 调用 LibTorch(C++) 的混合架构,而非直接依赖 Python 进程或纯 Java 实现。局限性:对 C++/JNI 的依赖可能增加部署复杂度,需处理跨平台编译问题(如 Linux/Windows 的 .so/.dll 文件)。数据传递到 C++:通过 JNI 将输入数据(如 JSON 或二进制)转换为 LibTorch 张量(torch::Tensor)。热更新:通过 Java 管理模块动态加载/卸载模型,无需重启服务。

2025-04-24 17:59:59 693

原创 工程初探AI模型服务化部署思想

然后对自己而言python web 的就是flask /FastAPI ,然后用torch serve 部署的时候发现是java,作为一个java 工程师,那种暗暗的开心是很难描述的。注意:.pth 和 .pt 文件扩展名通常用于表示保存的模型权重或整个模型的状态字典(state dictionary)。实际上,这两种扩展名没有本质的区别,它们都是用来存储使用 torch.save() 函数保存的模型或者检查点。1.TorchScript:PyTorch 的序列化格式,支持脱离 Python 环境运行。

2025-04-24 17:46:41 921

原创 AI工程pytorch小白TorchServe部署模型服务

由于torch server底层是java ,使用了Log4j2 作为日志框架,运行的代码日志非常乱,所以建议重写log4j2.xml,同时注意,python error 日志被torch server 都处理为了info日志(感觉很奇怪)整体来看,DetectronHandler 类提供了一种将 Detectron2 模型集成到基于 TorchServe的服务中的方式,使得可以通过简单的接口调用来执行对象检测等任务。根据你的应用场景,可能需要对模型的输出进行解码或其他处理,以生成用户友好的输出。

2025-04-24 17:10:27 1549

原创 CompletableFuture 和 List<CompletableFuture> allOf() join() get() 使用经验

不过要注意的是,在这个过程中,CompletableFuture 存在时间损耗,比计数器和线程 耗时久一些,但是为了整体的可控和代码的可维护,在复杂组场景的线程池来讲使用它还是一个相对友好的方案。2.如果不同的CompletableFuture 嵌套在方法里面可以选择将CompletableFuture 放入一个List集合内,然后for 循环依次使用 get/join ,这样的方法同时显得格外的简洁美丽。当你需要详细的异常信息时,可以使用 get(),因为它提供了更具体的异常类型。

2025-04-09 18:31:22 857

原创 java 多线程阻塞主线程 parallelStream || 程序计数器 + 线程池 || CompletableFuture使用性能经验

注:问题3我保持个人建议,如果是复杂的组合类型,或者对性能要求没那么高同时希望能够很方便的管理线程,那使用CompletableFuture 是比较好的,除此之外我还是坚持 计数器+线程池 ,但是要保证计数器能够准确同时能释放,否则就是天塌了。对于简单的并行计算任务,线程池可能表现更好;parallelStream: 在启动和管理线程方面的开销较高,尤其在数据量小的情况下,可能会因为线程管理的开销而导致性能下降。大任务: 对于较大的任务,线程池可能会更高效,因为它可以避免频繁的线程创建和销毁。

2025-04-09 11:14:19 811

原创 springboot 集成ThreadPoolTaskExecutor

ExecutorService 和 ThreadPoolTaskExecutor 都是用于管理和调度线程池的工具,它们在底层都依赖于 Java 的并发库(java.util.concurrent)。通过以上分析和测试,你可以更好地理解 ExecutorService 和 ThreadPoolTaskExecutor 在性能方面的差异,并根据具体需求做出合适的选择。Spring 应用: 推荐使用 ThreadPoolTaskExecutor,因为它提供了更好的集成和便利性,即使有一定的性能开销也是值得的。

2025-04-09 10:17:06 450

原创 milvus线程池获取client报错,解决方案

加个finally 作用是将一个之前从连接池中获取的Milvus客户端实例(searchClient)返回到指定类型的客户端池(在这个例子中为SEARCH类型)。这种模式通常用于资源管理,确保资源能够被有效地重用,并防止资源泄露。

2025-04-03 10:27:38 430

原创 springboot milvus search向量相似度查询 踩坑使用经验

原因:java.lang.ClassNotFoundException:com.google.gson.ToNumberPolicy。1.前提提要:java的pom 版本为:2.4.9 milvus 版本是:2.4.13-hotfix。和上次使用的经验一样,肯定没有最新的包,果然,换成最新的谷歌的包问题解决。使用线程池获取MilvusClient连接对象,具体可看之前的博客。

2025-03-21 17:19:13 1335

原创 java解析json 数据:实体中套子实体,json 字段数据解析到子实体 jackson @JsonUnwrapped

想要 @JsonProperty(“linkId”)输出到MenuItem里面。

2025-03-20 11:04:21 349

原创 springboot 集成向量数据库milvus==>1.bean 注入 2.milvus 连接池注入

最后,总结连接池的优势:通过复用连接对象,减少系统开销,尤其在频繁请求时,避免重复创建和销毁资源。而单例Bean注入确保连接池本身只创建一次,两者结合既保证了资源的高效管理,又遵循了Spring的依赖注入最佳实践。需要引入com.google.guava的包,我个人感觉是高版本的包,milvus 官方提供的依赖版本经常缺方法,下面的也一样。连接池中的对象(如MilvusClientV2)是池化的资源,而Spring管理的Bean(如连接池实例本身)通常是单例的。需要进一步对比两者的对象创建逻辑。

2025-03-05 11:42:28 894

原创 cursor sign in 网页登录成功但是不可用,报错: net::ERR_NO_SUPPORTED_PROXIES

3.这个时候就麻爪了,情不知所起,一往而情深,直接把网页copy到浏览器,发现get请求正常,这个时候就知道是cursor的问题,这个时候就考虑是不是cursor代理的问题。发现果然不一样,我的是http://@172.29.242.3:8080/但同事的是http://域账号:密码@172.29.242.3:8080/根据网上换默认浏览器 ,没有用 ,但是大家可以试一下。1.cursor 打开开发者模式。cursor一直登录失败。改HTTP2的代理也失败。改了之后,进行重新登录。

2025-02-18 12:32:22 5634 16

原创 软考中级-软件设计师通过心路经验分享

3.个人考试经历,纸质考试到机考的过程,可能工作后失去了大学考试的方法,或者大学的考试太应付了,老是不自信,不自信就会抗拒第二点,对整个计算机考试做题存在应付的心态,觉得考考就完了,做做题就完了,因为不自信反向自恋为超自信,反正已经工作了,而且是中级,有什么难得,难也是软考不行。第四次考试,真的被刺激到了,直接破釜沉舟了,不过就不考了,一鼓作气,再而衰,三而竭,这次真的是力竭之后的羞耻了,因为在大学的时候同学高级都过了,工作的同事也通过。意识到问题,还不更正,最后焦虑,习惯非常差。

2024-12-11 17:33:47 1096

原创 解决milvus migration 迁移数据出现数据丢失问题

分析下来是因为buuferSize 设置的是500条数据,但是迁移工具对一次迁移的数据是是有大小限制的,如果500条数据的总大小大于4194304,就会导致数据迁移失败。注意:这个在2.3.x 迁移到2.4.5 的时候没有出现这个问题,问题出现在2.4.5迁移到2.4.13-hotfix的时候出现的。问题是数据在批量迁移的过程中,这个错误会被忽略掉。解决方案:bufferSize 修改的条数少一点。在迁移数据的时候发现数据丢失。

2024-10-28 14:20:34 740 1

原创 springboot RedisTemplate支持多个序列化方式

前提纪要:因为业务变动,需要在原先只支持protobuf的前提序列化的前提下,新增正常的序列化读取数据所以在原先的基础上进行优化。#1024程序员节|征文#

2024-10-23 15:58:37 689

原创 解决springboot redisTemplate lua execute hash脚本 field有转义符的问题

添加DefaultRedisScript 改为Object 去掉范式,设置指定的序列化方式,同时入参从 Map 改为Map而不是redisTemplate hash 存储的序列化方式。发现这个方法是直接调用下图的方法。问题:使用execute,是。会存在field有转义符。使用的序列化的方式是。

2024-10-22 18:25:37 825

原创 springboot redisTemplate hash 序列化探讨

在使用的过程中,难免会疑问为什么 key field value 序列化的方式,尤其是fields 的序列化方式。从上面两个图可以看到key,fields,value 是不同方式的序列化方式。疑问:hash如何序列化的,重点:fields 是如何序列化的?redisTemplate 有两种插入hash的方式。前提提要:这个是个人小白总结,写完博客后开始厌蠢。ok,废话不多说,先说结果,后分析。因为在配置序列化方式的时候。

2024-10-22 11:42:06 664

原创 Springboot redis luttuce lua脚本 存储压缩的protobuf key:byte[] value:map<byte,byte[]>

注释部分是正常的map<string,value> 的方式,对该lua脚本进行了优化。

2024-09-11 15:05:51 578 1

原创 springboot luttuc redis 集成protobuf,手动序列化反序列化

3.考虑到其他项目使用原生的luttuce,不支持key/value 结构不一致,所以对redis key field value 都进行压缩了(关注官网变更哦,后面会支持。路径一致,否则会报错。2.由于为了和公司其他的项目达成一致,所以版本,依赖 都尽量保证一致,所以版本需要各位看官具体决定了哈(团队使用时不同版本会有冲突)4.由于初期设计的.proto文件,可能存在压缩不完全的问题(后面会具体聊),大家可以见仁见智了啊,欢迎反馈。这个是对可变的Map 进行压缩的,可能会压缩不完全。

2024-09-11 14:57:32 867

原创 milvus使用milvus migration工具迁移数据

下载模板文件yaml,放入milvus_migration/configs 下,一般命名:migration.yaml。github地址:https://github.com/zilliztech/milvus-migration。如果目标 Milvus 中没有与源集合对应的集合,milvus-migration工具会自动创建该集合。看的出来就是shell脚本for 循环执行就行了,但是我的表很多哎,这样一点点写很烦,改一下吧。目标的milvus 官方称之为:目标target milvus。

2024-08-29 20:10:22 2153

原创 milvus多个Querynode,资源消耗都打在一个节点上

当代理收到数据加载请求时,会将请求发送给查询协调器,查询协调器决定如何将分片分配到不同的查询节点。1.数据量太小,且数据是动态新增的,且没有60s间隔,没有达到segement分区的限制,没有从growingSegement态,所以都落在其中的一个segement。3.调整flush的阈值,我觉得在小数据量的情况下操作有点杀鸡用牛刀,完全可以使用命令塞入数据的指定多个副本,做负载…2.在数据量小的情况下,少querynode ,每个querynode 多资源。其中大致的内容都看懂了,比较困难的是。

2024-08-28 16:29:16 1036

空空如也

空空如也

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

TA关注的人

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