自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 收藏
  • 关注

原创 Redis的数据类型

小数据量用紧凑结构(ziplist/intset)省内存,大数据量用高性能结构(hashtable/quicklist/skiplist)保速度。核心优化思路:平衡 “内存占用” 和 “操作性能”,避免单一结构的缺点(比如链表省性能但费内存,压缩列表省内存但改得慢)。关键底层结构:SDS(String)、ziplist(小数据通用)、quicklist(List)、intset(Set 整数场景)、hashtable(Hash/Set/ZSet 通用)、skiplist(ZSet 核心)。

2026-02-07 16:27:14 578

原创 ReentrantReadWriteLock(读写锁)

是JUC()提供的读写分离锁,核心设计初衷是:让“读操作”共享,“写操作”独占,在不牺牲线程安全的前提下,最大化读多写少场景的并发效率。读锁(共享锁):多人可同时看书,只要没人整理书架(写锁);写锁(独占锁):只有一个人能整理书架,整理时所有人(读/写)都不能操作。// 移位量:把读锁计数移到高16位// 读锁的“单位值”:1 << 16 = 65536(高16位加1,相当于整体加65536)// 读锁最大数量:65535(高16位最多存65535个读线程)

2026-02-03 13:11:39 651

原创 Redis主从复制和集群搭建

主从复制:核心是「读写分离+数据备份」,从库同步主库数据,主写从读,提升并发;哨兵模式:核心是「主库故障自动切换」,解决主从复制的“主库宕机无主”问题,保证高可用;Redis集群:核心是「分片存储+分布式高可用」,解决单节点容量/性能瓶颈,数据按哈希槽分散到多个主节点,每个主节点有从节点容错。三个功能的递进关系:主从复制(基础)→ 哨兵模式(主从的高可用增强)→ 集群(大规模场景的分布式解决方案)。

2026-02-01 21:10:24 642

原创 SpringBoot整合SpringMVC(末)

过滤器:Servlet层面的全局拦截,管所有请求,适合做“粗粒度”的统一处理(如编码、全局登录校验);拦截器:Spring MVC层面的精准拦截,只管业务接口,适合做“细粒度”的业务逻辑(如接口耗时、权限校验);监听器:事件驱动的观察者,不干预请求流程,适合做初始化、统计、资源清理等被动操作。实际开发中,三者常配合使用:Filter做全局编码/跨域 → Interceptor做接口权限/耗时 → Listener做应用初始化/在线人数统计。核心配置:将打包方式改为war。

2026-02-01 17:32:54 679

原创 ReentrantLock(重入锁)基于AQS的源码实现

由父类声明(可以是抽象方法、空实现方法,甚至带默认实现的方法);父类的“模板方法”会调用这些钩子方法,但不关心钩子方法的具体实现;子类通过重写钩子方法,实现自己的业务逻辑,从而“钩入”父类的固定流程中。钩子方法的核心:父类定“流程骨架”,子类通过重写钩子方法定制“流程中的细节”,是模板方法模式的核心;AQS中的典型应用tryAcquiretryRelease是钩子方法,acquirerelease是模板方法,ReentrantLock通过重写钩子方法实现公平/非公平锁;本质价值。

2026-01-31 14:44:54 564

原创 【Redis持久化核心】AOF/RDB通俗详解+多场景对比

RDB是快照式持久化,Redis会在指定的时间条件下,将当前内存中的所有数据以二进制压缩格式生成一个单一的RDB文件,恢复时直接加载这个文件到内存即可。AOF是日志式持久化,Redis会把所有对数据的写命令(set/hset/del等)按执行顺序以明文文本格式追加到AOF文件中,恢复时通过“重放”这些命令重建内存数据。特性RDB文件AOF文件格式二进制压缩明文文本(Redis协议)体积极小较大(重写后会变小)可读性人类完全看不懂人类能看懂、可手动修改记录内容某一时刻的全量数据。

2026-01-30 16:06:09 575

原创 启动多个redis进程

启动Redis只需要(启动程序,可执行文件)和(配置模板,随便一个可用的就行),用Linux的find命令全网查找,直接复制命令,找到后记好路径即可,不用管它们在原目录的哪个位置。把查到的两个路径记下来,后续全程只用这两个路径,。

2026-01-30 12:17:39 311

原创 欢迎页配置

若需要将欢迎页放在非默认路径(如),或不想使用index.html作为欢迎页,可关闭SpringBoot的默认欢迎页自动配置SSM框架:静态欢迎页用web.xml的(最简),动态欢迎页用的(无需Controller)或编写Controller映射;必须记得放行静态资源。SpringBoot框架90%场景用静态欢迎页,直接将index.html放在下,无需任何配置,立即生效;动态欢迎页推荐用Thymeleaf,编写简单的Controller即可传参。两者均遵循Controller映射优先级最高。

2026-01-26 18:05:27 639

原创 SpringBoot整合SpringMVC(下)

如果 Controller 不在启动类的包下,只需在启动类加@ComponentScan("com.xxx") // 扫描com.xxx下所有组件如果你的项目用 JSP/Thymeleaf,直接在# 配置JSP视图解析器# 配置Thymeleaf(SpringBoot推荐,无需配后缀)直接在# 单个文件最大上传大小(比如改50MB)# 单次请求所有文件的总大小(比如改100MB)# 关闭文件上传限制(慎用)

2026-01-26 15:52:36 610

原创 SpringBoot整合SpringMVC(上)

如果觉得 4 个默认文件夹不好用,想把静态资源放在自己命名的文件夹里(比如),只需要在配置文件里加一行配置,不用改源码,这就是 SpringBoot 的灵活之处。打开(默认是空的);加一行配置,指定自定义的静态资源文件夹:# 自定义静态资源路径,classpath:/my-static/ 就是src/main/resources/my-static/建文件夹,放一个custom.jpg图片;重启项目,访问,能看到图片就成功。注意:自定义路径后,默认的 4 个文件夹会失效。

2026-01-25 17:36:48 568 1

原创 多环境配置

profileprofile就是SpringBoot为多环境配置设计的「环境标签」,可以把不同环境(开发、测试、生产)的配置分开管理,给每套配置打一个标签(比如devtestprod),启动项目时指定要使用的标签,SpringBoot就会自动加载对应标签的配置,实现环境配置隔离。profile就是给配置文件「分组」,开发用dev组、测试用test组、生产用prod组,互不干扰,不用手动改配置文件。先通过最简示例掌握核心用法,后续的加载位置/优先级都是基于这个基础展开,示例用yml格式。

2026-01-24 17:49:52 918

原创 配置文件的占位符

SpringBoot的配置文件()里,占位符就是用${变量名}格式留的「空位置」,程序启动时,Spring会自动把这个「空位置」替换成实际的有效值。配置文件里的填空题${}是填空题的空框,运行时Spring会自动给这个空框填正确的答案。/*** 批量绑定app开头的配置(前缀为app)* @Component:把这个类交给Spring管理* @ConfigurationProperties(prefix = "app"):绑定配置中以app为前缀的所有项*/@Component。

2026-01-24 17:39:48 800

原创 @PropertySource、@ImportResource、@Bean

专门让Spring加载默认配置文件以外的自定义.properties文件,把文件里的key=value加载到Spring的环境变量中,后续可以通过@Value或取值使用。在resources目录下新建# 自定义业务配置my.user.name=张三my.user.desc=这是自定义配置文件的内容新建// 普通类,无任何注解(因为Bean由xml定义)我是xml配置的Bean";在Controller中注入// 注入xml中定义的Bean@Autowired把加载的自定义配置,动态设置到。

2026-01-24 17:34:26 1005

原创 Redis入门(1)

NoSQL = Not Only SQL(不只是 SQL),是一类非关系型数据库的总称。关系型数据库(MySQL):适合结构化数据、复杂查询(联表)、事务一致性,但高并发、大数据量场景下性能拉胯(比如百万用户同时访问的电商网站)NoSQL 数据库:适合非结构化/半结构化数据、高并发读写、海量数据存储,特点是高性能、高可用、可扩展主节点(master):写入数据,同步数据到从节点从节点(slave):只读数据,从主节点同步数据作用:数据备份:从节点是主节点的副本,防止主节点数据丢失。

2026-01-24 16:06:32 578

原创 Java并发包atomic原子操作类

原子操作:指不可分割的操作,一个操作要么全部执行成功,要么全部不执行,不存在任何中间状态。可以通俗理解为:操作是“一次性”的,不会被线程调度器打断,多线程下不会出现“操作做了一半”的情况。线程1准备对变量V执行CAS操作,预期值为A;在线程1执行CAS之前,线程2先将V从A→B→A(先改B再改回A);线程1执行CAS时,发现V的值还是A,误以为V从未被修改过,于是成功执行CAS,导致数据一致性问题。

2026-01-24 15:44:42 1048

原创 CAS入门

CAS的核心思想:乐观锁,先尝试“比较+交换”更新值,失败就自旋重试,由CPU指令保证原子性,比synchronized更高效;CAS的三要素:内存值V、预期值A、新值B,只有V==A时才更新为B;Java中的实现:通过Unsafe类的native方法调用CPU的cmpxchg指令,AtomicInteger/AtomicLong等并发类都是基于CAS实现;关键问题:ABA问题(用版本号解决)、自旋开销(用分段/限制自旋次数解决)、只能操作单个变量(用原子引用/加锁解决)。

2026-01-22 10:27:39 747

原创 单例模式入门

这种实现方式几乎没有缺点,它兼顾了“延迟加载、线程安全、高性能、代码简洁”四大核心优势,是实际开发中最推荐、最常用的单例模式实现方式,没有之一。

2026-01-20 09:09:53 728

原创 Java volatile关键字

在Java并发编程中,共享变量的同步问题是绕不开的核心难点。作为重量级同步机制,虽然能解决大部分并发问题,但会带来线程上下文切换和调度的性能损耗。而volatile作为Java提供的轻量级同步机制,以其极低的性能开销,在特定场景下成为并发编程的优选。但volatile的使用门槛更高,稍不注意就会因理解不透彻导致并发bug。

2026-01-20 08:53:47 646

原创 SSM项目的部署

操作命令/路径项目打包Tomcat 目录Web 应用目录启动 Tomcat停止 Tomcat查看日志查端口占用Maven 父工程->获取产物-> 拿到admin.warapi.warmobile.war上传-> 全部扔进服务器配置内存->(增加 Heap 和 Metaspace)启动->startup.sh访问->服务器 (Linux)├── 数据库 (MySQL 3306)│├── 进程 1: Tomcat-Admin│ ├── 路径: /usr/local/tomcat-admin。

2026-01-18 20:57:25 890

原创 SpringBoot配置文件(1)

什么时候用哪个?使用如果...你需要注入一组相关的属性(例如:自定义线程池配置、第三方 SDK 的 Key/Secret/Url)。你需要注入复杂数据结构(List, Map, 嵌套对象)。你需要配置文件的 key 命名灵活(松散绑定)。你需要对配置进行校验(如@NotNull@Max这是编写自定义 Starter 或标准业务模块的首选。使用@Value如果...你只需要在某个具体的业务逻辑中,获取这一两个简单的配置项(如:开启某个功能的开关你需要使用 SpEL 表达式进行动态计算。

2026-01-18 20:13:57 1006

原创 SpringBoot的热部署

热部署是指在应用程序正在运行的状态下,直接更新应用程序的代码或资源文件,而无需停止并重新启动整个服务器或应用程序进程。其核心目的是减少开发过程中的等待时间。通常,修改代码后需要重启服务才能生效,这包含停止服务、重新编译、重新加载类、重新初始化上下文等一系列耗时步骤。热部署通过特定的技术手段,使得修改后的逻辑能够立即或极快地在运行中的程序里生效。模板热部署:只解决页面刷新问题,通过关闭缓存实现。Debug 模式:利用 JVM 原生能力,只支持修改方法体内部代码。

2026-01-18 10:10:56 606

原创 SpringBoot自动装配原理入门

自定义 Bean 优先级更高:自动配置类中的注解确保,当用户手动定义了相同类型的 Bean 时,自动配置的 Bean 会失效,即「用户自定义配置覆盖默认自动配置」,满足个性化需求。starter 封装版本依赖:自动配置的基础是 SpringBoot 的 starter 依赖,starter 已封装了对应技术栈的兼容版本,用户引入对应 starter(如)即可,无需手动管理依赖版本,避免版本冲突。配置属性兜底。

2026-01-18 09:31:37 837

原创 Thread.sleep() 方法详解

这是一种使线程进入“非活动”或“等待”状态的直接方式,是 Java 并发编程中用于控制线程执行时序的基本工具之一。:在某些简单的条件等待场景,如果条件不满足,线程可以短暂睡眠后再次检查,以避免紧密循环(busy-waiting)导致的 CPU 空转。:如果一个线程在持有锁的情况下进入睡眠,其他试图获取该锁的线程将被阻塞,直到睡眠线程醒来并最终释放锁。:方法接受一个以毫秒为单位的时长参数(以及一个可选的纳秒参数),用于定义线程暂停执行的最小时间。期间,若其他线程调用了该线程的。,而非进行线程间的同步或通信。

2026-01-17 13:55:52 824

原创 Java中断

在Java并发编程中,启动一个线程很容易,但优雅地停止一个线程却往往被忽视。很多开发者习惯使用标志位,或者粗暴地吞掉。

2026-01-15 19:12:22 560

原创 Java多线程(1)

本文系统介绍了Java多线程编程的核心概念。首先阐述了进程和线程的定义:进程是操作系统资源分配的基本单位,线程是CPU调度的最小单位。然后详细讲解了两种实现多线程的方式:继承Thread类和实现Runnable接口,并比较了它们在资源共享、扩展性、线程池适配等方面的差异。接着分析了线程的6种生命周期状态及其转换条件。最后通过售票系统案例,演示了synchronized同步代码块和同步方法两种锁机制的应用场景,并对比了它们的特点。文章还介绍了基于Callable和FutureTask的第三种多线程实现方式,以

2026-01-15 08:45:41 846

原创 Java——注解和反射

比老式的用得多得多。分别用于查询和提交/修改。: 写 API 必用。它等于,表示直接返回 JSON 数据而不是 HTML 页面。场景关键注解 (按频率排序)一句话说明偷懒神器@Data@Builder@Slf4j省去 Getter/Set, 构造器, 日志定义写接口定义 URL 路径和返回 JSON接参数接 JSON Body 和 URL 路径参数拼装代码@Autowired@Service注入依赖,定义业务逻辑查数据库@Mapper定义 DAO 层,保证事务一致性读配置@Value。

2026-01-14 09:42:38 1023

原创 Maven项目变成SpringBoot项目

办法二:将maven项目变成SpringBoot项目。首先得知道SpringBoot项目的完整目录结构。新版的IDEA已经不支持jdk1.8了。写pom文件,修改依赖(这一步是核心)办法1:将这里的网址换成阿里云的。但是不推荐,推荐下面的这种办法。阿里云的还支持jdk1.8。这里会有两个解决办法。

2026-01-13 16:08:44 145

原创 微服务架构入门

微服务架构并非某种特定的技术框架,而是一种架构风格(Architectural Style)。将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,并使用轻量级机制(通常是 HTTP Resource API)进行通信。这种架构风格强调由于业务能力(Business Capability)而划分服务边界,并可以通过全自动部署机制独立部署。

2026-01-13 15:21:06 611

原创 Java——static

staticstatic是Java语言中用于修饰类成员的关键字,其核心作用在于。当成员被声明为static时,它不再属于任何特定对象实例,而是直接归属于类本身。这种设计模式在Java内存管理中具有特殊意义:静态成员在方法区(Method Area),而非堆内存,这使得它们在程序启动时即被初始化,并在整个JVM生命周期内持续存在。从JVM内存模型角度看,static成员的初始化时机早于对象创建。当类被首次加载时,静态变量会按照声明顺序进行初始化,静态代码块会依次执行。

2026-01-13 10:31:05 847

原创 SpringBoot配置文件

若配置文件放在其他目录(如。

2026-01-13 08:19:13 833

原创 Java八股(1)

跨平台性不是让程序“更快”,而是让程序“写一次,能在多种操作系统上跑”,减少维护和移植成本C/C++语言都直接编译成针对特定平台机器码。如果要跨平台,需要使用相 应的编译器重新编译。Java 源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字 节码文件再解释成机器码运行。解释是通过 Java 虚拟机来执行的。字节码文件不面向任何具体平台,只面向虚拟机。Java 虚拟机是可运行 Java 字节码文件的虚拟计算机。不同平台的虚拟机是不同的,但它们都提供了相同的接口。

2026-01-12 16:03:29 626

原创 当我们运行一个Java程序时,是否每个Java程序都会分配一个独立的Java虚拟机(JVM)实例呢?

但这里有几种情况和细节需要理解。

2026-01-11 21:18:11 622

原创 JVM中的直接内存

使用直接内存的场景:大文件处理(>100MB的文件读写)高性能网络通信(Netty、gRPC等框架)内存映射文件(随机访问大文件)与本地库交互(需要共享内存)大数据处理(Spark、Flink等计算框架)高频I/O操作(数据库连接池、缓存系统)不使用直接内存的场景:小对象频繁创建(使用对象池或堆内存)简单的桌面应用(无需高性能I/O)内存受限环境(直接内存管理复杂)短期运行的程序(分配开销不划算)

2026-01-11 21:15:39 549

原创 String.intern() 方法

intern()将当前字符串对象的引用(或副本)存入字符串常量池,并返回字符串常量池中该字符串的引用。intern()是String类的 native 方法,核心作用是将字符串纳入常量池管理,保证唯一性。常量池已有对应字符串时,直接返回常量池引用;无对应字符串时(JDK 7+),存储堆对象引用并返回。必须接收intern()的返回值,才能获取常量池中的有效引用。适合大量重复字符串场景,可节省内存、提高比较效率。

2026-01-11 21:08:12 616

原创 对象何时进入老年代?

参数设置黄金法则应用类型年轻代比例Survivor比例晋升阈值特殊配置Web应用1/3 ~ 1/2增大(1:4)适当降低(6-10)关注会话对象大数据处理较小(1/4)默认提高(10-15)大对象阈值调大实时计算适中(40%)增大中等(8-12)避免担保失败编码注意事项避免创建过多短期大对象// 不好:每次循环都创建新的大数组// 1MB// 好:重用大对象合理控制集合大小// 指定初始容量,避免扩容。

2026-01-10 16:53:04 593

原创 方法finalize对垃圾回收器的影响

finalize()是Object类中一个受保护的方法,设计初衷是为对象提供一次“临终拯救”或释放非内存资源(如文件句柄、网络连接)的机会。try {// 清理非内存资源= null) {finalize()的设计初衷是好的——作为资源安全的最后保障。性能杀手:延迟回收,增加GC压力不确定性源:执行时机、顺序无保证维护噩梦:掩盖资源泄漏,调试困难Java内存管理的核心哲学是确定性。finalize()违背了这一哲学,引入了不确定的清理时机。// 过去(危险)@Override。

2026-01-10 16:41:13 807

原创 JVM——类加载机制

JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构,在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入口。类加载子系统是 JVM 的一个具体运行时模块(规范中明确存在)类的加载系统是对类加载机制整体的描述(更像是一个概念性说法,不是 JVM 内部的独立模块名称)类加载子系统 = JVM 内部真正干活的组件类的加载系统 = 类加载器体系 + 双亲委派 + 加载流程 这些机制的总称。

2026-01-09 16:48:39 879

原创 PyCharm2025.03使用教程(简单版)

自己去官网下载正版。

2026-01-09 15:43:55 312

原创 垃圾回收器(下)

G1(Garbage-First)是JVM中一种面向服务器端应用的垃圾回收器,自JDK 9起成为默认的垃圾回收器。它的设计目标是在可预测的停顿时间和高吞吐量之间取得平衡。

2026-01-08 22:02:14 966

原创 垃圾回收器(上)

这些参数本质上是JVM 用来标识不同代内存所采用的垃圾回收器实现新生代使用的是串行还是并行回收老年代使用的是串行还是并行回收JVM 更偏向于低资源消耗还是高吞吐量的回收策略串行收集器是Java虚拟机中最基础、历史最悠久的垃圾回收器。1. 单线程执行(Single-threaded)它在进行垃圾回收时,只会创建一个单独的回收线程去执行任务。并没有多个线程同时协作清理,也不会利用多核CPU的并行能力。所有的清理工作由这唯一的线程独立完成。2. 独占式暂停(Stop-The-World)

2026-01-08 14:34:15 544

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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