java
IT_Octopus
我仍在山麓,却仰望山巅。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
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 · 1054 阅读 · 0 评论 -
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 · 176 阅读 · 0 评论 -
java <T> 是什么?
但是泛型中的 T 不是“绑定到某个参数位置”的,而是“代表一个类型”,它可以出现在参数、返回值或方法内部,只要逻辑上需要类型安全和复用。在 Java 中,< T> 和 < Object> 虽然都涉及“类型”,但它们在语义、用途和类型安全性上有本质区别。虽然 JVM 在运行时会类型擦除(把 T 擦成 Object),但在编译期,T 提供了严格的类型约束,而 Object 没有。📌 原则:不要为了“看起来高级”而加泛型。第一个< T>:泛型类型参数(类型变量) T 是一个占位符,代表“调用时确定的具体类型”。原创 2025-12-12 17:06:17 · 648 阅读 · 0 评论 -
后端认识网关Nginx、LVS 、Keepalived、VIP &&OpenResty、APISIX、 Kong 、 Janus&&Springcloud GateWay
前沿聊天:有没有发现,近几年随着工作的深入,好像除了nginx 最亲切外,什么LVS VIP(跟会员一样) APISIX Kong 还有微服务的GateWay,各种网关层面的名词喋喋不休的出现在你的脑子里。再加上需要增加云服务的鲁棒性,一层套一层,再优化迁移。o(╥﹏╥)o 要老命了,今天就把我知道的一些名词整理一下。原创 2025-12-11 18:44:45 · 641 阅读 · 0 评论 -
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 · 494 阅读 · 0 评论 -
java多线程环境下 安全地初始化缓存(避免缓存击穿),同时兼顾性能 的双重检查锁方案
缓存击穿 是指:某个热点 key 在缓存中过期(或不存在)的瞬间,大量并发请求同时发现缓存没有数据,于是全部打到后端数据库(或昂贵服务,如 Milvus、Embedding API)上,导致系统负载骤增甚至崩溃。重复计算 是指:多个线程/请求对同一个输入(如相同的 nodeValue)同时执行相同的昂贵操作(如调用 Embedding 接口、查询 Milvus),而这些操作的结果完全一样,造成资源浪费。实际场景:刚上线,大量请求进行请求,但是缓存并未添加完成,导致重复调用。所以 第二次检查是必须的。原创 2025-12-08 18:31:18 · 358 阅读 · 0 评论 -
Java GZip 压缩实践 +实践思考 +进一步压榨性能和存储方案思考:Protobuf+ GZip
考虑到GZip是为了压缩数据,减少redis 存储压力,那之前使用过Protobuf和Gzip 有什么差异了,其实这个数据同事真实的测过,gzip 压缩的大小更大,protobuf 压缩的没那么大,但是效果很好。大多是由团队数据同事写入的,根据数据人员提供的信息,当前的redis 数据已经通过Gzip 压缩过了,所以需要我将数据读取,反序列化的时候应该手动转换成String。这说明:Protobuf 负责“高效表示”,压缩算法负责“进一步缩小体积”,两者是互补的。呦西,性能优化了,数据也变小了。原创 2025-12-04 17:34:14 · 396 阅读 · 0 评论 -
(旧)Spring Securit 实现JWT token认证(多平台登录&部分鉴权)
创建一个线程局部全量 AdminUserHolder.set(principal);放置用户信息,用于每个请求使用。✅ 创建一个 authenticated = true 的 Authentication 对象!1.创建全局安全配置:启用方法级安全(@PreAuthorize 等)5.自定义解析请求,返回当前用户主体;6.用户认证鉴权自定义实体类,类似securtiy 自带的类。通过认证的核心方法,这个方法后,就默认已经认证通过了。集成好的加载用户信息,看诸位看官选择了。3.JWT认证过滤器。原创 2025-12-02 18:42:41 · 342 阅读 · 0 评论 -
多线程下使用缓存+锁Lock, 出现“锁失效” + “缓存未命中竞争”的缓存击穿情况,双重检查缓存解决问题
多线程情况下,想通过缓存+同步锁的机制去避免多次重复处理逻辑,尤其是I/0操作,但是在实际的操作过程中发现多次访问的日志。发现问题了,如果finally 及时删除锁,可能会出现下一个线程重新建立锁对象,然后多了查询缓存的性能消耗。这就导致多个线程可能都进入了 lock.lock() 后的代码块,并且都执行了实际查询逻辑。// 可选释放锁对象。当T2 进入的时候处理逻辑,发现没有锁,上锁,访问缓存。当T1 进入的时候处理完逻辑后,放入缓存,然后删除锁。这个可能出现锁失效的情况。为了避免这种情况存在。原创 2025-06-06 10:42:03 · 586 阅读 · 0 评论 -
Springboot redis luttuce lua脚本 存储压缩的protobuf key:byte[] value:map<byte,byte[]>
注释部分是正常的map<string,value> 的方式,对该lua脚本进行了优化。原创 2024-09-11 15:05:51 · 573 阅读 · 1 评论 -
springboot luttuc redis 集成protobuf,手动序列化反序列化
3.考虑到其他项目使用原生的luttuce,不支持key/value 结构不一致,所以对redis key field value 都进行压缩了(关注官网变更哦,后面会支持。路径一致,否则会报错。2.由于为了和公司其他的项目达成一致,所以版本,依赖 都尽量保证一致,所以版本需要各位看官具体决定了哈(团队使用时不同版本会有冲突)4.由于初期设计的.proto文件,可能存在压缩不完全的问题(后面会具体聊),大家可以见仁见智了啊,欢迎反馈。这个是对可变的Map 进行压缩的,可能会压缩不完全。原创 2024-09-11 14:57:32 · 861 阅读 · 0 评论 -
解决springboot redisTemplate lua execute hash脚本 field有转义符的问题
添加DefaultRedisScript 改为Object 去掉范式,设置指定的序列化方式,同时入参从 Map 改为Map而不是redisTemplate hash 存储的序列化方式。发现这个方法是直接调用下图的方法。问题:使用execute,是。会存在field有转义符。使用的序列化的方式是。原创 2024-10-22 18:25:37 · 822 阅读 · 0 评论 -
springboot RedisTemplate支持多个序列化方式
前提纪要:因为业务变动,需要在原先只支持protobuf的前提序列化的前提下,新增正常的序列化读取数据所以在原先的基础上进行优化。#1024程序员节|征文#原创 2024-10-23 15:58:37 · 684 阅读 · 0 评论 -
springboot redisTemplate hash 序列化探讨
在使用的过程中,难免会疑问为什么 key field value 序列化的方式,尤其是fields 的序列化方式。从上面两个图可以看到key,fields,value 是不同方式的序列化方式。疑问:hash如何序列化的,重点:fields 是如何序列化的?redisTemplate 有两种插入hash的方式。前提提要:这个是个人小白总结,写完博客后开始厌蠢。ok,废话不多说,先说结果,后分析。因为在配置序列化方式的时候。原创 2024-10-22 11:42:06 · 661 阅读 · 0 评论 -
使用线程池+线程计数器迭代器删除List集合元素(新建对象版)
【代码】使用线程池+线程计数器迭代器删除List集合元素(新建对象版)原创 2024-03-26 11:12:39 · 221 阅读 · 0 评论 -
线程池+CountDownLatch 使用过程中遇到的坑和当前的疑问
此外,虽然在这个特定的 submit 调用中直接捕获异常可能不是必需的(因为 submit 方法本身不会抛出检查型异常,并且会返回一个 Future 对象,任何异常都将被存储在该 Future 对象中),但在 lambda 表达式内部可能会抛出异常,这取决于您的代码逻辑。1.还是会存在线程池满的问题,对于当前的问题,有种无力的感觉,这个时候就在想:md,这是线程池和这个服务接口的问题,我代码一点问题没有,突然思路打开了,是不是代码可以优化一下,至少没那么难看,(1.换成全局线程池后,发现错误的范围蔓延了!原创 2024-05-30 11:33:59 · 874 阅读 · 0 评论 -
java 排序方式&&解读返回值
java 排序方式&&解读返回值原创 2023-06-20 18:18:00 · 929 阅读 · 0 评论 -
自定义线程池(推荐使用)
自定义线程池原创 2022-08-22 16:00:05 · 219 阅读 · 0 评论 -
ConcurrentHashMap和Collections.synchronizedMap
【代码】ConcurrentHashMap和Collections.synchronizedMap。原创 2022-08-22 15:51:04 · 455 阅读 · 0 评论 -
java 对象集合排序再排序后顺序去重(只取最前面的唯一)
java 对象集合排序再排序后顺序去重(只取最前面的唯一)原创 2022-06-15 14:32:53 · 841 阅读 · 2 评论 -
fastjson 使用经验
json转换原创 2022-06-08 17:13:00 · 203 阅读 · 0 评论 -
stream 流 and 函数式编程使用经验
stream流 and 函数式编程(无讲解)原创 2022-06-08 17:04:01 · 447 阅读 · 0 评论 -
将对象转换成 map对象 and hutool 将对象转换成json字符串
Person person =new Person(); person.setAdult(true); person.setName("1"); // 将对象转换成json字符串 String r = JSONUtil.parseObj(person, false).toString(); System.out.println(r);将对象转换成 map对象Map<String, Object> s...原创 2022-05-18 21:05:31 · 3830 阅读 · 0 评论 -
json字符串双引号 解析错误
String tdKeyExtAttributeValues = "[{"'attrValue":"65g/3个。品味着"下午嗨到晚上",西班牙式休闲文化。"} ,{"attrValue":"大家伙们:"你是大各自"晚上好?"} ,{"keyExtAttrName":"minQty","keyExtAttrId":"042658ec-203d-40cb-894c-7c69f7571e29","attrValu..原创 2022-04-04 14:45:36 · 1224 阅读 · 0 评论 -
python跳出当前三层循环,继续最上层循环(附加改进版)-java参考逻辑
eg:最好不要使用三层循环,使用hash去替换原创 2021-11-30 18:25:01 · 1245 阅读 · 0 评论 -
jdk和jre的体系结构区别
原创 2021-07-20 16:28:14 · 224 阅读 · 0 评论 -
正则 匹配 中文标点符号
中文符号 规则 中文符号 规则( \uff08 ) \uff09〈 \u3008 〉 \u3009《 \u300a 》 \u300b「 \u300c 」 \u300d『 \u300e 』 \u300f﹃ \ufe43 ﹄ \ufe44〔 \u3014 〕 \u3015… \u2026 — \u2014~ \uff5e ﹏ \ufe4f¥ \uffe5 、 \u3001【 \u3010 】 \u3011, \uff0c 。 \u3002? \uff1f ! \uff01: \uff转载 2021-06-30 13:22:16 · 7772 阅读 · 0 评论 -
springcloud.nacos1.4.1版本配置
官网下载nacos1.4.1版本包,解压文件1.单机版运行nacos 进入下列目录2.cmd 当前目录进行 startup.cmd -m standalone 命令输入3.登录成功!2.集群式配置1.首先数据库一定要大于5.6版本!!!本人电脑版本为5.5.6,配置失败,原因排查为:(版本不同时间戳的格式不同,导致nacos创建表结构出现问题)把老版本进行删除,然后再安装新版本!!千万不要新得包进行更新mysql,会导致监听器问题!!!别忘我为什么知道!!查看版本:2.打开目录co原创 2021-06-29 21:52:29 · 1622 阅读 · 1 评论 -
java中map是否可以存放null值
图片转载于:https://blog.youkuaiyun.com/userrain/article/details/55515303转载 2021-06-24 16:54:59 · 1753 阅读 · 0 评论 -
Mybatis-Plus自动生成代码(mysql数据库)
maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependen原创 2021-06-11 17:23:35 · 935 阅读 · 1 评论 -
获取application配置的配置信息
该文章只展示两种我认为简单,使用简便的方式一丶1)Properties 对象,获取配置信息,包括系统信息,通过key-value键值对保存信息2)使用相对于当前项目的classpath的相对路径来查找资源(字节输入流)。ClassLoader类的 getResource(String name), getResourceAsStream(String name)(classpath就是存放.class等编译后文件的路径,建议最好使用classpath的相对路径)3)load原创 2021-06-11 15:40:16 · 1114 阅读 · 1 评论 -
System.getProperty()获取所在系统的配置信息
java.version Java运行时环境版本java.vendor Java运行时环境供应商java.vendor.url Java供应商的 URLjava.home Java安装目录java.vm.specification.version Java虚拟机规范版本java.vm.specification.vendor Java虚拟机规范供应商java.vm.specification.name Java虚拟机规范名称java.vm.version Java虚拟机实现版本j原创 2021-06-11 14:45:23 · 411 阅读 · 1 评论 -
java Enum枚举白话讲解
看到这个代码是不是有点懵逼,或者好像之前看书学过又好像没用学过。enum SubmitStateEnum { //0:报送成功、1:报送中 、2::未报送 3: 生成报文错误 SUCCESS("0"),SUBMITING("1"),NOTSUBMIT("2"), FAILURE("3"); String submitStateType; SubmitStateEnum(String submitStateType){ this.submitStateTy原创 2021-03-26 18:02:19 · 241 阅读 · 0 评论 -
Intellij IDEA eclispe版本 最全实用快捷键整理
正文前: 1. IDEA内存优化(秒开的快感!!)因机器本身的配置而配置:\IntelliJ IDEA8\bin\idea.exe.vmoptions// (根据你的配置变大!!)----------------------------------------- -Xms2048m -Xmx2048m ...原创 2020-02-26 21:34:46 · 309 阅读 · 0 评论 -
springdata jpa分页菜鸟讲解
Pageable pageable = new PageRequest(numberOfRiskLevelCustomers.getPageNum()-1,numberOfRiskLevelCustomers.getPageSize()); Page<NumberOfRiskLevelCustomers> data1=numberOfRiskLevelCustomersRepository .findByDate( numberOfRiskLevelCustomers.getDate原创 2020-06-28 18:15:25 · 641 阅读 · 0 评论 -
jpa orderBy多个字段查询
select * from user where id = 1 order by user ,userName;该sql使用jpa怎么使用哦List<User> findByIdOrderByUserDescUserNameAsc(Long id)注意:在每一个字段后面必须加上DESC,ASC升序或者降序的标志!!原创 2021-03-23 16:11:17 · 1591 阅读 · 0 评论 -
java不能在主方法中写方法(比较小白的易错问题)
为什么不能在主方法中写其他方法?因为方法不能够嵌套,意思就是说一个方法中不能有其他的方法。一个方法只属于一个类的,而不属于另一个方法所以说方法只能写在类中。如果想要在方法中写方法就可以尝试用匿名内部类试试。ps:如果还想了解一下其他的内部类的知识,以前的博客有哦。(这只是java语言的规定,其他语言就不是这样,所以作为初学小白就暂且吞了这个苍蝇,记住就好了)看起来好像挺简单的,但是作为小白...原创 2019-07-19 22:17:47 · 3812 阅读 · 0 评论 -
增加生成大量数据excel方法
因为时间原因在整理的时候失忆了,所有有些东西忘记了,但是关键点有两个1.使用SXSSFWorkbook对象声明对象2. 这段代码很有用fout = new FileOutputStream(path); //内存中只留1000行数据,多余的暂存在硬盘中 swb = new SXSSFWorkbook(1000); //压缩临时文件,很重要,否则磁盘很快就会被写满 swb.setCompressTempFil原创 2021-03-12 16:36:41 · 1426 阅读 · 0 评论 -
获取当前年月字符串(月份带0)
Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int monthInt = calendar.get(Calendar.MONTH) + 1; String month = null; if (monthInt<10){ month = "0"+monthInt; }else .原创 2021-03-12 11:43:44 · 2358 阅读 · 0 评论 -
将科学计数法数字转换成正常展示类型
重要的时NumberFormat 这个静态类的API,自己去查看其他的方法,很实用。原创 2021-02-03 15:51:08 · 328 阅读 · 0 评论
分享