自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 03 类加载机制

JVM 将字节码二进制流加载到内存称为类加载。

2025-08-02 17:39:33 469

原创 JVM 02 垃圾回收

JVM 的垃圾回收(Garbage Collection)主要针对堆中对象。

2025-08-02 16:52:26 635

原创 JVM 01 运行区域

虚拟机隐藏平台差异,解决不同平台代码运行结果不一致问题,实现,实现用户代码跨平台。它本身是一个操作系统上的应用程序,将字节码文件翻译成特定机器的机器码。

2025-08-02 12:01:09 921

原创 Mysql 分区表

但是 server 层加的锁,比如 MDL 锁,就会加到它认为的一张表,实际上是所有分区表上。同时会造成如下场景:对一个分区执行 truncate 语句,试图获取 MDL 写锁,与表的查询语句(获取 MDL 读锁)冲突。但是从引擎层来看,是多张表,对应多个.idb文件。引擎层访问数据只访问特定分区表,也只对特定分区表加锁,可以减小锁范围。分区表的典型应用场景是归档表,分区直观简洁,业务代码也更清晰。分区表是将一张表分成多张独立子表,每个子表是一个区,目的是提高查询效率。

2025-08-02 10:56:57 147

原创 Mysql insert 语句

是非常轻量的。但是某些复杂语句可能很慢。

2025-08-02 10:12:52 194

原创 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 join语句

join 语句用于实现多表查询。

2025-08-01 21:04:11 469

原创 Mysql监控数据库

select 1;返回正常证明 Mysql 实例没挂。但是可能存在并发线程多,系统不可用的问题。Mysql 提供参数 innodb_thread_concurrency 控制并发线程数,一般在 64-128 之间。如果线程满了,新事务就无限等待线程释放。但是select 1;不会报错。连接并发可以上千,连接本身占内存和网络,但是不占 CPU 资源。

2025-08-01 19:51:54 156

原创 Mysql 主备一致

Mysql 是利用 binlog 实现主备一致,高可用。

2025-07-31 08:35:06 354

原创 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 04 runner pod状态管理

资源监控 runner pod 的生命周期。根据 runner pod 的不同状态决定策略。

2025-07-16 08:13:02 246

原创 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 锁

锁的目的是保证多事务安全同步。Mysql 锁分为全局锁,表锁和行锁。

2025-07-11 08:28:18 306

原创 Mysql 索引

索引就是数据库的有序目录,可以提高查询数据的效率。但是索引占据额外磁盘空间,维护索引需要时间。InnoDB 引擎的每个索引都是一个B+树。根据叶子节点可以将索引分为主键索引(聚簇索引)和非主键索引(非聚簇索引)。主键:一个表只有1个主键。不可重复,也不可为空。通过主键可以唯一确定一行数据。主键索引的叶子节点是行数据。只需查找1次B+数即可查找完整数据。非主键索引的叶子节点是主键值。再根据主键值从主键索引中查找完整数据。这个过程是回表。

2025-07-09 20:59:21 364 1

原创 mysql 事务隔离级别

事务的目的是保证用户自定义的一组操作要么同时成功,要么同时失败。Mysql的InnoDB引擎支持事务。

2025-07-08 07:44:35 638

原创 设置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

原创 回溯法-排列,组合

回溯法是一类特殊优先搜索,它记录节点状态,并在搜索完成后回溯状态。

2025-02-04 18:07:42 293

原创 深度优先搜索 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

原创 SpringBoot 启动类 SpringApplication 二 run方法

在。

2024-12-22 17:23:20 603

原创 算法 双指针技巧

那么左指针遍历到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关注的人

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