- 博客(35)
- 收藏
- 关注
原创 Nginx配置文件详解
一个IP地址可以映射多个域名,通常情况下,我们是通过访问域名的方式访问这个网站,通过NGINX,可以让我们知道实际的请求是什么: proxy_pass http://frontend:3000;输入域名,然后在这个巨大的路由这里进行查看,看用户输入的域名跟哪个NGINX配置文件对应,然后进行配置文件的读取,然后进行请求操作。# 监听 IPv4 的 80 端口。真实的网络请求发过来的时候,NGINX启动,读取主配置文件,nginx.conf。# server_name 用来填写域名,如果没有域名那就填写_
2026-03-31 21:01:58
391
原创 一致性和高可用
P是分区容错性,只分布式系统里出现网络分区、节点不通时,依然能对外提供服务的能力。因为网络不可靠,所以分布式系统必须保证P,只能在C和A之间取舍。在分布式系统里:一致性(C)和高可用(A)的取舍,本质上是CAP定理。CP架构:选一致性,丢可用性。
2026-03-09 15:42:21
67
原创 操作系统-内存管理(八股)
还有虚拟内存可以使得进程对运行内存超过物理内存大小,通过对没有被经常使用到的内存,我们可以把它换出物理内存之外,比如硬盘上的swap区域,只在需要时将数据加载到内存中。有了虚拟内存后,进程只能操作虚拟内存,不能直接操作物理内存,每个进程的虚拟地址空间是相互独立的,进程不能访问其他进程的虚拟地址,这就解决了多进程之间地址冲突的问题。如果没有虚拟内存,程序直接操作物理内存的话,多个进程会相互干扰彼此的内存数据,一个进程可能会访问或修改另一个进行的内存数据,从而破坏了系统的稳定性和安全性。
2026-02-11 17:24:45
206
原创 JVM的内存结构
JVM内存结构分为五大区域:程序计数器,虚拟机栈,本地方法栈,堆,方法区(永久代)(元空间)。线程私有的,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址。程序计数器主要有两个作用:程序计数器是唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期随着现成的创建而创建,随着线程的结束而死亡。Java的虚拟机栈由一个个栈帧组成,而每个栈帧都拥有:局部变量表、操作数栈、动态链接、方法出口信息。每一次函数调用都会有一个对应的栈帧被压入虚拟机栈,每一个函数调用结束后,都会有一个栈
2026-02-10 17:31:41
337
原创 MySQL-锁
Innodb存储引擎实现的行级锁主要有记录锁,间隙锁,临键锁,插入意向锁这些,当我们对记录进行select for update,或者增删改的时候,就会对记录加上行级锁。Innodb实现的行级锁由记录锁、间隙锁、临键锁、插入意向锁。读已提交级别下,没有间隙锁,更新没有带where条件,是全表扫描,那么灰度每一条记录都加上记录锁。在对一张表结构进行修改的时候,MySQL就会对这张表加一个元数据锁,这个元数据锁就是属于表级锁。根据锁的颗粒度不同,MySQL的锁可以分为全局锁,表级锁,行级锁。
2026-02-05 17:09:02
435
原创 MySQL-索引
假设有一个(a,b,c)联合索引,它的存储顺序时先按a排序,在a相同的情况下再按b排序,再b相同的情况下再按c排序。MySQL会从联合索引最左边的索引列开始匹配查询条件,然后依次从最左到右的顺序匹配,如果查询条件没有使用到某个列,那么该列右边的所有列都无法使用走索引。当查询条件使用了某个列,但是该列的值包含范围查询,范围查询的字段额可以用到联合索引,但是在范围查询字段后面的字段无法使用联合索引。
2026-02-04 15:46:55
941
原创 MySQL的MVCC
通过与历史数据的事务ID进行比较,就可以根据可见性规则进行判断,判断这条记录是否可见,如果可见就直接将这条数据返回个客户端,如果不可见就继续王undo log版本链查找第一个可见的数据。我们每一条记录都有两个隐藏列,一个是事务ID,一个是指向历史数据undo log的指针,然后ReadView有四个字段,分别是创建ReadView的事务ID,活跃事务ID列表,活跃事务ID列表中的最小ID,下一个事务ID。
2026-02-02 15:47:33
334
原创 MySQL的事务
Buffer Pool的脏页会通过后台线程刷盘,即使脏页还没刷盘的时候发生了数据库重启,由于修改操作都记录到了redo log,之前已经提交的记录都不会丢失,重启后通过redo log,恢复脏页数据,从而保证了事物的持久性。针对快照读的话,是通过MVCC机制来解决的,在可重复读隔离级别下,第一次select查询的时候,会生成readview,在第二次执行select查询的时候,会复用这个readview,这样前后两次查询的记录都是一样的,不会读到其他事务更新的操作,这样就不会发生不可重复读的问题了。
2026-02-02 11:33:33
171
原创 Spring中的AOP和IOC(八股文)
在SpringIOC中,控制权由应用程序代码转移到了Spring框架中,Spring框架负责创建对象、管理对象之间的依赖关系、调用对象的方法等操作,应用程序只需要声明需要使用的对象和依赖关系,无需自己负责对象的创建和管理,从而实现了控制反转。在SpringIOC中,容器负责创建和管理对象,容器根据配置文件或者注解中的信息,自动创建和管理对象之间的依赖关系,然后将这些对象注入到应用程序中。依赖注入是指在对象创建的过程中,自动注入该对象所依赖的其他对象,从而构建对象之间的依赖关系。
2026-01-26 11:29:34
273
原创 面向对象的三大特征和反射(八股)
Java提供的一种机制,允许程序咋i运行时动态的获取类的信息,创建对象,调用方法,访问字段等。通过反射,程序可以在运行时查看和操作类的结构(如类的名称,方法,字段,构造方法),甚至动态加载类,反射是Java提供的强大功能,但也可能带来性能开销。子类用有父类对象所有的属性和方法(包括私有方法和私有属性),但是父类中的私有属性和方法子类是无法访问的,只是拥有。如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果子类没有覆盖父类的方法,执行的是父类的方法。子类可以用自己的方法去实现父类的方法。
2026-01-23 17:22:18
89
原创 MySql三大日志——(八股)
redo log是Innodb存储引擎层的日志,属于物理日志,记录了某个数据页做了什么修改,实现了事物的持久性,主要用于掉电等故障恢复。undo log是Innodb存储引擎层生成的日志,实现了事物的原子性,主要用于事务回滚和MVCC,在事务没提交之前,Innodb会先记录更新前的数据记录undo log中,回滚时利润undo log来进行回滚。binlog是追加写,写满一个文件,就创建一个新的文件继续写,不会覆盖以前的日志,保存的是全量的日志。binlog用于备份恢复,主从复制。
2026-01-16 15:18:53
307
原创 操作系统-线程,进程,协程(八股)
socket通信:前面提到的通信方式只能在本机上进行进程间的通信,如果要实现跨主机进程间通信,就通过socket通信,可以基于TCP或UDP协议的通信方式。共享内存:多个进程可以将共享内存映射奥各自的虚拟地址空间,实现共享数据的读写,不会涉及用户态和内核态之间的数据拷贝。管道通信:无格式的字节流,通信方向是单向的,只能在一个方向上流程,管道分为匿名管道和有名管道。进程间通信方式主要有管道,消息队列,共享内存,信号,信号量socket通信。信号:是一种异步的通知机制,用于用纸进程某个时间已经发生。
2026-01-15 10:30:31
67
原创 Java-SpringBoot的启动流程(八股)
之后刷新上下文,这一步会扫描项目里的Bean并注册到容器,同时处理@EEnableAutoConfiguration注解,加载META-INF/spring.factories里的自动配置类,根据条件注解决定那些配置生效。(命令行参数是什么:格式是。--server.port=8088 --spring.profiles.active=prod 优先级比配置文件的还高)。先初始化SpringApplication,这时候会判断应用类型是Web还是普通环境,确定用哪个应用上下文类。
2026-01-14 10:27:16
42
原创 Java-List,Set,Map(八股)
当添加对象是首先会对key进行hashCode()运算,再调用HashMap的hash()方法进行二次哈希,计算出桶下标,如果当前下标内容为空直接添加,不为空时则判断key的hashCode()是否一致,如果不一致就向后找,直到下标为空时添加,如果一致则进行equals运算判断内容是否相同,相同则将value进行替换。扩容的本质就是解决数组长度不可变的问题,当数组存满的时候,创建新的更大的数组,把原数组元素复制过去,从而实现容量的增长。当需要频繁访问和遍历集合元素的时候,推荐使用ArrayList。
2026-01-13 10:28:04
623
原创 IO(八股)
用户进程发起IO操作后,无需等待任务阶段,直接返回并继续执行;内核会自动完成“等待数据就绪+拷贝完成”的全部工作,完成后通过回调函数/信号主动通知进程。用户进程发起IO操作后,必须等待IO的“等待就绪+数据拷贝”至少一个阶段完成,才能继续执行后续代码;数据拷贝阶段进程一定是阻塞的。同步IO和异步IO的核心区别:在于用户进程是否需要等待这两个阶段完成。非阻塞IO(AIO)
2026-01-08 11:11:34
223
原创 Java - CompletableFuture的作用(经验分享)
在实际的项目开发中,当你遇到一个大文件需要批量入库的时候,比如:文件有用户信息,商品信息,商家信息,你需要从这个文件里分批读出来分别存储,然后将这些存储到不同的数据库上。我们设想一下,如果数据量非常大,那么这个导入时间是巨大的,我们自然而然的就想到的并行执行,而这个就用到了CompletableFuture。第一个方法使用的是默认线程池,其线程数默认等于CPU核心数,当文件数量远大于核心数时,任务会排队等待,无法充分利用IO资源。第二个是使用自定义线程池,可以自定义核心线程数量和最大线程池数量。
2026-01-07 15:55:06
290
原创 Java - Volatile关键字的作用(八股)
摘要:Java的volatile关键字确保变量修改的可见性并防止指令重排,保证修改立即写入内存,其他线程读取时直接从内存获取。它与CAS结合可保证原子性,如AtomicInteger的实现。在单例模式中,volatile修饰实例可避免多线程环境下的重复创建问题。示例展示了双重检查锁定的懒汉式单例模式,通过volatile和synchronized确保线程安全。
2026-01-05 15:55:18
136
原创 RAG检索增强技术
RAG是一种结合检索能力与大语言模型生成能力的AI技术,核心目标是解决大模型“知识陈旧”,让模型能够基于外部权威数据生成更准确,更具时效性的回答。相当于RAG给大模型配备了一个“外置知识库”,模型在生成会打钱,会从这个知识库种检索相关信息,再结合自身能力整合信息输出结果,而非依赖训练阶段的固有知识。
2025-12-11 11:51:34
428
原创 AI Agent
通过思维推理(Reasoning)->工具行动(Action)->感知结果(Observation)的短周期循环替代传统的“先完整规划,再执行”模式的智能体。2. 行动(Action):若需调用工具,输出 {"name":"工具名","parameters":{"参数名":"值"}};"thought": "用户需要查广州今日气温并推荐穿搭,穿搭依赖实时气温,需先调用天气工具","parameters": {"city": "广州", "date": "今日"}"condition": "晴转多云",
2025-12-07 12:00:00
249
原创 MCP 和 Function Calling的区别
核心定义:MCP和Function Calling是AI大模型与外部世界进行交互的两种核心处理机制。是特定模型的模型API扩展。针对不同的模型,可能需要编写一些不同的调用API的格式或者参数。定义了LLM与外部工具交互的标准流程、消息格式和错误处理机制。模型生成要调用的函数+参数,应用程序执行函数并返回结果。所有的模型都统一了这种调用模式。-MCP HOST:运行LLM的应用。-MCP CLINET:负责协议交互。-MCP SERVER:提供外部功能。-发送请求后不阻塞,结果返回再处理。
2025-12-06 12:00:00
186
原创 MCP协议
本地服务,Client 启动 Server 作为子进程,通过标准输入 / 输出通信。:支持 Claude、GPT 等不同 LLM,实现 "一次集成,多模型使用":远程服务,通过服务器发送事件和 HTTP POST 请求交互。:无需修改模型,随时添加新功能 (如接入新 API):清晰划分 AI 与外部系统边界,保护敏感数据。:一个协议连接所有外部资源,大幅降低集成成本。,使不同 AI 系统能无缝交互外部资源。让大语言模型 (LLM) 能够。,而不局限于训练数据。
2025-12-05 12:36:48
149
原创 什么是Function Calling
文章摘要:函数调用技术是AI模型通过识别用户需求自动调用外部工具的关键能力,能够有效解决大模型的知识更新、复杂计算和系统交互三大痛点。该技术通过意图识别、参数提取、多轮调用和结果处理四个关键环节,实现端到端自动化服务。其核心价值在于提升任务准确性、避免信息幻觉,并支持复杂场景下的智能决策流程,如智能客服自动查询订单等业务场景。
2025-12-04 13:33:10
299
原创 解决docker创建容器或者开启时报错问题(driver failed programming external connectivity on endpoint nginx)
如果你之前关闭了防火墙,那么你需要重新启动一下docker。但是报错了,报错信息如下。然后在启动就没有问题了。
2024-10-17 15:26:26
444
原创 关于在springboot3.xx使用knif4j及其拦截器的拦截方法
原因在于使用新版本的knif4j版本后,以前的方法,拦截器的配置,配置文件,配置属性发生了巨大的变化,如果你也有这样的困扰,希望这篇可以帮助到你。多说一句:我在解决这个问题是,看到网上都是在注册拦截器是排除该方法,类似于以下的书写,这并没有帮助我解决问题,不知道有没有大佬知道是为什么。如何在springboot3.xx版本使用knif4j我以及写过,这里便不在赘述了,我主要写拦截器的配置。log.info("开始注册自定义拦截器...");的类,这会导致 swagger 配置失效。
2024-04-17 21:56:45
1726
2
原创 Eureka的用法
name: eureka-server # Eureka的服务名称。service-url: #eureka的地址信息。service-url: #eureka的地址信息。name: # Eureka的服务名称。port: 10086 # 服务端口号。port: 10086 # 服务端口号。
2024-04-16 18:02:57
1292
原创 idea中service不小心被Hide Configuration的解决方法
启动时不小心手误按到了Hide Configuration,于是上网查找资料,找到了解决方法(如图)
2024-04-08 12:38:48
2185
3
原创 黑马p37redis实战篇,商品查询缓存代码展示
/查询到,返回结果。//没有查询到,查询数据库。//判断数据库的结果如何。//不为空,添加缓存数据。//判断是否查询到数据。//在缓存中查询数据。
2024-03-20 15:46:05
412
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅