自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 消息队列——概念

消息队列三大核心作用解析:电商系统实战案例 摘要: 消息队列在分布式系统中发挥关键作用,主要体现在三大方面:1)解耦服务,订单服务通过消息队列异步通知库存和通知服务;2)异步处理,实现库存扣减与消息发送并行执行;3)流量削峰,应对秒杀场景的高并发请求。RocketMQ作为高性能消息中间件,支持发布/订阅模型,具有毫秒级延迟、高可用性和10亿级消息堆积能力。其核心组件包括Topic、MessageQueue和消费者组,通过消息确认机制保障可靠性,通过顺序消息和延迟消息满足特定业务场景。死信队列机制有效处理消费

2025-06-11 13:58:56 807

原创 Mybatis

TableField:指定。@TableName:指定。

2025-06-11 12:57:53 810

原创 Linux基本命令

进行文字输入,按ESC可回到命令模式。

2025-06-10 17:52:58 363

原创 IOC和AOP

代理类和目标类需要实现同一个接口,并重写InvokationHandler类的invoke方法来实现增强逻辑。最后通过Proxy类传入目标接口和反射处理器,调用newInstance方法生成代理对象,拦截方法调用进行增强。然后使用Enhancer类指定目标类为父类并指定对应的MethodInvokeHandler处理器,调用create方法生成代理对象,拦截方法调用进行增强。,需要实现MethodInvokeHandler接口,重写对应的invoke方法来实现增强逻辑,,按需求自动创建对象。

2025-06-10 16:29:45 319

原创 SpringCloud——微服务

为了预防某些功能出现负荷过载或响应慢的情况,在其内部暂时舍弃一些非核心接口和数据的请求,直接返回一个提前准备号的错误处理信息,这样虽然有损于服务,但保证了整个系统的稳定性和可用性。服务器压力剧增时,根据实际业务使用情况以及流量,对一些服务和页面有策略的不处理或使用简单方式处理,从而释放服务器资源以保证核心业务的正常高效运行。高峰期为保证核心功能服务的可用性,就需要对某些服务降级处理。,进而导致A的线程池满,最终导致全链路微服务的崩溃和不可用。所以当某个服务不可用或响应超时时,例如某服务链路为A—B—C,

2025-06-08 14:20:49 768

原创 SpringCloud——Nacos

Nacos实现微服务动态治理的核心功能及机制 摘要: Nacos作为服务治理平台,提供三大核心能力:服务注册与发现(支持动态实例注入)、配置集中管理(无需重启即时生效)及健康监测机制。服务健康检查采用双模式:旧版基于HTTP短连接(5秒心跳,30秒剔除),新版升级为gRPC长连接(3秒活跃检测,20秒超时剔除)。注册流程包含手动/自动两种方式,其中SpringCloud项目通过starter包可实现自动注册。实例分为临时(默认)与非临时两种类型,前者依赖心跳自动维护,后者需手动注销且持久化存储,分别适用于动

2025-06-05 23:05:29 447

原创 SpringCloud——OpenFeign

OpenFeign是基于Spring的声明式调用的HTTP客户端,大大简化了编写Web服务客户端的过程,用于快速构建http请求调用其他服务模块。同时也是spring cloud默认选择的服务通信工具。

2025-06-05 21:14:15 487

原创 虚拟机数据挂载映射

摘要:在云服务器部署Redis时,由于直接使用本地命令创建Docker容器并挂载,导致宿主机缺少配置文件而创建空目录,使配置失效。数据挂载需确保宿主机文件正确才能正常映射,否则可能因文件类型不同导致映射失败。此外,默认0.0.0.0绑定会将端口暴露给所有IP,存在安全隐患。正确做法是修改配置文件绑定127.0.0.1,并配合云服务器防火墙仅开放6379端口给特定IP,实现精确访问控制。该案例提醒部署时需注意配置文件路径和网络安全设置。

2025-05-29 19:24:13 248

原创 Java—多线程

/ 使用 volatile 保证可见性@Override// 处理任务逻辑// 停止线程的方法(由外部调用)

2025-05-28 22:01:46 733

原创 JVM—Java对象

JVM中的Java对象在堆内存中的存储分布可以分为三部分。

2025-05-23 14:40:25 430

原创 JVM——垃圾回收

单次STW时间更短但更频繁或允许用户线程和GC线程并发,对客户端交互的响应速度更快。(1mb~32mb,可通过-XX:GHeapRegionSize调整),并。单次STW时间更长,但次数少,适合计算量大且交互不多的场景。类似于ParNew回收器,但是使用Region。,旨在减少STW时间,适用于。(类似于深度搜索),

2025-05-23 13:45:00 1097

原创 JVM——内存模型

当Eden区满或Survivor区空间不足时,会触发Minor GC,回收Eden区中的垃圾对象,将年龄较大(超过15)的对象晋升到老年代中。不属于JVM运行时数据区的一部分,通过NIO类引入,是一种堆外内存,可显著提高IO性能。老年代空间不足时,会触发Major GC的CMS并发回收,并发回收失败则触发full GC。,可能会抛出StackOverflowError(栈过深,超出栈容量)和OOM异常。某些jvm实现(如G1垃圾收集器),为大对象分配了专门的区域。,在虚拟机启动时创建,,并增加它们的年龄。

2025-05-22 15:27:53 908

原创 Redis——缓存雪崩、击穿、穿透

业务线程处理用户请求时,如果发现访问的数据不在Redis里,则加入互斥锁,,若此时有大量请求,都会直接访问到数据库,导致数据库压力倍增甚至宕机。查询时,分别计算出数据N个哈希值对应的位置并判断是否全为1。缓存中的某个热点数据过期,此时大量请求直接访问到数据库。当前Redis宕机后依然可通过其他从节点获取缓存。发生缓冲雪崩或击穿时,数据库中是有对应数据的,而。但数据库中不存在的数据在布隆过滤器中就一定不存在。,而不是等待用户来触发缓存构建,这就是所谓的。,避免通过查询数据库来判断。,造成无响应的情况。

2025-05-17 21:14:22 712

原创 Redis——三大策略

Redis可以对key设置过期时间,因此需要有相应的机制将已过期的键值对删除。,在合理使用CPU时间和避免内存浪费之间取得平衡。(Redis默认20个)的key进行检查,并。最大允许内存,默认为0,也就是没有大小限制。,由事件处理器自动执行key的删除操作。

2025-05-17 17:00:17 1009

原创 Redis——持久化

AOF日志用于记录写操作命令,在redis重启后通过逐步执行写命令实现内存的数据再现。*3表示当前命令有三个部分,$+数字表示这部分命令、键或值包含多少字节。AOF记录的是写操作命令,RDB记录的是二进制数据,也就是记录Redis某一个瞬间的实际内存数据。因此恢复数据时,RDB的效率要比AOF更高,因为不用再逐步执行命令,直接读取RDB文件即可。

2025-05-17 15:09:12 914

原创 Redis——底层数据结构

Redis采用了链式哈希(拉链法)来解决哈希冲突,这与Java中的hashMap是相似的。哈希表的底层其实是数组,通过计算对象的哈希值对数组长度取余来确定索引位置,可以在O1的时间获取数据。

2025-05-16 17:52:55 1691

原创 MySQL——日志

redo log提交成功,binlog提交失败。主库数据更新成功但binlog丢失记录,进而导致主从复制时从库数据是旧的,以及备份的数据不一致。事务提交后,redo log和binlog都需要持久化到磁盘中,但这两个是独立逻辑,可能出现半成功的情况,造成数据不一致,需要确保它们提交的。的日志,在事务没提交之前,会先记录更新前的数据到undo log日志文件中,事务回滚时,可以利用undo log来进行回滚。主库数据更新丢失,但从库和备份有记录,导致主库数据是旧的,数据不一致。,再在合适的时机写入磁盘中。

2025-05-16 11:53:40 895

原创 Redis——线程模型·

2025-05-13 15:57:44 430

原创 Redis——数据结构

跳表有多个层级,每次添加新元素时会通过随机算法获取0到1的随机数,如果随机数<0.25(概率小于25),则增加一层,然后继续随机生成随机数,直到随机数大于0.25结束。层高最大限制为64。随着Redis的更新,后来又增加了四种数据类型:BitMap、HyperLoglog、GEO、Stream。示例:[socre1][value1][score2][value2]...

2025-05-13 14:48:48 952

原创 MySQL——性能调优

explain是查看sql的执行计划,主要用来。

2025-05-12 17:34:25 607

原创 MySQL——锁

如果update语句没有用到索引,会进行全表扫描,并在扫描过程中对所有记录加锁。

2025-05-12 16:12:46 323

原创 数据库事务

通过加行级锁实现,序列化隔离级别下,普通的select语句会对记录加S型的next-key锁,其他事务就没办法对这些已经加锁的记录进行增删改操作了。对于读已提交和可重复读隔离级别的事务来说,它们是通过Read View来实现的,它们的区别在于创建ReadView的实际不同。版本链找到事务开始时的数据,所以事务每次查询的数据都是一样的,期间其他事务提交的数据该事务是无法感知到的。的,实现的方式是开始事务后,执行的第一个查询语句会生成一个。,事务B此时提交了新的数据,事务A的。不能看见,可重复读是。

2025-05-11 16:33:39 569

原创 数据库索引

公式​:区分度=COUNT(DISTINCT 索引列)/COUNT(*),即字段值的种类除于总行数​值越接近1,区分度越高(如主键的区分度为1)。​示例​:若users表有1000行,email列有950个唯一值,则区分度为950/1000=0.95,适合建索引;而gender列仅2个值(男/女),区分度为2/1000=0.002,效果极差,所以我们一般不为性别字段建立索引。

2025-05-10 22:30:04 1262

原创 MySQL——存储引擎

因此在并发写入和数据完整性有一定限制。无需回表,每个索引都直接存储指针。为什么默认使用InnoDB?辅助索引存储主键,需回表查询。必须有主键(或隐式主键)数据行按插入顺序保存。

2025-05-09 18:17:22 519

原创 数组和集合

基于HashMap实现,HashMap的Key即为HashSet存储的元素,所有Key都使用相同的Value,一个名为PRESENT的Object常量,使用Key保证元素唯一性,但不保证有序性,也不是线程安全(HashMap不是线程安全)。:基于TreeMap实现,添加元素到集合时按照比较规则将其插入合适的位置,保证插入后的集合仍然有序。常用的实现类有LinkedList,ArrayList,Vector,Stack。:基于哈希表实现,存储键值对,数组加链表形式,哈希冲突时使用拉链法将冲突的。

2025-05-07 19:42:48 947

原创 String、StringBuilder、StringBuffer的区别

StringBuilder对象不是线程安全,适用于单线程环境。而StringBuffer对象是线程安全的,内部通过synchronzied关键字实现同步。String类型性能最低,当涉及频繁修改时会创建大量临时对象,增加内存开销和垃圾回收能力。StringBuilder忽略线程安全的开销性能最高,StringBuffer其次。每次修改操作都会生成一个新的String对象,并将原变量指向新对象。而StringBuilder和StringBuffer对象是可变的,可以直接对字符串进行修改而不创建新对象。

2025-05-06 20:05:57 262

原创 ==和equals的区别 hashCode和equals的联系

对于没有重写equals()方法的类,==和equals的作用是相同的:比较两个实例对象的地址是否相同。而对于重写了equals方法的类,equals方法则比较的是两个实例对象的内容(例如String对象)。hashCode方法用于生成在哈希结构中对象的哈希值,用于相等性判断。:若两个对象的哈希值相等,两个对象的equals方法比较结果不一定为true,这种情况成为哈希冲突。:若两个对象的equals方法返回true,则它们的hashCode值必须相同。

2025-05-06 19:57:58 262

原创 Java注解

注解的本质是一种继承自Annotation类的特殊接口,也被称为声明式接口,编译后会转换为一个继承自Anotation的接口,并生成相应的字节码文件。反射机制的核心类是AnnotatedElement,它同时也是所有可被注解的元素(Class、Method、Field)等类的父接口。Java注解的作用域(Scope)指定注解可以在哪些元素上应用,主要分为三种:类级别作用域、方法级别作用域、字段级别作用域。保留在.class文件中,且可通过反射运行时访问。注解的具体实现类是Java运行时生成的。

2025-05-06 19:44:32 218

原创 Java反射

反射机制是指在运行状态中,对于任意一个类,都能够动态获取它的所有属性和方法;对于任意一个对象,都能够调用它的属性和方法。

2025-04-21 08:39:31 181

原创 Java创建对象的方式

在实现深拷贝的方式中我们就提到过引用类型字段重写clone()的方式,实际上就是利用了clone()方法创建新对象的特性。本质上(内部实现)依然是使用new关键字或者反射创建新对象。用new关键字创建对象是我们在开发中最常用的方式,new关键字会为我们在堆内存中开辟一块空间以存放对象的引用(包含对象本身以及内部属性的引用)。newInstance()方法本质上是利用反射调用对应类的构造器构造对象。

2025-04-20 22:22:40 195

原创 深拷贝和浅拷贝的区别

对于基本数据类型,与浅拷贝一致,而对于引用数据类型字段,则使用递归(引用类型字段内部可能也有引用类型字段)将原对象的所有引用类型字段的内容也复制一份,以此保证两个对象的修改操作不会影响对方。对于原对象的引用数据类型字段,直接共享原对象字段的引用,修改自己的字段时会同时影响原对象。类似于重写clone()方法,在进行深拷贝时,通过调用引用数据类型字段的自定义的深拷贝方法手动创建新对象赋值到引用数据类型字段中。当一个对象被序列化和反序列化后,默认创建新的引用类型对象进行字段的赋值,达到深拷贝的效果。

2025-04-20 22:11:23 304

原创 基本数据类型与包装类

2、泛型只能接收引用类型而不能接收基本数据类型,也就是说集合类以及大部分工具类处理的基本单位就是引用类型而非基本数据类型,例如Collections、Arrays的排序方法。在上述代码中,由于Integer类没有+操作符,会不断自动拆箱为基本数据类型并不断创建新的Integer对象sum来接收结果。1、包装类提供了许多方便处理基本数据类型的方法,如不同数据类型直接的转化。反之,对基本数据类型对象进行包装类对象赋值时,会触发自动拆箱。2、基本数据类型的读写要快于包装类,,当使用缓冲池中的数值实例化时,会。

2025-04-18 16:52:55 229

原创 认识回调函数

注:这里由消费者决定执行业务的时机,这个时机指的是整个生产逻辑的时机,而不是调用回调函数的时机,所以与回调机制的控制反转是不冲突的。

2025-04-16 11:12:08 463

原创 langchain4j:Tool的使用

在langchain4j中,支持function calling的模型可以使用自定义参数或MCP服务调用函数实现Agent功能 描述:存放LLM模型请求中的tools中的函数信息,用于LLM模型理解并根据信息决定是否使用function calling功能以及根据信息构建函数的参数。如上图所示,ToolSpecifications工具类接收含有回调函数的类或直接接收回调函数,并通过反射获取@Tool、@P等注解的信息,并转化为ToolSpecification信息,以便后续传递给LLM

2025-04-15 23:16:36 1556 7

原创 langchain4j使用中遇到的疑惑与分析

[SystemMessage { text = "你是一个聊天助手,语言应尽量避免冗长机械,并遵循以下设定:无" }]:[SystemMessage { text = "你是一个聊天助手,语言应尽量避免冗长机械,并遵循以下设定:无" }, UserMessage { name = null contents = [TextContent { text = "我喜欢" }] }]上述为在自定义的记忆存储中增删查方法的日志记录,memoryKey是传入的键memoryId。

2025-04-06 20:36:17 804

原创 langchain4j:NativeRAG的调用流程

方法将文本转化对应的向量(并创建embedding对象,此对象内部既存储了对应的向量,还提供了L2归一化向量的方法)。方法,将embedding的vector对象(向量)和Textsegment的文本以及元数据一同存入对应的数据库中。对象,该对象包含userMessage被嵌入模型解析后得到的。存储完成后,每当有问题请求时,检索器会根据。和相关参数(如最大结果数,最小相似度,过滤条件),而后,调用嵌入存储的。,计算存储向量和query向量的。对象,并调用嵌入模型的。方法得到文档列表后,

2025-04-06 20:34:14 393

原创 Java基础概念

Java在包装类和工具类中提供了许多将字符串转化为其他类型的方法,例如Integer.parseInt()可以将字符串转为int类型,Double中也提供了parseDouble()将字符串类型转换为浮点类型。1、对应的字节数:1字节(byte、boolean),2字节(short、char)、4字节(int、float)、8字节(long、double)当目标类型大于原类型时,Java会自动将原类型转化为目标类型,如int转为long,float转为double。时,可能会导致数据丢失。

2025-03-29 18:42:32 686

原创 二分算法总结与通俗性理解

范围:左右都不可到达(初始左右不包含答案),一般L为最小范围-1,R为最大范围+1。不同的二分写法结束条件也不同,由结束条件可推导出二分结束时L与R的等效关系(可用可不用)范围:左包含右不可到达,一般L为最小范围,R为最大范围+1。范围:左右都包含答案,一般L为最小范围,R为最大范围。若边界没有确定好,有可能会。

2025-03-11 18:14:05 286

原创 重构API,用GPT_Sovits“偷走“你的声音!

GPT_Sovits是一款开源的TTS语音合成模型,允许用一段短音频进行快速音色克隆,也可以本地部署进行自己调试并构建特色推理模型,目前已经更新到v3

2025-03-09 22:49:25 517

原创 配合源码详解springMVC

.MVC(model-view-controller):MVC是一种软件架构的分离思想,这种架构模式将应用分为三个部分:模型(Model)、View(视图)、控制器(Controller)。这种分离使代码变得清晰、易于维护。模型层:业务逻辑层+数据库访问层,模型其实就是数据,是经过业务处理后的数据库数据,是用于视图层(如JSP)渲染的数据。视图层:负责通过html、css代码渲染数据并展示(数据通常依据于模型),使其成为对用户友好的界面。控制器层:负责协调模型和视图,也就是将不同的模型给不同的视

2025-03-07 11:12:20 1216

空空如也

空空如也

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

TA关注的人

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