自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Tomcat的多线程通讯机制

Acceptor 与 Poller 分离:Acceptor 只负责接客,Poller 只负责看门(Selector),各司其职,避免了阻塞。利用线程池:不必为每个请求都创建新线程(创建线程开销大),而是复用线程池,极大提高了并发性能。Java NIO:利用Selector机制,一个线程可以管理成千上万个连接,这是 BIO(阻塞 IO,一个连接占一个线程)做不到的。

2026-03-05 16:11:43 377

原创 es和MySQL的数据同步和一致性对于redis和MySQL的缓存一致性异同点

Redis 侧更敢于“多删一点、频繁更新”;ES 侧则更倾向于减少更新频率,容忍更大延迟。ES 一致性问题的影响范围更广,不仅是“读不到最新值”,还会影响“统计报表、搜索排序”等。ES 的不一致“更难修”,因此更强调同步链路的可靠性(MQ 可靠性、监控告警)。ES 这边多了一层“搜索引擎自身的延迟”,这对“搜索实时性”的要求有直接影响。

2026-02-26 20:11:52 828

原创 rabbitMQ整理

官方 tutorials 里把常用模式分成:Hello World、Work Queues、Publish/Subscribe、Routing、Topics、RPC、Publisher Confirms 等几种。

2026-02-26 18:14:22 892 1

原创 nginx的集群搭建

通过复制主实例目录,快速创建两个子实例(nginx-8081、nginx-8082),并修改配置避免端口和 PID 冲突。设置的时间),再次访问,流量会重新分配给 8081。,用户完全感知不到 8081 已经宕机,服务不中断。我们将先编译安装一个主实例,作为后续克隆的模板。为了避免使用 root 运行服务,提升安全性。进入源码目录,指定安装路径和常用模块。命令批量修改端口和 PID 文件。此时请求应该全部自动转发给存活的。

2026-02-26 17:33:46 313

原创 RabbitMQ知识点

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),RabbitMQ服务器是用Erlang语言编写的1.点对点(简单)的队列2.工作(公平性)队列模式3.发布订阅模式4.路由模式Routing5.通配符模式Topics6.RPC。

2026-02-08 14:14:30 986

原创 Redis数据类型的底层实现和数据持久化

Redis 在 ZSet 中同时使用了这两种结构(封装在zsetHashtable: 存储的映射。保证了ZSCORE命令原本 $O(1)$ 的时间复杂度。Skiplist: 存储有序的节点。跳表是一种典型的 "空间换时间" 结构,通过维护多层索引,实现 $O(\log N)$ 的范围查询(如ZRANGE为什么不用红黑树?跳表实现更简单,且在并发环境下(虽然 Redis 是单线程,但设计思路上)区间查找效率通常优于平衡树。

2026-02-07 21:13:41 641

原创 限流、熔断、降级

对单位时间内进入系统 / 接口的请求数量、并发数做硬性阈值限制,超额请求直接拦截或排队,从入口端控制流量规模。当下游依赖(Redis、MySQL、微服务)出现持续超时、错误率飙升、失败次数超标时,临时切断对该下游的调用链路,避免无效请求堆积拖垮上游,类似电路保险丝的「过载断开」机制。系统压力过载或依赖故障时,主动关闭非核心功能、返回预设兜底数据、简化业务逻辑,牺牲非核心体验,释放资源保障核心业务可用。

2026-02-05 17:48:36 792

原创 Redis与MySQL回写中的数据类型存储设计

在 Redis 与 MySQL 数据回写场景中,Redis 核心定位是缓存 / 高效存储层,MySQL 是持久化存储层,数据回写通常是「Redis 更新→同步 / 异步更新 MySQL」或「MySQL 更新→刷新 Redis」。KV 设计需遵循 3 个通用原则:1. 键名(Key):采用「命名空间:业务模块:关联主键:标识」格式,小写 + 下划线,保证唯一性、可读性、可扩展性(如app:user:id:1001)。

2026-02-05 15:32:28 844

原创 SSM 配置 index 页面的实现方式

配置pom文件web.xml配置文件配置完成Tomcat容器,直接启动项目。

2026-01-26 00:06:33 93 1

原创 Redis相关知识点

redis中没有使用C语言的字符串表示,而是自定义一个数据结构叫SDS(simple dynamic string)即简单动态字符串。打开下载的redis源码包,找到src下的sds.h文件查看sds源码c语言对字符串的存储是使用字符数组,遇到'\0'字符则认为字符串结束,redis的字符串可以存储任何类型的数据,因为任何类型数据都可以表示成二进制,sds结构中的char buf[]就是存储了二进制数据。redis的字符串是二进制安全的,什么是二进制安全?简单理解就是存入什么数据取出的还是什么数据。

2026-01-24 01:41:44 539

原创 Docker Compose容器化部署

MySQL 配置[mysqld][client][mysql]Redis 配置# 绑定地址(容器内无需绑定宿主机IP,注释掉)protected-mode no # 容器网络下关闭保护模式port 6379requirepass "你的Redis密码" # 设置密码,必加!# 开启RDB持久化(默认)save 900 1dir /data# 开启AOF持久化(可选,更高可靠性)Nginx 配置(nginx.conf)# main全局块user nginx;

2026-01-22 23:57:00 405

原创 云服务器部署项目

法律文书生成与案例智能检索系统使用了ElasticSearch、Redis、MySQL、kkFileView。因此需要将这些组件在云服务器启动并配置到项目中。保证项目可以正确部署。

2026-01-22 17:03:46 48

原创 多线程与并发-知识总结2

专门用于存储线程的变量副本。3、

2026-01-17 20:09:43 593

原创 多线程与并发-高频面试题

2026-01-17 09:03:02 41

原创 多线程与并发-知识总结1

1.1、start()方法:用于创建并启动一个新的独立子线程调用时,JVM 会为该 Thread 实例分配新的线程资源(脱离当前调用线程),将线程状态置为,等待 CPU 调度执行。新线程的执行逻辑由方法定义,但不会直接调用,而是由 JVM 在新线程中自动触发方法的执行。此时,程序会存在两个并发执行的线程:当前调用的线程(如主线程)、新创建的子线程。1.2、run()方法:只是一个普通的实例方法,不具备创建新线程的能力调用时,不会创建任何新线程,其方法体中的代码会在当前调用线程中同步执行,不会产生多线程并发的

2026-01-14 16:08:15 549

原创 JVM-G1、老年对象/大对象进入老年代、finalize

finalize是 Java 编程语言中用于对象销毁前回调的一个特定方法。它定义在类中,因此所有的 Java 类都默认拥有该方法。。当垃圾回收器(GC)确定一个对象不再被任何活动对象引用(即判断为垃圾)时,在回收该对象内存之前,GC 会自动调用该对象的finalize方法。JVM 保证对于任意一个对象,其finalize方法最多只会被调用一次。

2026-01-10 16:38:29 481

原创 JVM-finalize()方法

,并加入了FinalizerThread的执行队列,这意味着对象又变为可达对象,因此阻止了对象的正常回收。由于在引用队列中的元素排队执行finalize()方法,一旦出现性能问题,将导致这些垃圾对象长时间堆积在内存中,可能会导致OOM异常。2、finalize()函数的执行时间是没有保障的,它完全由GC线程决定,极端情况下,若不发生GC,则finalize()将没有机会执行;finalizee是要回收的对象,比如,在后续的示例中就为LongFinalize$LF。正式回收对象前,这类对象会被封装为。

2026-01-10 13:59:49 371

原创 JVM-类加载子系统

1、定义:类加载子系统是JVM负责加载、验证、准备、解析和初始化字节码(.class文件)的核心模块;2、核心产出:内存中的对象(存储在方法区),该对象是程序访问类元数据的唯一入口;3、加载的是“类”而非“对象”,采用“按需加载”机制,避免启动时内存过载。1、定义:类加载器加载类时的优先级规则,“父子”为组合关系而非继承;2、核心流程:1) 类加载器收到加载请求,先委派给父加载器;2) 父加载器继续向上委派,直至启动类加载器;3) 顶层加载器尝试加载,成功则返回Class对象;

2026-01-09 18:19:31 869

原创 JVM-垃圾回收器

垃圾回收算法是垃圾回收的方法论,垃圾收集器是垃圾回收算法的具体实现Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同厂商、不同版本的虚拟机所提供的垃圾收集器都有可能有很大差别目前为止,还没有完美的收集器出现,Java的应用场景很多,没有万能的收集器能解决所有应用场景,只是针对具体应用选择最合适的收集器,进行分代收集。1.Serial(年轻代) + Serial Old(老年代)2.Parallel Scavenge(年轻代) + Parallel Old(老年代)

2026-01-08 14:58:05 989

原创 JVM-垃圾回收算法

垃圾回收的基本思想是考察每一个对象的可触及性,即从根节点开始是否可以访问到这个对象,如果可以,则说明当前对象正在被使用,如果从所有的根节点都无法访问到某个对象,说明对象已经不再使用了,一般来说,此对象需要被回收。

2026-01-06 14:17:36 685

原创 SpringBoot项目部署

4.2.1打开/usr/share/nginx/html,将dist文件夹的内容逐个复制到其中。编写代理文件/etc/nginx/conf.d/ruoyi-vue.conf。查看日志,表明启动成功之后,访问公网IP地址进行效果查看。查看初始密码并登录mysql。4.2.2写入反向代理文件。

2026-01-03 14:24:26 431

原创 JVM逃逸分析与标量替换

如果逃逸分析判定一个聚合量对象没有逃逸,JVM 会将这个对象 “拆解” 成它的各个标量字段,直接在栈上分配这些标量,而不是在堆上创建整个对象 —— 这个过程就是标量替换。

2025-12-31 10:18:50 757

原创 JVM-槽位复用

槽位是局部变量表的最小存储单元,也是JVM为局部变量分配内存的基本单位。

2025-12-30 23:31:16 427

原创 JVM经典面试题

CMS 是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“- XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。CMS 使用的是标记-清除的算法实现的, 所以在GC的时候回产生大量的内存碎 片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。在介绍。

2025-12-30 00:01:59 698 1

原创 Java面试题-JVM

JVM 本质是一台 “虚拟的计算机”,核心作用是运行 Java 字节码(.class 文件),屏蔽不同操作系统的底层差异,实现 “一次编写,到处运行”。负责将磁盘上的.class字节码文件加载到 JVM 的运行时数据区中,是 JVM 执行代码的 “前置准备环节”。.classClassstatic{}:遵循 “双亲委派模型”,保证类加载的安全性(避免核心类被篡改)。这是 JVM 最核心的内存区域,所有运行时的数据都存储在这里,分为和两类。undefined。

2025-12-29 23:14:59 744

原创 Map集合的比较

1.: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!2.: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被 淘汰,不要在代码中使用它;3.: HashMap 中,null 可以作为键,这样的键只有一个,可以有一 个或多个键所对应的值为 null。

2025-12-28 22:13:47 662

原创 双栈实现队列以及双队列实现栈

栈是 后进先出(LIFO),队列是 先进先出(FIFO)

2025-12-28 21:45:10 953

原创 Collections和Arrays工具类整理

2.1、工具类的设计目标是提供静态方法,无需创建实例;2.2、源码层面:构造方法被声明为 且抛出异常,防止通过反射实例化;2.3、符合 Java 工具类的设计规范(如 类同理)

2025-12-27 17:57:21 208

原创 Java面试题2-集合

集合的体系。

2025-12-27 17:44:07 355

原创 HashMap整理

HashMap是Java.util包下的一个实现了Map接口的哈希表实现类,用于存储键值对(Key-Value)映射关系。它的核心特点是通过哈希函数将键(Key)映射到对应的存储位置,从而实现O(1)级别的平均查找和插入效率(最坏情况下为O(n),后续版本通过优化已大幅改善)。存储无序性:不保证键值对的插入顺序和遍历顺序一致;HashMap的键具有唯一性,但是值无唯一性限制允许一个null键和多个null值:但键只能有一个null(因为键唯一),值可以有多个null;非线程安全。

2025-12-27 17:12:25 948

原创 禁用TransationManager

TransactionManager 是 Java 中的一种接口,它定义了事务的基本管理操作,包括事务的开始、提交、回滚等。它提供了直接控制事务的能力,让开发者能够精确控制事务的生命周期。虽然 TransactionManager 能够在一些简单场景下实现事务控制,但它并不具备高级事务功能,因此在复杂的应用中,直接使用 TransactionManager 往往会导致很多问题。

2025-12-27 13:02:50 860

原创 Java面试题1-Java基础

封装是将数据(属性)和行为(方法)包装在一个类中,并通过对数据的访问权限进行控制,隐藏对象的内部实现细节。继承是面向对象的一种机制,允许一个类(子类)基于另一个类(父类)来构建,获得父类的属性和方法。多态是指同一操作作用于不同的对象,可以有不同的执行结果。主要有两种形式:编译时多态(重载)和运行时多态(重写+向上转型)。01.定义abstract是面向对象编程中的关键字,用于声明抽象类和抽象方法抽象类:用abstract修饰的类,不能被实例化抽象方法:用abstract修饰的方法,只有声明没有实现。

2025-12-26 16:29:00 955

原创 128陷阱,==与equals区别

128陷阱,本质是Java中Integer包装类的缓存机制导致的“==比较异常”现象:当使用自动装箱(将int基本类型转为Integer包装类)创建Integer对象时,若数值在-128~127范围内,Java会直接复用缓存池中的已有对象;若超出该范围,则会创建新的Integer对象。由于==运算符对于引用类型比较的是“对象内存地址”而非“数值”,就会出现:同数值的Integer对象,在-128~127范围内用==比较为true,超出范围则为false的“陷阱”。

2025-12-25 11:04:58 647

原创 从lastIndexOf和split看病毒文件防御

特性split性能更高较低(需要创建数组)内存使用更少更多处理空文件更好(返回"")可能返回"hiddenfile"代码可读性更直观稍复杂推荐使用lastIndexOf,因为它更高效且对于特殊文件名处理更一致。

2025-12-22 11:03:42 303

原创 MySQL不同版本对于max_allowed_packet 参数的差异

MySQL 的 max_allowed_packet 参数用于控制服务器和客户端之间单个数据包的最大大小(包括查询、结果集、BLOB 数据等)。配置语法和位置没有本质区别(均为 [mysqld] 下设置数值,支持 K/M/G 单位,如 64M 或 67108864)。修改后需重启 MySQL 服务生效。

2025-12-12 16:18:56 351

原创 SpringMVC和SSM的执行流程

SSM 整合的实现流程可从配置与容器协同的角度系统梳理:首先,通过 web.xml 配置作为入口,注册 SpringMVC 的核心 DispatcherServlet,指定其加载 springmvc.xml 配置文件以初始化 MVC 容器,同时配置 ContextLoaderListener 加载 applicationContext.xml 来初始化 Spring 根容器,实现 Web 层与业务层容器的分离与协同,此外还配置字符编码过滤器解决请求编码问题;

2025-11-29 22:26:15 674

原创 XML文件解读

等核心 Bean 配置标签的 XML 词汇表,作用是让 XML 解析器校验这些核心 Bean 配置标签的语法合法性,并识别其对应的 Spring 核心 Bean 配置语义。用来约束此配置文件中所有的配置内容都是以beans为基础,spring的核心命名空间。这个命名空间是约束spring的核心,声明后才能在 XML 配置中使用以。这个命名空间是约束声明式事务的,声明后才能在 XML 配置中使用以。这是xml编写的一个约束,这是xml文件编写所遵循的一个规范。这是对于3命名空间的具体指向,与上面相对应。

2025-11-29 21:26:23 309

原创 乐观锁和悲观锁

悲观锁 “宁可信其有”,通过加锁保证强一致性,适合高冲突、核心业务;乐观锁 “宁可信其无”,通过校验保证最终一致性,适合低冲突、非核心业务。悲观锁通过加锁,确保小李和小王串行操作,数据绝对一致;乐观锁通过版本号校验,允许并行读取,冲突时重试,兼顾性能和一致性。在实际开发和面试中,不仅要掌握两种锁的实现方式,更要理解其设计思想和适用场景 —— 这才是解决并发问题的核心。希望本文能帮助你彻底吃透乐观锁与悲观锁,从容应对面试和工作中的各类并发场景!

2025-11-29 12:40:22 1037

原创 JDK1.8新增语法

摘要:JDK1.8是Java的重大更新,核心特性包括:1)Lambda表达式简化函数式编程;2)函数式接口与内置接口(Consumer/Supplier等);3)方法引用语法糖;4)接口默认/静态方法;5)Stream API实现流式集合处理;6)Optional类解决空指针;7)新日期时间API(LocalDateTime等);8)重复注解、类型注解等辅助特性。这些改进显著提升了代码简洁性、可读性和功能性,使Java支持现代编程范式。

2025-11-29 10:20:58 928

原创 K8S整理

一句话总结: Kubernetes = 集群级的容器编排与管理系统。

2025-11-26 15:08:31 2028

空空如也

空空如也

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

TA关注的人

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