- 博客(179)
- 收藏
- 关注
原创 JVM堆内存配置错误导致过长的STW
其次怀疑是数据迁移导致的问题,因为历史原因,之前的数据在创建的时候很不规范,所以在迁移的时候进行数据分析时比较麻烦,会导致迁移后的数据与旧数据对应不上。然后再查看服务引入的redis依赖包,因为该依赖包是公司自研的,并且我在其基础上添加了redis加锁重试机制,因为报错的地方就是在执行加锁重试那一块代码,所以我怀疑是这部分代码的问题。先查看调用方的日志,发现确实是进入到服务提供方(此次重构的服务)之后就出现问题了,顿时心凉半截,想着多怕是自己写的代码问题。堆内存在增加到最大堆内存之前,一直没进行回收。
2024-07-13 15:14:03
1115
原创 Autowired注解与Resource注解的区别
两者的用法其实这两个注解的作用都一样,都是在做bean的注入,在使用过程中,两个注解有时候可以替换使用.两者的共同点@Resource注解和@Autowired注解都可以用作bean的注入. 在接口只有一个实现类的时候,两个注解可以互相替换,效果相同.两者的不同点@Resource注解是Java自身的注解,@Autowired注解是Spring的注解. @Resource注解有两个重要的属性,分别是name和type,如果name属性有值,则使用byName的自动注入策略,将值作为需要
2021-09-09 20:40:14
50175
27
原创 ES的match_phrase_prefix语句查询结果不精准
match_phrase_prefix官网介绍发现一开始就有介绍:即:返回包含所提供文本中指定词汇的文档,其排列顺序与所提供的顺序一致。所提供的文本中的最后一个词被视为前缀,用于匹配以该词开头的任何词汇。match_phrase_prefix 工作原理:前面所有词 = 短语精确匹配最后一个词 = 去词典查前缀只取前 50 个(max_expansions=50)把这 50 个词拼回短语查询如果你的词不在这 50 个里 → 查不到!
2026-04-30 13:56:24
366
原创 Redis数据结构——HyperLogLog 原理
HyperLogLog是一种高效的基数计数概率算法,通过极小内存(仅12KB)即可统计近2^64个不同元素。它基于LogLog算法改进,利用分桶和调和平均数降低误差(标准误差0.81%)。Redis实现中采用16384个桶,每个桶6bit,通过哈希将数据分散到桶中并记录最大连续零位数。相比HashMap等传统方法,HyperLogLog在百万级数据量时内存优势显著,适合允许微小误差的大规模去重统计场景,如日活用户统计。其核心思想源自伯努利试验,将统计问题转化为概率估算,展现了数学在工程中的巧妙应用。
2026-03-26 14:31:17
358
原创 CompletableFuture的默认线程池ForkJoinPool会导致类加载失败
使用CompletableFuture的默认线程池调用getPreviewTypeHandler(PreviewTypeEnum type)方法触发静态代码块进行指定类加载。2、现象在本地使用idea运行程序,一切正常,可以扫描到预期的类。上测试环境后,出现问题,扫描不到预期的类。在idea点击运行按钮运行程序,实际上idea是编译后用命令参数把依赖路径全部都加入命令行。它的所有依赖类加载器都是使用的是,他的父加载器是(它可以加载classpath路径下的所有类);并且在使用Completab
2026-01-27 18:37:42
318
原创 JDK21虚拟线程也太强大了
最近项目要升级到JDK21版本,所以顺带学习了一下JDK21的新特性,其中虚拟线程是一项重量级的更新,一定一定要重视!
2026-01-15 16:12:36
346
原创 我们遇到了正则表达式的灾难性回溯问题
经过仔细查看正则表达式,发现里面出现了(\d+)*这种匹配格式,然而这就是典型的回溯陷阱,如果传入的数字足够长,会导致指数级的回溯,最终引发。后面经过线下写demo脚本,拉取当时处理的数据,在本地跑这个正则匹配,终于发现了一条有问题的数据。怀疑是进入了死循环,但是查看完相关代码的上下文后,并没有写可以造成死循环的代码片段。查看到有问题的具体代码位置,发现是在使用正则匹配的时候出现问题了。没有内部结构,不需要考虑“如何分组”,因此不会产生回溯。虽然最终会成功,但过程暴露了问题。:长度为 n 的数字串,有。
2026-01-14 18:23:52
781
1
原创 Reflections 工具没有检测到任何类 Reflections took 249 ms to scan 1 urls, producing 0 keys and 0 values
Override@OverrideSystem.out.println("处理邮件: " + data);@Override@OverrideSystem.out.println("处理短信: " + data);
2025-12-23 16:54:43
170
原创 Es索引文档全量更新与迁移
迁移完成后,校验数据完整性,校验通过后可删除旧索引(如果不需要新索引名称与旧索引名称一致,可不用删除)旧索引删除后,可为新索引创建和旧索引名称一致的别名,后续就可以继续使用旧索引名称进行相关操作。经过测试,方案1的耗时较长(2小时左右),方案2耗时20分钟左右,所以采用方案2进行处理。执行完全量迁移脚本后,可使用下方脚本继续迁移增量数据(在执行全量迁移命令后产生的数据)。2、新建索引并进行全量迁移,迁移时更新新增字段的初始值。执行上述命令后,会返回任务id,可根据返回的任务id查询迁移的进度。
2025-12-09 14:37:01
430
原创 MySQL查询指定字符串是否在以逗号分割的字段中(FIND_IN_SET使用方法)
是 MySQL 中用于在逗号分隔的字符串列表中查找指定字符串位置的函数。如果找到:返回字符串在列表中的位置(从 1 开始计数)如果未找到:返回 0如果任一参数为 NULL:返回 NULL小数据量的逗号分隔值查询简单的存在性检查不需要高性能的临时查询优先使用规范化表结构- 最佳性能和可扩展性考虑 JSON 类型- MySQL 5.7+ 的现代解决方案添加函数索引- MySQL 8.0+ 的性能优化避免在大数据量使用- 会导致全表扫描。
2025-10-24 17:06:55
484
原创 mybatis-plus的insertBatchSomeColumn方法实现批量插入
*** 批量插入,借助mybatis-plush的injector实现*//*** 分段批量插入*/return;@Mapper。
2025-10-21 11:40:35
416
原创 MySQL的MVCC多版本并发控制
MVCC (Multi-Version Concurrency Control) 是 MySQL 实现高并发访问的核心机制,它通过在数据行上维护多个版本,使读写操作可以并发执行而不互相阻塞。
2025-08-13 17:11:14
1172
原创 Xxl-Job的路由策略,以及使用分片广播策略优化项目现有功能
XXL-JOB路由策略摘要:系统提供多维度任务路由方案,包括基础单节点策略(FIRST/LAST/ROUND/RANDOM)确保简单调度,集群负载策略(HASH/CONSISTENT_HASH/LFU/LRU)实现智能负载均衡,特殊场景策略(FAILOVER/BUSYOVER)保障系统可靠性。核心分片广播策略支持数据并行处理,通过shardIndex/shardTotal参数实现分布式计算。不同策略适应开发测试、生产集群、关键业务等场景,开发者可根据任务特性(状态要求、负载特征、容错需求)选择最优方案,其中
2025-08-05 11:37:13
857
原创 ES组合使用must与should时的注意事项
**同时有 `must` 和 `should`**:`should` 条件变为完全可选,不要求必须匹配任何 `should` 条件,除非显式设置 `minimum_should_match`- **没有 `must` 只有 `should`**:默认至少需要匹配一个 `should` 条件,可通过 `minimum_should_match` 参数调整。{"range": {"publish_date": {"gte": "now-7d/d"}}} // 最近发布的加分。
2025-07-16 22:11:39
868
原创 ES中must与filter的区别
must的本质:贡献相关性评分的条件,适用于需要影响结果排序的场景。filter的本质:高效的二进制过滤器,适用于精确匹配和高频查询。黄金法则能用filter的不要用must—— 除非明确需要该条件影响评分。
2025-05-29 16:20:02
1407
原创 Kafka的broker、topic、partition、group的关系
Kafka的消费模式主要有两种:一种是一对一的消费,也即点对点的通信,即一个发送一个接收。第二种为一对多的消费(发布/订阅模式),即一个消息发送到消息队列,消费者根据消息队列的订阅拉取消息消费。
2025-04-09 11:15:30
1433
原创 MySql表达式中字符串类型与整型的隐式转换
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL 会根据需要自动将字符串转换为数字,反之亦然。也可以使用函数显式地将数字转换为字符串。转换是隐式进行的,因为它需要字符串参数。
2025-04-03 14:48:07
634
原创 MapStruct 使用@Context注解传递上下文信息
创建包含所需信息的上下文类:2. 在 Mapper 接口中声明上下文参数在映射方法的参数中添加 注解:3. 在抽象类中使用上下文通过抽象类处理复杂逻辑,直接访问上下文字段:4. 使用场景示例 动态设置字段值:根据上下文中的用户信息设置创建者。 格式化日期:通过上下文的日期格式配置转换时间字段。 调用外部服务:从上下文中获取服务实例,查询补充数据。三、真实项目改造修改前先进行对象转换,转换之后再遍历转换结果并修改数据使用@context注解传递上下文信息,减
2025-03-27 11:27:23
1644
原创 5年的项目,使用的雪花算法生成的id居然出现了重复?
今天线上出现了数据表插入数据失败的情况。异常日志如下:即出现了主键冲突。需注意:该服务在线上环境部署了6个实例。
2025-03-18 18:50:38
1094
原创 真实项目中使用到的ES自定义评分脚本
/ 快速返回条件len : len1;len1 : len;return 30;return 100;return 90;// 预处理// 动态规划数组j <= len1;i <= len;j <= len1;// 取最小值根据纯文本和标签格式匹配语料。标签格式一致则加分。
2025-03-05 18:05:44
449
原创 ES中数据刷新策略refresh
参数控制文档在写入后何时对搜索可见,其行为直接影响数据可见性和系统性能。参数,可以在数据可见性、写入性能和系统稳定性之间取得最佳平衡。在 Elasticsearch 中,插入数据时的。
2025-03-05 17:59:41
1453
原创 泛型子类使用Builder提示:both methods have same erasure, yet neither hides the other
子类自定义builder方法。
2025-01-21 21:01:17
443
原创 正则表达式常用
正向先行断言用于检查某个模式在当前匹配位置后是否存在,而不包括该模式本身在内。X(?=Y)这个模式将匹配X,前提是X后面必须跟着Y。但只会返回X的匹配结果。在这个例子中,\d会匹配任何单个数字,但只会在数字后面跟着 " dollars" 的情况下匹配。字符串5 dollars可以匹配到5,而5 euros则不会。
2024-11-21 11:19:47
400
原创 Retryable重试机制
如果不需要回调方法,可以直接不写回调方法,那么实现的效果是,重试次数完了后,如果还是没成功没符合业务判断,就抛出异常。@Recover注解来开启重试失败后调用的方法(注意,需跟重处理方法在同一个类中),此注解注释的方法参数一定要是@Retryable抛出的异常,否则无法识别,可以在该方法中进行日志处理。方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要哪个参数,写进去就可以了(@Recover方法中有的)该回调方法与重试方法写在同一个实现类里面。
2024-11-05 17:34:21
547
1
原创 springboot项目测试环境构建出的依赖包比本地构建出的依赖包多
对比测试环境启动的jar包和本地启动的jar之后发现,确实测试环境的jar包中会有druid的jar包,而本地无此jar包。上述druid是服务pom文件中之前引入的依赖包,后续由于某种原因而不需要该依赖包了,故已在pom文件中移除掉了该依赖包。导致在构建本项目时,通过common的路径在maven仓库中得到的依赖包是其它项目的,所以会将druid引入进来。最终在组长的帮助下,发现本项目中引入的common依赖包的路径和其它项目的common依赖包的路径是一样的。而测试环境却出现上述错误。
2024-10-24 18:51:20
399
原创 ES分词导致查询结果不准确
也就是自定义一个词库,让es遇到自定义词库中的词时也进行分词。比如将上述的“层”加入自定义词库当中,如何es分词时则会将“层”给分词出来。这需要改动es的配置文件IKAnalyzer.cfg.xml,修改文件里面的扩展配置指向自定义词库。这种方案的缺点是不能一次性解决该问题,因为需要遇到此问题时,才能将未查询到的词组加入自定义词库,而且需要重启es,会影响线上功能。
2024-09-18 14:17:24
1362
原创 Java对象列表属性映射工具类
经常有这种情况,就是获取到一个对象列表之后,需要根据对象里某个字段的值去获取另一个字段的值。如下所示,有个Item对象列表,Item对象里有个id字段和Value字段,现需要根据id的值去查询value的值。
2024-09-13 17:33:54
617
原创 ElasticSearch常用DSL命令
上述命令类似于MySQL命令:where dbId = '19841159f25845008fad2512aa91f48b' and original like '%边水%'。must类似于mysql里面的and命令,上述命令相当于MySQL里面的 where dbId in(287994) and original like '%层%'。注意此处把match命令当成了mysql的like命令,其实这两个命令还是有明显区别的。1、查询索引字段的映射关系。2、查询索引的分词器等设置。3、根据指定分词器分词。
2024-09-02 17:10:01
536
原创 循环依赖问题差点导致线上事故
到了发版的日期,同事将此情况汇报给了组长,没想到才没过一会儿,组长就发现代码中确实有循环依赖,只不过该循环依赖存在于3个类之间,也就是A->B->C->A。查看代码发现,也确实是同事新写的代码的问题。在同事修改代码之前,类的关系是B->C->A,然后同事后面又在A中引入了B,所以引发了循环依赖。至于项目启动偶然才出现循环依赖的问题,这应该和类的加载顺序有关,因为spring在默认情况下不保证bean的加载顺序。起因是同事在测试环境启动项目时日志报了个循环依赖的错误,日志提示类A和类B发生了循环依赖。
2024-07-25 16:23:59
355
1
空空如也
MySQL部分数据源切换问题
2023-12-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅