
日常随笔
文章平均质量分 89
小李哥编程
这个作者很懒,什么都没留下…
展开
-
你还在用Mybatis?试试这款神器,纵享丝滑
在这个示例中,我们首先根据 ID 查询到需要更新的用户。在 Java 项目中,我们经常需要与数据库进行交互,而 Mybatis 是一个流行的持久层框架,它可以将 Java 对象映射到 SQL 语句,从而简化数据库操作。Fluent Mybatis 是一个基于 Mybatis 的扩展库,它提供了更加简洁、易读的 API,使得我们能够更加高效地进行数据库操作。使用Mybatis实现复杂的业务查询逻辑,是一个很头痛的事情,下面介绍一个神器,完全使用DSL编程风格,无需写sql就可以轻松实现。原创 2024-03-24 13:26:23 · 608 阅读 · 0 评论 -
如何动态修改spring中定时任务的调度策略(2)
上一篇文章中我们一下走读了一下spring中实现@Scheduled的源码,想必你对spring中实现定时调度的原理更加了解吧,文末我们两个问题,1.spring在进行定时调度时,使用的线程池是默认,那么这个默认的线程池的配置是怎样的呢?2.如何动态调整调度策略。接下来我们详细分析一下这两个问题。spring在执行调度任务前,会按照好一定的策略,寻找一个可用的线程池来执行调度任务,寻找这个线程池的过程如下:在上面的代码中,有三处可以完成对 线程池的设置:1.通过自定义的 SchedulingConfig原创 2024-03-19 23:56:17 · 1038 阅读 · 0 评论 -
如何动态修改spring中定时任务的调度策略(1)
在我们日常开发中经常会调度工具来处理一下需要定时执行的任务,比如定时导出报表数据给业务方发送邮件。你在工作中是如何这种定时调度?原创 2024-03-19 23:40:50 · 1152 阅读 · 0 评论 -
http中的长连接和短连接你真的了解吗?
做web开发的老铁应该都知道http协议,它是前后端通信中非常常用的一种通信协议,HTTP(HyperText Transfer Protocol)即超文本传输协议,是互联网上应用最为广泛的一种网络协议。HTTP协议是一个基于请求-响应模型的协议,客户端(浏览器、移动客户端等)发起请求,服务端接收请求后进行处理并返回响应。在HTTP协议中,有两种连接方式:长连接和短连接,它们主要区别在于连接的持续时间和资源利用率。原创 2024-03-16 18:27:34 · 4295 阅读 · 0 评论 -
一次奇怪的事故:机器网络连接打满,导致服务不可用
机器网络连接被占满后,slb再将请求转发到该机器上时,网络连接的建立就会被阻塞,直至超时,而超时后,slb又会进行重试,导致出现的大量链接建立行为,也就出现了slb连接创建过多的告警,这个时候slb与该实例的健康检查请求也会出现问题,导致该实例从slb上被摘除。但slb到该实例的请求转发还是正常,因为后端服务请求处理的比较慢,所以slb需要和后端服务建立新的网络连接来进行新的请求的发送,新建连接发送的请求,被处理的速度依旧很慢,所以需要不断的建立新的连接,很快导致该实例所在的机器的网络连接被占满。原创 2024-02-26 23:02:46 · 1124 阅读 · 0 评论 -
组合模式:树状结构与整体-部分关系
组合模式是一种结构型设计模式,它将对象组合成树状结构以表示“整体-部分”关系。组合模式使得客户端可以以一致的方式处理单个对象和对象组合,从而使得系统更加灵活。组合模式是一种非常实用的设计模式,它可以帮助我们构建树状结构的对象,并以一种统一的方式处理单个对象和对象组合。通过一个图形绘制应用的例子,我们学习了如何使用组合模式来实现整体-部分关系。原创 2023-09-06 11:45:00 · 117 阅读 · 0 评论 -
多次触发FastJson漏洞的AutoType机制,你了解吗?
解决问题的方法也很简单,既然@type指定的类型不存在,那么可以在系统中把需要的类型定义出来,不过@type指定的类型,是三方接口系统中定义的,如果把该类型引入到调用方系统中,那么对于调用方的侵入性很大,而且定义这个类型,仅仅为了解决这个问题,有很大解释成本在里面。从内容上看,比较特殊的地方在于多了一个特殊的字段“@type”,经过测试,反序列化报错,的确是因为这个特殊的字段造成的(把@type字段去掉,反序列化可以正常进行)。) fastjson。导致的,那么在序列化时,把类型信息给添加上可以了。原创 2023-12-24 18:32:09 · 2086 阅读 · 0 评论 -
分享一款程序员摸鱼神器,自己要偷偷的用哦
使用下来,感觉十分方便,确实可以提高工作效率,但是使用前还是要先确认清楚,公司是否允许使用,毕竟代码也是公司的资产,有些公司对公司数据管理特别严格,会对第三方的一些工具的使用有限制,别自己用的正嗨着呢,转头收到公司安全的警告和处罚,就不太好了。原创 2023-12-09 20:43:04 · 2813 阅读 · 0 评论 -
你在地铁上修过bug吗?
作为技术人员,有没有遇到下班路上收到老板电话,系统故障,然后地铁上掏出电脑,修bug的场景。自己负责的业务线上出现问题,负责人心里是很慌的,在这种心理状态下做事很容易二次犯错,造成更大的问题。但是线上业务在高速迭代的过程中,出现问题,又总是难免的。这个时候,对业务系统建立完备的监控体系是十分有必要的。原创 2023-12-09 10:09:07 · 997 阅读 · 0 评论 -
FastJson竟然会导致内存泄露?你遇到过吗?
FastJson是一款性能优异的java序列化和反序列框架,广泛应用于日常开发工作中,也许正是因为作者在设计这款框架时,比较注重性能方面的考量,在框架安全性,空间占用等方面做了一些牺牲。很不幸小编前两天就遇到了一个使用FastJson导致内容泄漏的问题。下面是小编从发现内存泄漏问题,到问题排查,再到问题修复的整个过程的记录,当各位读者遇到类似问题后,能有所启发。原创 2023-11-19 18:35:55 · 2800 阅读 · 0 评论 -
通过自定义一个 validator,一次搞懂参数校验的全流程流程
自定义个一个validator需要一下4个步骤。我们需要定义一个自定义注解来标记需要进行验证的字段。注解可以包含自定义的属性,用于指定验证规则的细节。例如,我们可以定义一个名为@CustomValidator的注解,并在其中定义一些属性,如错误消息、验证分组等。Class原创 2023-07-02 23:41:15 · 6057 阅读 · 0 评论 -
项目中如何优雅的处理参数校验?spring validation 全搞定
本篇博客中,我们深入探讨了Spring框架中参数校验的原理和实现过程。通过了解校验器、校验注解、校验器工厂和参数校验器的作用,我们对Spring框架中参数校验的工作流程有了更清晰的认识。参数校验是保证系统安全性和稳定性的重要环节,合理地使用参数校验功能可以帮助我们规范输入、减少错误和异常,提升系统的可靠性和用户体验。希望本篇博客对你理解Spring框架中参数校验有所帮助,并能在实际开发中灵活运用。如果你对参数校验有更深入的需求或疑问,欢迎留言讨论。原创 2023-06-05 23:20:42 · 758 阅读 · 0 评论 -
一款构建RestfulAPI的神器----Spring HATEOAS
一款构建RestfulAPI的神器----Spring HATEOAS,你用过吗?原创 2023-06-05 22:51:15 · 1215 阅读 · 0 评论 -
缓存中间件在开发中的这些技巧,你都知道吗? (2)
以上是我们在使用缓存的过程中需要重点关注的一些方面:通过合理选择缓存策略、设置适当的缓存大小、处理缓存失效以及监控和调优缓存性能,可以提升系统的性能和响应速度,优化用户体验。原创 2023-06-03 17:57:26 · 157 阅读 · 0 评论 -
缓存中间件在开发中的这些技巧,你都知道吗? (1)
以上是缓存使用中的一些关注点,灵活应用和设置这些配置项,可以有效的提升我们使用缓存的效率,使缓存在我们应用中发挥出更大的优势。原创 2023-05-30 23:49:11 · 175 阅读 · 0 评论 -
你在项目中是如何使用kafka的?
较少的分区数可能会限制并行性能,而较多的分区数可能会增加系统管理的复杂性。较少的分区数可能会导致消息处理能力不足,而较多的分区数则会增加系统的管理复杂性。通过合理设置分区数、优化生产者端性能和进行消费者组管理,可以充分发挥Kafka的优势,并构建可靠的消息传递系统。另一方面,如果订单数据的有序性对业务非常重要,我们可以选择与消费者数量相等的分区数,例如设置为5个分区。需要注意的是,分区数的调整可能涉及到Kafka Topic的重新分配和数据迁移,因此在生产环境中需要谨慎操作,并充分考虑系统管理的复杂性。原创 2023-05-28 18:34:48 · 1401 阅读 · 0 评论 -
如何无侵入地引入第三方组件?
你知道如何自定义starter吗?原创 2023-04-22 20:18:35 · 767 阅读 · 0 评论 -
啥?你还不会用log4j2?
log4j2提供了许多内置的Appender,例如ConsoleAppender、FileAppender和SocketAppender等,可以满足大多数日志记录需求。但是,有时候我们可能需要自定义Appender来满足特定的需求。// 自定义日志记录逻辑 } // 省略其他必需的Appender接口方法 }在这个示例中,我们创建了一个名为MyAppender的自定义Appender。它实现了Appender接口,并使用@Plugin注解进行了标记。原创 2023-04-08 11:10:59 · 602 阅读 · 0 评论 -
你会用guava限流器RateLimiter吗?
限流器是一种控制系统流量的机制,可以帮助我们在高负载情况下保护系统免受过载和崩溃的风险。通过限制进入系统的请求速率,我们可以避免服务器过载和资源耗尽的问题。Guava中的限流器提供了一种简单而有效的方法来控制系统流量,以保护系统免受过载和崩溃的风险。使用Guava限流器,您可以轻松地实现限流功能,并根据系统负载和流量需求动态调整请求速率。在实现分布式系统时,使用限流器是一种重要的防护机制,可以帮助我们确保系统的稳定性和可靠性。原创 2023-03-29 23:25:00 · 526 阅读 · 0 评论 -
mysql中的这些日志,你都知道吗 2?
上一篇文章,我们介绍了binlog和redo log这两种日志,对这两种日志不熟悉的老铁可以看下"",在上篇文章的末尾,作者还留了一个问题:binlog 和 redo log两个相互独立的日志模块,如何保持一致性?原创 2022-11-27 18:51:53 · 444 阅读 · 0 评论 -
mysql中的这些日志,你都知道吗?
在使用mysql的过程中,经常会听到mysql具有数据恢复能力,当我们在业务开发中误删了某些数据后,可以将数据库恢复到误删之前的状态。同时还具有故障恢复能力,当数据库所在的机器突然掉电停机后,mysql也可以保证数据一致性。同时对数据库中事务比较了解的小伙伴也知道,在可重复读的事务隔离级别下,可以支持快照读。在赞叹mysql这么强大的能力时,你可曾想过他是怎么实现的吗?其实上面这些功能实现的背后,都离不了日志的支持,接下来,我们来一起研究一下,mysql中有哪些日志,这些日志又是如何起作用的?原创 2022-11-20 22:01:32 · 375 阅读 · 0 评论 -
迭代器的这些细节你真的懂吗?
在第27行字节码,通过 iterface 指令获取 list的的迭代器iteraor对象,然后通过第34行字节码,通过调用 iterator的hasnext方法判断是否还有可比可遍历的元素,如果有的话,通过43行字节码,调用 next方法获取当前可用的item,也就是说foreach代码在运行时,依旧还是使用了迭代器,只不过在源码层面,对使用方式进行了简化。在迭代器游标访问元素b时,在元素b的位置插入了新的元素e,那么元素b就会被后移一位,那么接下来,元素b还会被再次访问,导致元素的重复访问。原创 2022-10-23 17:38:35 · 688 阅读 · 0 评论 -
控制反转和依赖注入,你真的分得清吗?
使用过Spring的老铁,应该都听说过**“控制反转”**和,也就是常说的IOC 和 DI,这两个概念通常会一起出现,那么这两者是一个概念吗?又该如何作区分,接下来我们就来研究一下,他俩到底是什么东西。在正式开始之前,我先提出几个问题,然后我们带着问题开始接下来的研究。原创 2022-10-16 18:57:37 · 2506 阅读 · 0 评论 -
微服务中常用的限流算法(二)
上一篇文章微服务中常用的限流算法(一)中我们介绍了滑动窗口算法和滚动窗口算法和具体的实现代码,本篇文章我们介绍漏桶限流算法和令牌桶限流算法。漏桶限流算法漏桶限流算法是模拟水流过一个有漏洞的桶进而限流的思路。水龙头的水先流入漏桶,再通过漏桶底部的孔流出。如果流入的水量太大,底部的孔来不及流出,就会导致水桶太满溢出去。限流器利用漏桶的这个原理设计漏桶限流算法,用户请求先流入到一个特定大小的漏桶中,系统以特定的速率从漏桶中获取请求并处理。如果用户请求超过限流,就会导致漏桶被请求数据填满,请求溢出,返回 5原创 2022-05-02 18:18:47 · 423 阅读 · 0 评论 -
微服务中常用的限流算法(一)
一个业务系统在指定配置的服务器上,可以承载的容量是一定的,当请求流量超过系统的容量后,系统就会变得不稳定,可用性下降,为了保证系统的可用性,需要将系统能够承载容量之外的流量进行丢弃,这样虽然会导致部分用户请求失败,但是整个系统依然是可用的,依然能对外提供服务,而不是因为负载压力太大导致整个系统崩溃,使所有用户都不能访问,这就是保证系统高可用的限流方案。目前业内实现限流的算法有四种,分别是固定窗口算法,滑动窗口算法,漏桶算法和令牌桶算法。为方面下文代码实现,我们定义了接口和对应的抽闲类:1.接口定义:原创 2022-05-02 17:36:01 · 1143 阅读 · 0 评论 -
高并发系统高可用设计方案(二)
上一篇文章"高并发系统高可用设计方案(一)"我们讨论了,在高并发系统高可用方案设计中,常用的一些架构设计的方法论,除了系统架构方法外,系统中各个子系统之间的交互方式和交互策略也极大的影响着系统的可用性,下面我就来讨论一下优化系统间交互几种方式。重试远程服务可能会由于线程阻塞、垃圾回收或者网络抖动,而无法及时返回响应,调用者可以通过重试的方式修复单次调用的故障。需要注意的是,重试是有风险的。比如一个转账操作,第一次请求转账后没有响应,也许仅仅是响应数据在网络中超时了,如果这个时候进行重试,那么可能会导致重原创 2022-04-30 17:53:15 · 1385 阅读 · 1 评论 -
高并发系统高可用设计方案(一)
什么是高可用互联网应用是面向大众的应用系统,他们可能会随时会被使用,那么应用就必须要保持随时可用,也就是我们常说的7x24小时可用,但是互联网应用有可能会遇到硬件故障,软件故障等多种问题,可能导致服务的不可用,所以要想保证服务100%可用是一件几乎不可能实现的事情。所以业界通常用多少个9来说明互联网应用的可用性,比如说某宝的可用性4个9,4个9是说服务可用性是99.99%可用,也就是说某宝的服务可以实现在运行时间内只有0.01%不可用,换句话说,当遇到上述的故障后,可在0.01%的时间内解决。如果以年为运原创 2022-04-23 18:37:49 · 7621 阅读 · 0 评论 -
微服务的基础设施有哪些?(一)
在上一篇文章"微服务是银弹还是焦油坑?"中,介绍了微服务的划分原则,也说明了,在使用微服务架构的过程中,如果没有完备的基础设施建设,微服务架构在业务开发中有可能会变成焦油坑,由此可见基础设施在微服务应用过程中多么的重要。在微服务的基础设施建设中主要涉及的内容有:自动化测试,自动化部署,配置中心,接口框架,API网关,和服务管理。其中服务管理又分为:服务发现,服务路由,服务容错,服务监控,服务跟踪,服务安全。自动化测试微服务将原本大一统的系统拆分为多个独立运行的“微”服务,微服务之间的接口数量大大增加,并原创 2022-04-10 21:41:57 · 1085 阅读 · 0 评论 -
微服务是银弹还是焦油坑?
微服务是银弹吗微服务是近些年特别火热的一种架构设计理念,在各大互联网公司盛行的一种系统架构设计方式。以至于很多老铁在项目开发实践中,会不加思考的采用微服务,总觉得实施了微服务就可以把什么问题都解决了,而一旦真正实施后才会发现掉进了微服务的坑里,我们都知道微服务架构设计理念主要强调:small,lightweight,automated。也就是每个服务设计的尽量小,服务更加轻量级和服务的自动化管理。然而在微服务实践过程中,仍然可能面临一些问题:1.服务划分的过细,服务间关系复杂服务划分的过细,单个服务的原创 2022-04-05 18:35:34 · 2257 阅读 · 0 评论 -
Spring中事件监听处理流程全解析
上一篇文章深入理解事件发布监听机制,小编实现了一个基于jdk的事件监听处理的小程序,虽然功能简单,但是却很详细的说明了事件监听处理的原理。在Spring中也有完整的事件监听处理机制,原理和jdk的事件处理流程大概是相同的,只不过Spring在实现的过程中,有一些特殊的细节处理。比如:事件类型和监听器对应关系的缓存,事件处理的异步化,异常处理器定义。下面我们基于Spring中的事件处理机制实现一个和上篇文章相同的事件监听处理程序,然后,从源码角度看一下Spring是如何实现事件监听处理机制的。案例解析为原创 2022-03-27 22:30:43 · 1972 阅读 · 0 评论 -
深入理解事件发布监听机制
什么是事件发布监听在软件程序开发过程中,经常会遇到“事件处理模型”:调用端发送一个事件,然后相应的事件处理程序处理这个事件。最常见的就数桌面应用软件了,在这些应用程序中,当你鼠标点击了一个按钮或者键盘输入一个快捷键时,应用程序就会做出响应,来处理你的点击和键盘输入等行为。除了这些比较直观的桌面级应用程序外,事件驱动的设计模型还经常使用在程序设计中,它可以将事件发送和事件处理逻辑进行解耦,可以针对不同的事件定义对应的事件处理程序,增加了程序的扩展性,这种设计模式又被称为观察者模式。在事件监听处理的过程中原创 2022-03-20 22:54:10 · 1318 阅读 · 0 评论 -
一文搞懂 UndeclaredThrowableException
什么是UndeclaredThrowableException异常学习java的老铁们应该都知道,在java中子类方法不能抛出被父类更广泛的异常,意思就是说,如果在父类或者接口的方法签名中声明了,该方法可以抛出A异常,那么子类或者实现类在重写这个方法的时候,只能抛出异常A或者A的子类才可以,而且这个规则的验证,已经放到了java编译器中了,如果在代码编写的过程中违反了这个规则,会出现编译错误。不知道各位老铁有没有想过,java为什么会有这样的要求?这是因为在面向对象编程范式中,要求我们面向抽象而非具体编原创 2022-03-12 22:06:51 · 33692 阅读 · 2 评论 -
性能调优的关键指标,你都知道吗?
在业务开发中,在讨论一个服务的性能时,经常会提到一些性能相关的指标,如tps,qps,rt并发线程等。虽然这些指标经常被挂在嘴边,但是每个指标的含义,能比较细致的说出来的,却不多,不信可以尝试回答一下下面的几个问题,没准可以get到新技能1.到底什么是qps?2.TPS中的T是什么意思?3.影响TPS的因素?4."平响"是怎么计算的?到底什么是qpsQPS 一开始是用来描述 MySQL 中 SQL 每秒执行数 Query Per Second,所有的 SQL 都被称为 Query,也就是说这里的原创 2021-11-20 22:07:23 · 1641 阅读 · 0 评论 -
mysql中事务id,有啥用?
trx_id是Innodb中标识一个事务的id,是一个6字节长度的整数。这个id的值来源于是Innodb维护的max_trx_id,当需要申请一个新的trx_id值时,就获取max_trx_id的最新值,然后将max_trx_id值加1.注:max_trx_id和row_id类似,存储时使用数据类型是8字节,但是只使用其后6字节数据,当max_trx_id超过了2的48次方时,max_trx_id的值,有会从0开始循环。对于trx_id的介绍,我们分以下4个小结。1.trx_id获取的规则,什么时候获原创 2021-11-19 21:52:21 · 5446 阅读 · 2 评论 -
删了那么多数据,数据表占用的空间没有变化?删了个寂寞
在工作中你有没有遇到过这种情况,删除了数据表中的一部分数据,但是数据表的表文件大小并没有发生变化?我倒是遇到过一次,线上告警,数据库服务器磁盘利用率过大,通过查看发现存在一张表数据量过多,占用了大量空间。考虑到业务数据具有时效性,历史数据的保存没有什么意义。于是,采用了一个比较激进的方案-删数据。为了防止一次删除过多的数据,影响线上的业务,在删除数据的过程中,分批次对数据进行删除,每次删除5w条数据。在保证对线上业务没有影响的前提下,删除了150w数据(整体数据量10%左右)。但是线上告警并没有中断,通过原创 2021-09-20 18:15:48 · 1474 阅读 · 0 评论 -
为啥join不走索引了(1)?
在使用sql进行join时,我们总是希望连接字段在被驱动表上建立有索引。这样可以加快sql的执行效率,关于join的执行过程以及优化策略,可以查看 “join的执行过程”。但是,有时候即使我们在被驱动表上的指定字段上建立了索引,join的执行过程仍然没有走索引。接下来,作者介绍几种工作中经常遇到的导致不走索引的场景,看看有没有你遇到的?编码不一致导致索引失效为了方便下文描述,我们建立如下表结构:CREATE TABLE `t_user` ( `id` int(11) NOT NULL, `n原创 2021-09-11 20:25:39 · 3818 阅读 · 0 评论 -
一文搞懂mysql中的索引(下)
上一篇文章中讨论了索引的基本原理和mysql中的聚集索引,下面我们一起来学习下,非聚簇索引相关内容。因为非聚簇索引的叶子结点上存放的是数据表主键值,而完整的行数据存放在聚簇索引中。所以,如果要使用非聚簇索引查找完整的行数据,需要先找到主键值,然后再通过聚簇索引,找到完整的数据。在这个过程中,使用非聚簇索引找到的主键,再通过聚簇索引查找完整数据的过程,成为回表,简单来说,回表就是再去聚簇索引中查询一次索引树。在日常使用中,非聚簇索引又可以分为如下三类:唯一索引,普通索引,联合索引。唯一索引唯一索引在原创 2021-08-08 23:14:44 · 161 阅读 · 0 评论 -
一文搞懂mysql中的索引(上)
索引是一种数据结构,主要用来在大量数据中快速定位需要查找的数据。索引最形象的比喻就是图书的目录了,如果你想要在书中快速找到一篇文章,最常用的方法应该就是查找目录,而不是从书的第一页逐页的寻找吧。可以实现索引效果的数据结构有很多,如哈希表,有序数组和搜索树。使用这三种数据结构进行索引实现,都各有自己的优点和不足,这里不多赘述。在mysql的InnoDB存储引擎中,索引的实现采用的是搜索树的方式。而搜索树有多个变种,实现方式也各不相同,在mysql中使用的是B+树。为了更好的学习B+树,我们可以先了解下二叉原创 2021-08-08 17:28:58 · 217 阅读 · 0 评论 -
如何让mysql存储海量数据
关系型数据库是日常工作中常用的数据存储中间件,而mysql又是关系型数据库中最流行的数据库之一。无论是中小型系统还是大型互联网系统,都会有mysql的身影。在中小型系统中,由于数据普遍比较少,通常使用一个mysql实例,再加上合适的业务索引,足可以支撑完整的业务系统。而对于大型的互联网系统,需要存储的数据量是海量的,像某宝,某多等电商系统,一张订单表,每天数据增量可能多达千万甚至上亿,采用小型系统中数据存储策略,显然是不合适的,下面小编介绍两种可以提高数据性能的架构方案。读写分离读写分离的基本原理是将原创 2021-07-18 21:34:58 · 2646 阅读 · 0 评论 -
mysql查询一行数据也很慢?
在使用mysql的过程中,当遇到查询语句执行缓慢时,你首先会想到什么?执行的sql语句很复杂,没有走索引?查询语句返回的数据量很大?或者,此时数据库实例自身负载压力很大或者ioutil很高。当然这些因素都会导致一条查询语句执行效率降低。除了上面列举的三个之外,你还能想到其他导致查询变慢的原因吗?下面小编结合日常工作中遇到的场景以及学习资料,总结了一些其他导致查询语句变慢的原因。总结来说分为两类: 1.查询长时间不返回。 2.查询慢。为了方便下面描述,创建一下测试表:CREATE TABLE `t原创 2021-07-11 17:44:38 · 754 阅读 · 0 评论