自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 白盒与黑盒测试全解析

基础方法,覆盖大部分输入场景;

2026-01-04 10:45:00 884

原创 测试用例设计万能公式:高效覆盖全场景

测试用例 (Test Case) 是为了实施测试而向被测试的系统提供的一组集合。这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。

2026-01-04 09:00:00 1156

原创 LangChain4j ChatModel

ChatModel 是 LangChain4j 中最基础的核心组件,,封装了模型调用、请求封装、响应解析等底层逻辑,是实现 AI 对话功能的基础。

2026-01-03 09:30:00 343

原创 LangChain4j vs Spring AI 核心对比

LangChain4j与Spring AI的核心差异在于“灵活性”与“生态性”的权衡:LangChain4j以轻量、灵活、贴近LLM原生能力取胜,适合追求定制化和跨生态的场景;Spring AI以Spring生态为基石,主打企业级、高效率、低门槛,是Spring项目的首选。二者均处于快速迭代阶段,核心能力差距逐步缩小。最终选型无需纠结功能完整性,重点匹配自身项目生态和团队技术栈,即可实现AI功能的高效落地。

2026-01-03 08:30:00 719

原创 开发者AI大模型学习与接入指南

对于开发者而言,AI大模型的学习核心不在于深究底层实现原理(如Transformer架构、注意力机制),而在于掌握“选模型、用模型、知边界”的实操能力。本文结合实操要点与接入方案,为开发者梳理高效学习路径与落地方法。

2026-01-01 08:15:00 673

原创 软件测试分类与BUG管理

软件中的BUG指程序存在的错误、缺陷或故障,会导致软件无法正常运行或不符合预期,比如按钮点击无响应、数据计算错误等。

2025-12-09 23:35:24 1023

原创 软件测试入门

验证产品是否特性是否满足用户的需求。这一过程并非简单的“找bug”,而是通过一系列科学的方法和手段,对软件的功能、性能、兼容性、安全性等多维度进行检验,确保软件在不同场景下都能稳定、可靠地运行。从用户角度出发,测试是模拟真实使用场景的“试错”过程;从开发角度出发,测试是发现问题、优化产品的重要依据。从基础定义到核心模型,我们不难发现:软件测试的本质始终是“以用户需求为导向”,而测试工作的模式则需适配不同的开发模型和项目场景。

2025-12-09 16:45:00 871

原创 Docker镜像与分层深入理解

回顾全文,Docker镜像的核心优势源于其“分层架构+UnionFS+Copy-on-Write”的组合设计:分层架构实现了资源共享,大幅降低存储和内存占用;UnionFS提供了分层叠加的技术基础,让镜像结构清晰可控;Copy-on-Write机制在保证镜像只读安全的同时,满足了容器的可写需求。理解了镜像的这些核心原理,不仅能帮助我们更高效地使用Docker。

2025-12-08 21:45:00 973

原创 乐观锁与悲观锁:死锁分析与解决方案

假设会发生冲突,因此在操作数据之前就对数据加锁,确保其他事务无法访问该数据。常见于对数据一致性要求较高的场景。:使用,例如可以使用或UPDATE语句来加锁。:悲观锁适合的场景。通过每次加锁的形式来确保数据的安全性,。但是假设不会发生冲突,因此在操作数据时不加锁,而是在更新数据时进行版本控制或校验。如果发现数据被其他事务修改,则会拒绝当前事务的修改,需重新尝试。:通常通过来实现,每次更新时检查版本号或时间戳是否一致。:乐观锁适合。

2025-12-08 12:25:10 795

原创 WebSocket :实时通信技术对比

在实时通信场景中,有多种方式。补充说明(面试高频考点):即时聊天(如微信网页版)、实时协作工具(如在线文档)、游戏实时交互,需双方高频双向通信;:实时数据展示(如股票行情、监控面板)、新闻推送,仅需服务器向客户端单向推送,无需客户端主动发送数据。:早期无更好方案时的简单实时需求(如简陋的消息通知),;

2025-12-04 16:45:00 1009

原创 Docker:轻量级容器技术入门

是一个的,它允许开发者将应用及其依赖项打包到一个可移植的容器中,然后可以在任何支持Docker的Linux或Windows操作系统上运行。这些容器是完全隔离的,使用,容器之间不会有任何接口。:虚拟机提供了完整的操作系统隔离,而Docker容器之间的隔离性较弱,属于进程级别的隔离。:Docker的安全性相对较弱。如果容器内的用户获得root权限,他们将具有宿主机的root权限,而虚拟机中的租户root权限是与宿主机root权限分离的。

2025-12-04 12:05:34 951

原创 C/S 架构与 B/S 架构:核心差异 + 选型指南

定义:由 “客户端应用程序” 和 “服务端程序” 组成,客户端需单独安装(如 PC 端 APP、手机 APP),通过专用协议(如 TCP/UDP、自定义协议)与服务端通信,核心是 “专用客户端 + 集中式服务端”。典型组件客户端:本地安装的应用(如微信 PC 版、QQ、数据库客户端 Navicat、游戏客户端);服务端:部署在服务器的后台程序(如微信服务器、游戏服务器、数据库服务)。通信流程。

2025-12-03 20:54:36 1269

原创 HTTP不同版本核心对比

请求的平均数量与往常相同,但实际会有许多请求的短暂爆发,导致瞬时 QPS 暴增 4、多路复用容易 Timeout 大批量的请求同时发送,由于 HTTP2 连接内存在多个并行的流,而网络带宽和服务器资源有限,每个流的资源会被稀释,虽然它们开始时间相差更短,但却都可能超时。HTTP/2 引入了多路复用技术,允许多个请求和响应在单个 TCP 连接上并行交错传输,解决了 HTTP/1.1 应用层的队头阻塞问题,但 HTTP/2 依然受到 TCP 层队头阻塞 的影响。这减少了TCP连接的数量,从而降低了延迟。

2025-12-03 10:13:39 859

原创 HTTPS加密与HTTP

只要内容发生了改变,计算出来的摘要也应该变化, 防止第三方使用公钥解开签名后,拿到原始数据.摘要一般。

2025-12-01 11:00:00 810

原创 网络层:HTTP协议

自定义的专用消息头一般会添加。

2025-12-01 07:45:00 727

原创 数据链路层:以太网、MAC 地址及 ARP 协议详解

"以太网";既包含了数据链路层的内容,也包含了⼀些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等以太网是当前;和以太网并列的还有等;以太帧起始部分由前同步码和帧开始定界符组成,后面紧跟着一个以太网报头,以 MAC 地址说明目的地址和源地址。以太帧的中部是该帧负载的包含其他协议报头的数据包,如 IP 协议。源地址和目的地址,是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的;地址一般是唯一的,一个网卡一个MAC地址。

2025-11-30 12:54:38 914 1

原创 网络层:IP协议与路由解析

网络层的核心目标是,核心协议为 IP 协议,配套依赖 IP 地址规划、NAT 技术与路由机制,共同完成 “数据包从源主机到目标主机” 的端到端传输。

2025-11-28 09:15:00 607

原创 TCP协议核心机制详解

最开始的时候客户端和服务器都是处于CLOSED关闭状态。主动打开连接的为客户端,被动打开连接的是服务器。TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了 LISTEN 监听状态第一次握手 TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT 同步已发送状态。

2025-11-28 08:00:00 2667 1

原创 传输层TCP与UDP:网络传输的核心区别

接收方在接收到数据报后,会重新计算校验和,并与发送方提供的校验和进行比较,以检测数据报是否在传输过程中发生了错误。(Length):这也是一个16位的字段,它指示了UDP数据报的总长度,包括UDP头部和数据部分。4位TCP首部长度:数据偏移是指数据段中的“数据”部分起始处距离TCP报文段起始处的字节偏移量。(Source Port):这是一个16位的字段,用于标识发送方的应用程序所使用的端口号。(Destination Port):同样是一个16位的字段,用于标识接收方的应用程序所使用的端口号。

2025-11-27 08:00:00 483

原创 应用层:Socket网络编程

概念: Socket套接字,是由系统提供用于网络通信的技术,是。基于Socket套接字的网络程序开发就是网络编程。socket套接字应用属于应用层。

2025-11-26 09:00:00 675

原创 DNS与CDN:互联网访问加速的双引擎

首先我们会先向全球13个根服务器发起请求,询问com域名的地址,然后再向负责com域名的名称服务器发送请求,找到baidu.com,这样层层递归,最终找到我们需要的IP地址。这样,用户就可以通过易记的域名访问网站,而不需要记住复杂的P地址。根域名服务器将请求转发到对应的 TLD 服务器(例如,.com、.org 或 .net 服务器),这些服务器负责处理特定顶级域的请求。权威 DNS 服务器返回与域名对应的 IP 地址给递归 DNS 服务器,然后递归 DNS 服务器将该 IP 地址返回给用户的浏览器。

2025-11-25 12:01:47 555

原创 网络协议分层

为什么需要网络协议的分层?分层,就类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接。在代码中,类似于定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类(使 用方,使用服务): 对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可 对于提供方来说,利用封装的特性,隐藏了实现的细节,只需要开放接口即可。:通过将网络功能分解为不同的层,每一层只负责特定的任务,从而简化了设计和实现的复杂性。

2025-11-25 08:00:00 448

原创 一文理清:长短连接与长短轮询

长短连接是底层基础:决定了 TCP 连接的 “存活方式”,为上层应用提供通信通道;长短轮询是上层策略:基于 HTTP 协议,通过不同的 “请求 - 响应策略” 实现准实时需求;选择逻辑:先根据 “通信频率” 选择长短连接,再根据 “实时性需求” 选择是否使用轮询 / SSE/WebSocket。理解两者的核心区别,能帮助你在实际开发中精准选择技术方案 —— 比如开发一个简单的实时通知功能,可先用长轮询快速实现;若需高频双向交互,则应选择 WebSocket 配合 TCP 长连接,兼顾效率与实时性。

2025-11-24 08:00:00 865

原创 Git 标签管理使用指南

操作需求命令创建轻量标签(最新提交)git tag 标签名创建轻量标签(指定提交)git tag 标签名 commit_id创建附注标签(最新提交)git tag -a 标签名 -m "说明文字"创建附注标签(指定提交)git tag -a 标签名 -m "说明文字" commit_id查看所有标签git tag查看标签详情git show 标签名删除本地标签git tag -d 标签名删除远程标签git push origin :refs/tags/标签名推送单个标签到远程。

2025-11-23 09:30:00 1486

原创 缓存穿透、击穿和雪崩总结

对访问的查询参数以hash形式存储,在控制层先校验,不合法的去除,避免了大量访问请求对数据库底层的压力。对于给定的数据,通过多个哈希函数计算位置索引,将位图中的相应位置设置为1,表示该元素可能存在。缓存雪崩是多个key,大量数据同时过期,而缓存击穿是某个热点key崩溃,可以认为缓存击穿是缓存雪崩的子集。1、缓存空值,数据库返回给Redis,无value的key(数据库里不存在),下一次相同请求就会命中缓存;时间复杂度低,增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)

2025-11-21 09:00:00 865

原创 JVM异常与垃圾回收

Java堆用于存储对象实例,只要不断的创建对象,并且保证GCRoots到对象之间有可达路径,来避免来GC清除这些对象,那么在对象数量达到最大堆容量后就会产生内存溢出异常。可以设置 JVM参数-Xms: 设置堆的最小值、-Xmx:设置堆最大值。Java堆内存的OOM异常是实际应用中最常见的情况。当出现 Java堆内存溢出时,异常堆栈信息"java.lang.OutOfMemoryError'"会进一步提示"Java heap space'"。

2025-11-19 09:30:00 590

原创 JVM深入与双亲委派模型

JVM指 Java虚拟机, 是 Java 程序的运行核心,负责加载字节码、执行指令、内存管理和垃圾回收。常见的虚拟机:JVM、VMwave、VirtualBox、HotSpot(最流行)、OpenJ9(IBM)、Zing(Azul)JVM和其他两个虚拟机的区别:VMwave与 VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪。 JVM是⼀台被定制过的现实当中不存在的计算机

2025-11-18 08:30:00 984

原创 Redis缓存与Redission分布式锁

如果是"写操作",还是要老老实实写数据库,缓存并不能提高性能。缓存一般用于存储热点数据(被经常访问的数据),可以应对大部分请求。

2025-11-17 08:30:00 938

原创 Redis主从复制、哨兵、集群模式解析

是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的,只能由主节点到从节点。一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点读写分离:主节点写,从节点读,提高服务器的读写负载能力数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。故障恢复︰当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

2025-11-16 08:15:00 932

原创 Redis持久化:RDB与AOF解析

Redis持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。Redis持久化机制:RDB和AOF。如果只将Redis作为缓存来使用,可以不使用任何持久化。

2025-11-14 08:30:00 606

原创 Redis基本特性与数据类型

Redis是一个完全开源免费的高性能(NOSQL)的。它遵守BSD协议,使用ANSI C语言编写,并支持网络和持久化。Redis,每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数据类型,包括String、Hash、List、Set和Ordered Set,并且,同时Redis还支持对几个操作全并后的原子性执行。Redis有三个主要特点,使它优越于其他键值数据存储系统:数据持久化:Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

2025-11-13 09:00:00 658

原创 Git分支管理与合并冲突

参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并;情景:为了某个功能开发的一个分支,因为临时产品需求的变动,该功能的开发被叫停 , 需要删除该分支。在Git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。可是,在实际分支合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。合并后,目标分支的历史是线性的,无法直观区分 “哪些提交属于某个分支的开发”。合并完成后,dev分支对于我们来说就没用了,那么dev分支就可以被删除掉。

2025-11-12 08:45:00 1495

原创 一文搞懂 Git 核心:工作区、暂存区与版本库的实战指南

工作区:写代码、改文件的地方;暂存区:用git add整理要提交的修改;版本库:用git commit保存最终版本,用git reset回退历史。新增 / 修改:git add → git commit -m "描述"查看状态:git status查看差异:git diff回退版本:git reset(选对参数)撤销修改:git checkout -- file(工作区)、git reset HEAD file(暂存区)

2025-11-06 08:30:00 1137

原创 MySQL高级功能分析

如果说 CRUD 是数据库的基本语法,那么事务、视图、索引等就是数据库的高级特性和设计模式。它们共同构成了一个强大、健壮、高效的数据库系统。

2025-10-02 08:30:00 1683

原创 MySQL数据库入门:从启动到CRUD操作

可以创建一张与t_core表结构相同的表,把去重的记录写入到新表中,以后查询都从新表中查,这样真实的数据不丢失,同时又能保证查询效率。常见的C/S架构的应用,比如QQ,CCTALK,各种网络游戏等等,⼀般需要安装并且与服务器进行网络通信的都属于此类。字符串类型的列以字符为单位,并且可以单独指定字符集和排序规则,比如字符集是 utf8mb4 , 排序规则是。二进制的列以字节为单位,可以指定_bin结尾的排序规则,比如排序规则是。常用于对公开用戶提供的网络服务中。:数据的总和,,只适用于数值类型的字段或变量。

2025-09-30 09:00:00 1474

原创 MySQL 事务详解:从 ACID 特性到隔离级别实践

事务(Transaction)是数据库中一组不可分割的操作集合,这组操作要么全部执行成功(提交),要么全部执行失败(回滚),不存在 “部分成功” 的中间状态。简单来说,事务就像生活中的 “打包操作”—— 比如网购时的 “下单 + 扣库存 + 减余额”,这三个步骤必须同时完成:如果下单成功但扣库存失败,订单就会变成 “无效单”;如果扣库存成功但减余额失败,用户就会 “白花钱”。而事务的作用,就是确保这一系列操作 “同生共死”。在 MySQL 中,事务由一个或多个 SQL 语句组成,且。

2025-08-26 08:30:00 1722

原创 理解 Spring AOP 的织入

织入(Weaving)是 AOP 中的核心操作,指将切面(Aspect)中定义的横切逻辑(如日志、事务、权限校验等)“编织” 到目标对象(Target)的连接点(Join Point) 中的过程。简单来说,就是让分散的横切逻辑与核心业务逻辑形成一个完整的运行体。​举个例子:在用户登录功能中,“验证用户名密码” 是核心业务逻辑,而 “记录登录日志”“校验登录权限” 属于横切逻辑。织入的作用就是将日志和权限逻辑自动嵌入到登录方法的执行过程中,无需在业务代码中显式调用。​。

2025-08-08 15:57:14 719

原创 JMM与JVM

关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存中拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Jva内存模型中定义了如下8种操作来完成。的变量,它把一个从执行引擎中接受到的值赋值给工作内存的变量副本中,每当虚拟机遇到一个给变量赋值的字节码指令时将会执行这个操作。的变量,把工作内存中的变量传输到执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。的变量,把变量的值从主内存传输到线程的工作内存中,以便下一步的load操作使用。

2025-08-06 16:51:08 694

原创 Java中常量池、堆和栈的区别与联系

堆是对象的 “仓库”,存储所有动态创建的实例;栈是方法执行的 “工作台”,存储局部变量和调用信息,速度快但空间有限;常量池是 “常量缓存区”,存储不变值以复用,减少内存浪费。

2025-07-19 11:10:22 1902

原创 Java线程六态详解:从新建到终止

线程的生命周期可分为多种状态,主要包括新建、就绪、运行、阻塞、等待、超时等待和终止。Java中线程状态通过Thread.State枚举定义,包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。

2025-07-11 09:01:38 1660

空空如也

空空如也

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

TA关注的人

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