- 博客(70)
- 收藏
- 关注
原创 Springboot 04 starter
如果创建新的 Springboot 项目,目录结构类似于下图。目录规范来自构建工具 maven/gradle,而不是 Spring 框架。图片来自《Springboot 实战第 4 版》@SpringBootApplication 注解的类是应用程序启动类,实现两个功能:自动配置,启动引导。@SpringBootApplication 注解由以下三个注解组成。@EnableAutoConfiguration:启动自动配置。@ComponentScan:启动组件扫描。
2025-08-03 18:45:06
324
原创 Spring 03 Web springMVC
SpringMVC 通过 WebDataBinder 机制来获取参数。它解析 HTTP 请求上下文,转换参数并且提供验证功能。转换参数的接口有三个:Converter,Formatter 和 GenericConverter。第一个是转换类型,第二个是转换格式,第三个是转换数组。SpringMVC 将三个接口的默认实现类注册到注册机,这就是大部分类型转换无需开发者开发的原因。我们可以定义自己的转换器,只需实现接口,SpringMVC自动注册到注册机。
2025-08-03 16:08:38
798
原创 SpringBoot 01 IOC
IOC(Inversion of Controller,控制反转)是 SpringBoot 框架的核心。用户只需要用注解声明对象,IOC 容器完成对象的创建和管理。
2025-08-02 20:44:55
316
原创 SpringBoot 02 AOP
AOP(Aspect-Oriented Programming,面向切面编程)是Springboot 的核心概念。它是面向对象编程的一种延续。它将公共模块(日志,事务,权限,监控)代码与业务模块代码分开开发,通过动态代理实现两者组合发挥功能。
2025-08-02 20:43:41
278
原创 JVM 01 运行区域
虚拟机隐藏平台差异,解决不同平台代码运行结果不一致问题,实现,实现用户代码跨平台。它本身是一个操作系统上的应用程序,将字节码文件翻译成特定机器的机器码。
2025-08-02 12:01:09
921
原创 Mysql 分区表
但是 server 层加的锁,比如 MDL 锁,就会加到它认为的一张表,实际上是所有分区表上。同时会造成如下场景:对一个分区执行 truncate 语句,试图获取 MDL 写锁,与表的查询语句(获取 MDL 读锁)冲突。但是从引擎层来看,是多张表,对应多个.idb文件。引擎层访问数据只访问特定分区表,也只对特定分区表加锁,可以减小锁范围。分区表的典型应用场景是归档表,分区直观简洁,业务代码也更清晰。分区表是将一张表分成多张独立子表,每个子表是一个区,目的是提高查询效率。
2025-08-02 10:56:57
147
原创 Mysql group by
内存表是 Memory 引擎表,表的数据行都在内存。临时表可以使用各种引擎。临时表是线程私有表,其他线程不可见,不需考虑重名问题。session 结束时临时表会被自动删除。如果 Binlog_format = row,则临时表语句不进入 binlog,不参与主从同步。普通表的 table_def_key = 库名 + 表名。临时表的 table_def_key = 库名 + 表名 + mysql实例 id + 线程 id。
2025-08-01 21:30:58
416
原创 Mysql监控数据库
select 1;返回正常证明 Mysql 实例没挂。但是可能存在并发线程多,系统不可用的问题。Mysql 提供参数 innodb_thread_concurrency 控制并发线程数,一般在 64-128 之间。如果线程满了,新事务就无限等待线程释放。但是select 1;不会报错。连接并发可以上千,连接本身占内存和网络,但是不占 CPU 资源。
2025-08-01 19:51:54
156
原创 Mysql 幻读与间隙锁
幻读是前后两次相同范围查询语句,查询的数据行不一样,即第二次查询到新数据行。这是可重复读隔离条件下当前读才会出现的问题。可重复读隔离条件下快照读的MVCC可以防止幻读。
2025-07-30 08:26:13
422
原创 Mysql 日志 binlog redolog
binlog 属于 server 层,所有引擎共有。主要用于主从同步。它记录逻辑日志,即原始 sql 语句。
2025-07-25 21:20:06
701
原创 ARC05 CRD更新策略
如果用户更改 runner scale set chart 的 Values.yaml,集群中的 AutoscalingRunnerSet 资源会被直接更新。控制器们将依据 AutoscalingRunnerSet 资源更新其他资源。
2025-07-16 08:25:25
220
原创 ARC 03 从Github Action job 到 runner pod
本文讲了 Github Action job 到 runner pod 的执行流程。
2025-07-13 20:56:04
311
原创 ARC 02 runner scale set chart:对接集群与 Github Action 服务器
controller chart 安装的 controller 容器将四个自定义资源控制器注册进入集群。runner scale set chart 安装的 资源将使得仓库 runner 连接 Github Action 服务器。
2025-07-13 18:09:19
956
原创 ARC 01 controller chart: 部署自定义资源与自定义资源控制器
此时还没有实现仓库的 runner 接入 Github Action 服务器。需要对仓库部署 runner scale set chart,才能实现接入。
2025-07-13 18:07:33
635
原创 Mysql 索引
索引就是数据库的有序目录,可以提高查询数据的效率。但是索引占据额外磁盘空间,维护索引需要时间。InnoDB 引擎的每个索引都是一个B+树。根据叶子节点可以将索引分为主键索引(聚簇索引)和非主键索引(非聚簇索引)。主键:一个表只有1个主键。不可重复,也不可为空。通过主键可以唯一确定一行数据。主键索引的叶子节点是行数据。只需查找1次B+数即可查找完整数据。非主键索引的叶子节点是主键值。再根据主键值从主键索引中查找完整数据。这个过程是回表。
2025-07-09 20:59:21
364
1
原创 设置github 代理
场景:执行CI需要下载GitHub仓库源码。访问很慢,有时会被中断。因此需要配置github代理。代理网站更新频繁,可以在搜索引擎搜索关键词`github代理网站`,寻找最新可靠的代理网站。真正配置在` ~/.gitconfig`文件里。
2025-03-25 20:31:04
1705
原创 算法-广度优先搜索
广度优先搜索BFS先用先进先出的队列存储新节点,等当前层的新节点都搜索完毕之后再搜索下一层节点。广度优先搜索常用来处理最短路径问题。
2025-02-26 06:01:56
279
原创 JDK17 HashMap 二 添加元素
方法比较对象的引用,即两者是否是同一个对象,而不是比较对象的字段。开发中更常用的是比较对象的字段,因此要在自定义类重写。语句定位key所在桶索引。第二个if语句是判断索引第一个节点。之后在红黑树/链表里查找对象。相等)能被分配到桶的同一个索引,需要在自定义类重写。比较某个节点是否等于键值对的条件有2个。表示不允许更新值,除非值为null。至此,已经将键值对存入桶的节点对象。在当前链表存储或者更新键值对,用。语句是初始化当前索引,存储一个。某个节点等于键值对的条件有2个。方法添加或者更新键值对。
2025-02-05 07:49:04
304
原创 深度优先搜索 DFS
如图所示,深度优先搜索DFS对新节点立即执行搜索,因此新节点都向下一层。而广度优先搜索BFS先用队列存储新节点,等当前层的新节点都搜索完毕之后再搜索下一层节点。
2025-02-04 17:01:37
474
原创 JDK17 HashMap
ArrayList用动态数组存放元素,而HashMap用动态数组(桶)存储键值对。如果两个键值对映射到桶同一个索引,则称为散列冲突。HashMap采用拉链法解决冲突,即桶中每个索引指向一个链表或者红黑树,多个键值对存放在同一个链表/红黑树中。拉链法的缺点是:键值对规模较小时,浪费空间。而用的就是开放地址法解决冲突。
2025-01-26 08:21:12
552
原创 JDK17 ArrayList
它的内部实现基于数组,如果数组容量不足以存储新元素,那么会新增容量更大的新数组,并且将原数组元素复制到新数组。ArrayList用于处理动态数据集合,提供便捷的操作接口和灵活的扩展能力。接口实现双向遍历列表。提供2种迭代器对象。
2025-01-17 16:01:16
496
原创 算法排序算法
对于这种“第K个元素”的问题,可以用快速选择,它是对快速排序的一种简化。快速排序采用分治思想,将数组分为两个子数组,每次划分数组都随机选择一个元素,小于该元素的在一个数组,大于该元素的在另一个数组。递归执行划分数组操作,直到数组全部完成排序。而快速选择针对某个元素,它不要求对两个子数组排序,仅仅递归划分“第K个元素”在的那个子数组即可,直到获得“第K个元素”的位置。为了避免两个子数组,一个长度为1,一个长度为n-1的极端情况,每次划分数组时随机选择元素。通过递归实现快速排序。
2024-12-29 07:11:22
591
原创 SpringBoot ApplicationListener SpringApplicationRunListeners
自定义一个事件监听器和run方法监听器。并且将监听器写入/META/spring.factories文件。
2024-12-27 08:12:01
618
原创 SpringBoot 启动类 SpringApplication 三 配置IOC容器
是交给容器子类自定义初始化,web容器在此配置web环境并且启动tomcat。默认的初始化器有7个。从上到下它们的功能分别是。容器根据定义类创建容器。是容器实现类,它添加bean后处理器。最后将后处理器重新注册一遍。是bean的定义类,是对不同来源(,因为此时还没有创建bean。后处理器分2种,一种是。也是按照优先级进行处理。接口,其余的最后处理。处理结束后,删除缓存。方法也是按照优先级注册。
2024-12-27 06:25:14
790
原创 算法 双指针技巧
那么左指针遍历到i时,如果右指针大于j,那么和偏大,右指针左移,不会出现左指针右移的情况。右指针遍历到j也是同理,因此不会出现左指针大于i,右指针小于j的情况。a表示头节点到入环点的距离,b表示入环点到相遇点的距离,c表示相遇点到入环点的距离。由于数组是有序的,因此两个指针,一个从前向后遍历,一个从后往前遍历,可以在O(n)时间复杂度完成查询。,这个等式意味着,分别从相遇点出发和从头结点出发的两个节点终会在入环点相遇。在环里相遇,它们速度又相同,因此它们在环里的每个位置都相遇,自然包括入环点。
2024-12-22 12:00:01
643
原创 SpringBoot Redis 消息队列
Redis在server端为每个消费者保留一块内存区域,存储该消费者订阅的数据。如果消费者处理速度慢,内存区域满了,那么Redis会断开消费者连接,这会导致消息丢失。完整项目在https://gitcode.com/zsss1/redis_mq/overview。发送者将消息发送到频道,订阅者订阅频道即可及时收到消息。消息队列可以实现消息解耦、消息路由、异步处理、流量削峰填谷。同时可以满足有序,消息去重。redis的list底层是链表,满足先进先出。它支持组生产者与消费者。Redis也可以实现消息队列。
2024-12-21 18:38:12
912
原创 贪心算法 greedy
先从左到右遍历孩子,如果当前孩子比左边孩子评分更高,则糖果数=左孩糖果数加1.完成遍历后,满足左邻条件。再从右往左遍历孩子,如果当前孩子比右边孩子评分更高,则糖果数=右孩糖果数加1。为了更多孩子能拿到饼干,对每个孩子的要求是“尽量给没拿到饼干的孩子留更多饼干”,换句话说就是“自己尽量拿更小的饼干”。题目要求:相邻两个孩子评分更高的孩子会获得更多的糖果。为了更少分配糖果,如果孩子评分更高,只比相邻1个糖果。因此按照区间的结束序号从小到大排序,每次都留下结束时间最早的,然后往后遍历,删去重叠的。
2024-12-21 11:37:13
647
原创 SpringBoot 启动类 SpringApplication 一 构造器方法
这两个上下文,前者是引导上下文,在IOC容器启动之前保存预先加载的类,IOC容器启动之后会销毁引导上下文。是资源加载器,它定义获取资源的策略。它加载各种来源的资源,比如文件资源(启动项目,加载的实现类中就包含自定义的实现类。参数获取实现类的全限定类名,之后实例化。方法查询类路径上是否存在某个类。静态方法实现加载工厂类并且保存在。的方法,该方法所在的类就是主类。对象是对各种资源的抽象,调用。用于实例化该接口的实现类,即。实现类,定义监听的事件。的实现类,用于监听启动。工厂类文件的加载器。
2024-12-20 07:52:55
563
原创 SpringBoot SPI
SPI将服务接口与服务实现解耦。调用者动态配置JDBC实现包,实现动态加载数据库连接,而不是在代码中显式定义。是服务提供者的接口,有接口,有实现。比如后端向前端提供的接口。是服务接口,它只有接口,没有接口的实现。具体实现由不同的包自己定义。目录下新增配置文件,文件名是接口全限定类名,文件内容是接口实现者的全限定类名。以JDBC为例,JDK提供JDBC接口,在包。修饰的配置类,使得配置类中定义的bean都进入IOC容器。接口的实现类,154个类就是这样放入。文件用一组键值对表示接口与实现。
2024-12-15 12:13:47
400
原创 [146 LRU缓存](https://leetcode.cn/problems/lru-cache/)
维护一个双向链表保存缓存中的元素。如果元素超过容量阈值,则删除最久未使用的元素。为了实现这个功能,将方法获取的元素添加到链表首部。为了在O(1)时间复杂度执行get()方法,再新建一个映射表,缓存key与链表节点。
2024-12-14 10:37:54
588
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人