- 博客(64)
- 收藏
- 关注
原创 Spring Boot 使用 SLF4J 实现控制台输出与分类日志文件管理
本文介绍如何在Spring Boot项目中实现高效日志管理。通过SLF4J+Logback组合,配置日志系统实现:控制台实时输出、按级别分类保存(info.log/error.log)、按日期滚动存储、统一logs目录管理。提供了完整的logback.xml配置文件示例,包含日志格式定义、按级别过滤、60天历史保留等关键设置。项目启动后,logs目录将自动生成分级日志文件,满足开发和运维需求,为系统调试和问题排查提供有力支持。
2025-06-05 20:50:09
685
原创 Maven的生命周期
Maven的生命周期是一系列预定义的构建阶段,用于自动化和标准化项目构建过程。它包含三个核心生命周期:默认生命周期(负责编译、测试、打包和部署)、清理生命周期(清除构建输出)和站点生命周期(生成项目文档)。每个生命周期由多个有序阶段组成,如默认生命周期包括validate、compile、test、package等阶段。Maven通过这些生命周期组合管理项目构建全流程,确保构建过程的一致性和可重复性,使开发者能专注于业务逻辑而非构建细节。
2025-06-05 11:06:24
877
原创 从零到一:Maven 快速入门教程
Maven是 Apache 软件基金会开发的一个项目管理和构建自动化工具,主要用于 Java 项目。管理项目的依赖(比如第三方库)自动构建项目(编译、打包)管理项目的生命周期(从创建到发布)管理插件(自动化任务,如测试、代码检查)一个 Maven 工程遵循约定的目录结构,这种标准化的目录布局是 Maven 实现自动化构建过程中不可或缺的关键环节。Maven 推荐采用统一的目录结构,以确保项目的一致性和构建过程的高效性。├── src/│ │ └── java/ # 主代码。
2025-06-05 10:56:09
1394
原创 Mybatis的参数传递与结果映射
MyBatis 中,Mapper 接口通过参数向 XML 中的 SQL 语句传递数据,主要使用 #{} 和 ${} 进行参数提取,前者安全,后者用于动态拼接。常见的传参方式包括单个参数、多个参数(需使用 @Param 注解)、Java Bean 以及混合传参。返回结果映射方面,MyBatis 支持自动映射(resultType)和自定义映射(resultMap),能够处理简单字段映射、嵌套对象及一对多集合映射。自动映射要求数据库列名与实体类属性名一致或符合驼峰命名规则,而自定义映射则通过 resultMap
2025-05-22 14:21:22
562
原创 流量守门员:接口限流艺术
这里我们本系统设计了一个“时间滑动窗口”限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间段内的请求次数。通过动态地滑动窗口,可以动态调整限流的速率,以应对不同的流量变化。后续的业务,就时不同场景中,根据不同的需求,进行修改校验就行了,比如 5 分钟限流 3 次,10 分钟限流 8 次等。允许用于 3 分钟内,只能发送 3 个验证码,或者 10 分钟内只能发送 8 个验证码。简单易实现,但存在窗口切换时的流量突增问题。更平滑的流量控制,但实现复杂度较高。严格限制流量速率,输出流量恒定。
2025-04-29 10:54:42
990
原创 订单防重复提交与超时取消:AOP + 延迟队列实战
在电商、订票或预约类系统中,订单的提交与取消是核心业务流程之一。本篇博客将介绍这两个问题产生的原因,以及在实际开发中常见的解决方案。
2025-04-11 17:31:33
893
原创 Git代码管理
由阿里巴巴技术专家林帆基于 TrunkBased 和 GitFlow 提出的一种新改进,其主要分为三种分支类型:主干分支、特性分支以及发布分支,:用于进一步描述该提交影响的模块、组件或区域。例如,如 果在一个大型项目中修复了某个特定模块的bug,则可以写为 fix(parser):。可根据以下思维导图,选择适合的分支管理策略。type (类型):描述提交的类型,通常是一个简短的动词,用于表示此次提交的主要性质。:如果有需要,可以在空行后提供详细 的变更解释、原因分析、兼容性影响等。
2025-04-08 17:18:56
764
原创 RabbitMQ 快速入门
生产者”想要将不同的消息分发给不同的 Queue(甚至广播给所有的 Queue),就需要可以定义消息路由分发的组件“交换机 (Exchange)”,将 Exchange 和 Queue 通过。为了更好的管理不同种类的消息,可以创建多个类型的队列,生产者可以自定义 Queue 的名字,并且根据需要,将消息投递到不同的 Queue 中。“优先级队列(Priority Queue)”是一种特殊的消息队列,它允许消息按照优先级进行排序,高优先级的消息会被优先消费,而。,将消息投递到绑定键完全匹配的队列。
2025-03-24 15:23:21
899
原创 深入理解ThreadLocal:线程安全的“独享空间”
ThreadLocal是 Java 提供的一种用于线程本地存储的工具类,它可以为每个线程提供独立的变量副本,从而实现线程隔离。主要用于在多线程环境下存储线程独有的数据,避免多个线程间共享变量带来的数据一致性问题。
2025-03-20 21:09:15
1149
原创 对象引用类型
引用类型GC 何时回收是否影响 GC常见应用强引用(StrongReference)永不回收(除非手动置null是普通对象、业务逻辑软引用(SoftReference)内存不足时回收否缓存(图片、数据)弱引用(WeakReference)发现后立即回收否虚引用(PhantomReference)对象被回收后通知否监控回收、清理资源强引用:普通对象,GC 不会自动回收,可能导致内存泄漏。软引用:用于缓存,GC 只有在内存不足时才会回收。弱引用随时可能被 GC 回收,用于等。虚引用。
2025-03-20 02:02:56
1044
原创 线程池-抢票系统性能优化
Java线程池是一种用于优化线程使用和管理的工具,它通过复用一定数量的线程来执行多个任务,从而减少了创建和销毁线程的开销,提高了程序的性能和响应速度。在前面,我们通过创建多个线程模拟抢票场景,并且使用加锁的方式解决了车票超卖的问题。‼️当用户量较大时,就需要频繁的创建线程对象、释放线程对象,十分麻烦。池化后,性能得到了质的飞跃🚀。Java中的线程池是通过。接口及其子类来实现的。
2025-02-11 14:22:24
651
原创 Java多线程模拟售票超卖问题-解决方法
多个线程各自占有一些共享的资源,并且相互等待其他线程占有的资源才能运行,从而导致两个线程都在等待对象释放资源。上述情况明确指向了线程同步机制的重要性。在并发编程中,为确保操作的正确性和数据的一致性,必须采取有效的。:Thread 类是通过继承实现,但是一个类只能继承一个父类,所以具有一定的局限性。多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低。这种基于随机选择而非严格遵循请求顺序的锁称为非公平锁。访问资源时在空闲等待时同时访问其他资源,措施来避免竞态条件的发生。Java 的线程池(如。
2025-02-10 16:07:12
1141
原创 ConcurrentHashMap
是 Java 并发包()中提供的一种线程安全的哈希表实现,其主要目标是在多线程环境下提供高效的并发访问和更新能力,同时尽量减少锁竞争,从而达到较高的性能。线程安全允许多线程并发地进行读写操作,无需对整个数据结构进行全局加锁,它通过细粒度的同步机制确保线程安全。高并发性能: 在高并发场景下,相比于传统的Hashtable或者对HashMap,ConcurrentHashMap 对全部方法进行同步包装,提供了更高的吞吐量和更低的锁竞争。不允许 null: 与HashMap不同,不允许存储null键或。
2025-02-10 10:30:32
854
原创 手写Spring IOC-简易版
我们可以使用 Java 中的反射。对象,这会导致资源浪费,在严重情况下可能会引发。假设 Web 应用程序现在运行正常。实例作为 value 存储在一个。方法,说明依赖注入成功。接口时,都会创建一个。
2024-10-17 17:23:14
817
1
原创 Java-反射机制
反射机制允许程序在执行期借助于 ReflectionAPI 取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到。加载完类之后,在堆中就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为反射。
2024-10-16 14:24:30
717
原创 HashMap源码解读
HashMap 是 Map 集合体系中最常用的集合类,以下是其主要的特点:键值对存储:HashMap存储数据的形式是键值对,你可以通过键来获取、更新或删除对应的值。快速访问:HashMap提供了快速的访问能力,其时间复杂度接近 O(1),这是因为 HashMap 通过计算键的哈希码来直接定位数据的存储位置。无序集合:HashMap不保证元素的顺序,也就是说,遍历HashMap时元素的顺序与插入顺序无关。允许一个null键和多个null值:HashMap允许使用一个null键和多个null值。
2024-10-12 15:15:56
822
原创 LinkedList源码解读
LinkedList 是对 Java 集合框架中 List 接口的一种具体实现,归属于线性数据结构的范畴。其核心内部结构是通过双向链表(double-linked list)来实现的,这使得它在元素插入、删除操作上具备较高的效率,尤其是在列表的首尾进行操作时。相较于数组实现的列表,如 ArrayList,LinkedList 在非索引访问或遍历操作上可能效率较低。LinkedList 类继承自 AbstractList 抽象类,并且实现了 List 接口以及标记接口 Serializable。
2024-10-11 11:00:10
521
原创 ArrayList源码解读
ArrayList 是对List接口的一种具体实现,属于单列集合类型。其内部数据结构基于动态数组实现,允许在运行时根据需要自动调整容量,从而实现了对元素的高效存储与访问。ArrayList 类继承自 AbstractList 抽象类,并且实现了 List 接口以及标记接口 Serializable。通过实现 Serializable 接口,ArrayList 集合的实例能够支持序列化过程,从而允许对象的状态被转换成可以存储或传输的形式,用于网络传输或保存到文件等。
2024-10-11 10:16:00
1071
原创 Ubuntu设置国内镜像(阿里云、华为云)
国内有很多 Ubuntu 的镜像源,包括阿里的、网易的,还有很多教育网的源,比如:清华源、中科大源等。通过以下地址可以看到阿里云 Ubuntu 各个版本的镜像地址,从中选择自己的系统版本就好,一定要选择。,Ubuntu每一个版本都有一个代号,这个一定要跟国内源对应,否则会出问题。可以看到系统的版本号是。
2024-08-08 10:59:30
2652
2
原创 MYSQL-性能分析工具
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。通过分析慢查询日志,可以找到数据库性能的瓶颈,并进行优化。上述四种方法均以执行时间作为衡量SQL性能的标准,但这种方法仅能提供大致的评估,并非精确衡量SQL语句性能的手段。慢查询记录的是执行耗时时间超过预设值 2 秒的查询记录,假设现在需要优化 1 秒以内的 SQL 查询,如何定位这条记录呢?:查询中每个表的顺序编号,标识查询执行的顺序。的需要读取的数据行数,影响性能的一个重要因素。
2024-07-30 16:52:57
1106
原创 MYSQL-存储引擎
InnoDB 是 MySQL 的 默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。支持事务行级锁定外键约束、MVCC(多版本并发控制)除了增加和查询外,还需要更新、删除操作,那么,应优先选择 InnoDB 存储引擎。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑 InnoDB 引擎。数据文件结构:(在《第02章_MySQL 数据目录》章节已讲)
2024-07-30 09:13:52
447
原创 MYSQL-初级-事务篇
事务是一组操作集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起想系统提交或撤销请求,这么操作要么全部执行成功,要么全部失效。
2024-07-30 09:08:55
1023
原创 Java-集合框架
Java的集合框架提供了一组用于存储、管理和操作数据的类和接口。这个框架提供了各种数据结构,如列表、集合、队列和映射,以满足不同的数据处理需求。CollectionMap两大类。
2023-10-11 23:56:02
269
原创 Java-多线程
多线程编程是现代软件开发不可或缺的一部分,但也存在复杂性和挑战。通过深入理解多线程的原理和最佳实践,开发人员可以更好地利用多核处理器,提高程序性能和响应性,同时避免潜在的线程安全问题。本博客提供了一个较为基础的多线程编程指南,帮助开发人员入门这一重要领域的技能。
2023-10-08 08:27:27
211
原创 Java-包装类
通过这种方式,您可以更清晰地呈现每个注解的信息和源码分析,使读者更容易理解和学习Java常用包装类的使用。在父类中,AbstractStringBuilder有属性char[] value,用于存储字符,不是final修饰;字符序列存放AbstractStringBuilder的char[] value数组,因此存放在堆中。装箱是将基本数据类型转为对应的包装类对象的过程,可以直接通过赋值或者方法调用。拆箱是将包装类对象转为基本数据类型的过程,它可以直接通过赋值或者方法调用完成。一个可变的字符序列。
2023-10-08 08:07:24
124
原创 Java-Exception
当程序中出现了某些“错误”,但该类错误信息并没有在Throwable子类中描述处理,这个时候可以自定义异常类,用于描述该错误信息自定义异常步骤自定义异常类;如果继承Exception,属于编译类型异常;如果继承RuntimeException,属于运行时异常(通过继承RuntimeException)super();通过自定义异常类提供多个构造函数,以便能够传递异常消息和可能的原因(Throwable这样可以让您的异常提供更多信息,以便于调试和理解问题。
2023-10-08 08:03:08
317
原创 Java-Annotation(注解)
Java注解(Annotation)是Java编程语言中的一个重要特性,它们提供了一种在源代码中添加元数据信息的方式,以便在编译、运行时或工具处理时使用。本文将深入探讨Java注解的核心概念和用途。
2023-10-08 08:01:36
146
原创 排序算法-选择排序(Java)
选择排序 (selection sort)的工作原理非常直接:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序区间的末尾。
2023-08-28 21:54:10
601
原创 图的基本操作(C语言)
图的基本操作图无向图编译器:VS Code语言:C语言图无向图算法思想:待更新。。。/*算法思想*/#include<stdio.h>#include<stdlib.h>#include<string.h>#define maxvertnum 100 //最大的顶点个数typedef enum{DG,UDG,DN,UDN} graghkind; //图的类型(保存的是常量)typedef struct{ int adj;
2021-12-11 23:10:12
2785
原创 数组-稀疏矩阵的基本操作(C语言)
稀疏矩阵的基本操作数组稀疏矩阵代码结果编译器:VS Code语言:C语言数组稀疏矩阵稀疏矩阵的基本操作主要有:创建稀疏矩阵、还原稀疏矩阵、复制稀疏矩阵、销毁稀疏矩阵、稀疏矩阵的转置。。。代码#include<stdio.h>#include<stdlib.h>#define maxsize 100//Ternary structuretypedef struct { int i,j; //line,colums int v; //non-ze
2021-12-09 13:24:43
1639
原创 打开 截图和草图 应用,点击新建,提示 “需要使用新应用以打开此ms-screenclip链接”
问题:当打开”截图和草图“应用时,点击新建,提示 “需要使用新应用以打开此ms-screenclip链接”。解决办法:cmd管理员模式输入:*DISM /Online /Add-Capability/CapabilityName:Windows.Client.ShellComponents~~~~0.0.1.0*等待几分钟下载完成即可。...
2021-12-07 11:17:49
9229
7
原创 线性表及其应用 (C语言)
线性表及其应用实验内容实验一实验内容实验一根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作:① 查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。② 删除:输入一个欲删除的整数e ,若存在则在单链表中删除第一个值为e 的元素。③ 插入:输入一个欲插入位置i 和欲插入元素e,将e 插入到第i 个整数之前(注意i 的合法性)。```#include <stdio.h>#include <stdlib.h>
2021-12-05 21:39:07
542
原创 《机器学习实战》 K-近邻算法(第2章)
运行平台: WindowsPython版本: Python3.9IDE: VS code文章目录前言2.1 K-近邻算法概述前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的K-近邻算法(KNN)。提示:以下是本篇文章正文内容,下面案例可供参考2.1 K-近邻算法概述优点:精度高、对异常值不敏感、无数据输入假定缺点:计算复杂度高、空间复杂度高使用数据范围:数值型、标称型 它的工作原理是:存在一个样本数据集合,也称.
2021-09-16 11:38:24
307
原创 《机器学习实战》机器学习概述
标题机器学习的简单概述例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有太大的作用,然而当某几个特定的单词同时出现时,再辅以考察邮件长度及其它因素,人们就课更准确地判定该邮件是否位垃圾邮件。 简单地说,机器学习是把无序的数 换成有用的信息 。表1-1是我们用区不同类需用的个不同鸟类需要使用的四个不同的属性值,我们选用体重、翼展、有脚蹼、背后颜色为评测基准 。现实中,可能会测量多的值 。通常的做法是测量所有 可测属性, 而后再挑选出重要部分。 下面测量的这四种值称之为特征,也可以称作属性, 但本书一律将
2021-09-15 22:52:16
610
原创 python递归求阶层
#python递归求阶层#求阶层def add(n): if n > 0: return n*add(n-1) else: return 1n=int(input("请输入要求的阶层:"))print(add(n))码片请输入要求的阶层:9362880
2021-04-14 16:08:32
824
原创 指针访问数组的几种方法
#指针访问数组的几种方法地址法、指针变量法、指针变量下标法#include<stdio.h>int main(){ int a[5], i, * p; p = a; printf("enter five numbers\n"); for(i=0;i<5;i++) { scanf_s("%d", &a[i]); } for (i = 0; i < 5; i++) { printf("%3d", *(a + i)); /*地址法*/ }
2021-02-03 11:20:58
2447
原创 手把手教你解决ssh无法连接树莓派3b的问题(没有显示器)
废话不多,直接上步骤1、在boot目录中,cmdline.txt中添加ip=192.168.137.2地址2、设置有线网卡3、设置以太网的ip=192.168.137.1地址(如果出现一下问题,不慌!点设置,重启电脑,再将以太网的ip地址设置为192.168.137.1就可以了)4、建立ssh空文件,因为当前树莓派3b默认没开启ssh服务,需要在boot目录下新建5、再新建一个空文件wpa_supplicant.conf ,添加下面的代码country=CNctrl_inter
2021-01-23 17:18:45
3886
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人