- 博客(107)
- 资源 (3)
- 收藏
- 关注
原创 程序是如何访问内存的?——虚拟内存与内存管理
虚拟地址空间:页0: [0x0000 - 0x0FFF]页1: [0x1000 - 0x1FFF]页2: [0x2000 - 0x2FFF]...物理内存:页框0: [0x000000 - 0x000FFF]页框1: [0x001000 - 0x001FFF]页框2: [0x002000 - 0x002FFF]...当程序访问一个虚拟地址,但对应的物理页不在内存中时,就会发生"缺页异常"(Page Fault)。虚拟地址 → 查页表 → 物理页框号 = 0(不在内存中)→ 触发缺页异常。
2026-06-19 19:33:56
212
原创 按下电源按钮后发生了什么?——计算机启动过程
BIOS找到启动设备(通常是硬盘)后,会读取硬盘的第一个扇区,这就是MBR(Master Boot Record)。硬盘结构:扇区0: MBR(512字节)扇区1: ...扇区2: ......0x000-0x1BD: 引导代码(446字节)0x1BE-0x1FD: 分区表(64字节)0x1FE-0x1FF: 签名(0x55AA)UEFI(Unified Extensible Firmware Interface)是BIOS的继任者。BIOS: 16位,只能用键盘操作。
2026-06-18 11:32:39
298
原创 为什么DCL单例要加volatile?——CPU乱序执行与内存屏障
CPU为了提高效率,会对指令进行重排序。指令1: 去内存读数据(要等80ns)指令2: 计算一个值(不依赖指令1的结果,1ns就能完成)CPU不会傻等指令1,而是先执行指令2你点了"红烧肉"(要等30分钟)你又点了"凉拌黄瓜"(2分钟就好)厨师不会等红烧肉做好再做黄瓜,而是先做黄瓜内存屏障(Memory Barrier)是一条CPU指令,它告诉CPU:“屏障前后的指令不能重排序。指令1(写操作)---- 内存屏障 ----指令2(读操作)有了屏障,指令1一定在指令2之前完成。
2026-06-15 15:39:29
315
原创 CPU和内存的那些事——程序员必知的硬件知识
超线程(Hyper-Threading)是Intel的一项技术,让一个物理核心可以同时处理两个线程。传统CPU:核心1: [ALU] [PC] [Registers] → 一次只能跑一个线程超线程CPU:核心1: [ALU] [PC1] [Registers1][PC2] [Registers2] → 一次可以跑两个线程你可能听说过"四核八线程",就是指4个物理核心,每个核心支持超线程,总共能同时处理8个线程。缓存不是按字节存储的,而是按"缓存行"(Cache Line)存储的。
2026-06-14 18:20:03
252
原创 从沙子到CPU——计算机硬件基础入门
CPU的制作过程:从沙子到硅锭,再到光刻蚀刻晶体管和逻辑门:计算机的"原子"汇编语言:CPU的"方言"计算机的执行过程:取指-执行的循环量子计算机:未来的发展方向下一篇我们会深入探讨CPU和内存的交互,聊聊缓存、超线程这些对Java程序员特别重要的知识。参考资料《编码:隐匿在计算机软硬件背后的语言》《深入理解计算机系统》
2026-06-13 22:38:55
319
原创 Shell函数与自动化:让脚本从“能用“进化到“好用“
方式1:function关键字# 方式2:函数名+括号(推荐)# 调用函数函数必须先定义后调用,否则会报"command not found"。
2026-06-13 20:05:41
223
原创 Shell流程控制:if/case/for/while让脚本活起来
上一篇我们学会了Shell脚本的基础——变量、输出、重定向。但到目前为止,我们的脚本都是"一根筋",从上到下顺序执行,没有任何判断和循环。这就好比写代码只有赋值语句,没有if和for,根本没法处理复杂的业务逻辑。今天我们就来给脚本加上"大脑"和"双腿"。
2026-06-12 22:48:36
233
原创 Shell脚本入门:从Hello World到变量的灵活运用
定义变量(等号两边不能有空格!这是最常见的错误)age=25# 使用变量echo "姓名: $name, 年龄: $age"# 或者用花括号明确边界echo "姓名: ${name}, 年龄: ${age}"只能使用字母、数字和下划线,不能以数字开头不能使用Shell关键字建议使用有意义的名称,如user_name而不是un。
2026-06-12 22:47:50
330
原创 大模型开发02 - 提示词工程
在大语言模型(Large Language Model, LLM)的应用中,我们和模型对话的时候,给到模型的内容不叫question,也不叫request,而是叫Prompt。提示词(Prompt)就是用户输入给大语言模型的一段文本,用于引导模型生成期望的输出。它可以是一个问题、一段指令、一个上下文描述。它是我们与模型对话的“语言”,也是模型理解我们需求的“钥匙”。你可以把 Prompt 理解为——告诉模型“该做什么、怎么做、做成什么样”的指令。
2026-06-11 22:40:10
283
原创 Redis Key 命名规范:一台 32G 的服务器是怎么被搞垮的
写到最后总结一下。Redis key 命名这事,说小很小——不就起个名字吗?说大很大——你的 Redis 稳定不稳定,排查问题快不快,团队协作顺不顺,跟 key 命名都有关系。我见过太多项目,前期图省事,key 随意命名。等到业务量上来、问题频发的时候,想改命名已经来不及了——改了旧 key 数据就丢了,不改又乱成一锅粥。最后只能加机器、加内存,用钱买运维的债。项目第一天就定好规范,写到团队的编码规范文档里,代码审查的时候把 key 命名作为一个检查项。这花不了多少时间,但省下的却是后期无尽的运维头疼。
2026-06-11 16:01:21
379
原创 Linux基础命令:文件、用户、权限一网打尽
[:alnum:]] # 字母和数字(等同于[a-zA-Z0-9])[[:alpha:]] # 字母(等同于[a-zA-Z])[[:digit:]] # 数字(等同于[0-9])[[:lower:]] # 小写字母[[:upper:]] # 大写字母[[:space:]] # 空白字符[[:punct:]] # 标点符号实战:验证IP地址格式/bin/bash# 验证IP地址格式是否正确ip="$1"thenecho "格式正确"elseecho "格式错误"fi。
2026-06-10 17:04:05
679
原创 “我加了 synchronized“——带实习生踩过的分布式锁的坑
实习生交完代码自信满满地说:"锁肯定加了,我用的 synchronized。"结果凌晨三点,批处理任务在三个实例上各跑了一遍,用户收到了三份重复的通知。一通排查下来——分布式锁不是这么用的。
2026-06-10 12:59:18
251
原创 从零玩转 Linux 命令行:一位后端菜鸟的硬核笔记
命令看起来多,但真正每天用的也就二三十个命令。关键在于理解设计思想——“一切皆文件”、管道哲学、“每个命令只做一件事”。命令行光看没有用,必须自己敲。照着上面在终端里跑一遍,一次记不住没关系,在真实场景里用上两三次就记住了。加油 🚀。
2026-06-09 15:16:28
835
原创 一个接口管三端:用 ConverterFactory 统一枚举在 HTTP/JSON/Excel 中的转换
说回开头那个 Excel 导入的需求。处理?status=1→ 注册一次,所有枚举通用SPI 处理→ 第六篇的方案处理"已签署"→ 基于 label 映射三个端共享同一个BaseEnum接口和缓存。BaseEnum(接口定义)、(缓存)、(HTTP 参数)、(Excel 转换)。加起来不到 200 行,但覆盖了项目中所有枚举在三个渠道上的转换需求。每当项目里新加一个枚举,只需要定义好 code 和 label,然后就可以在任何地方直接用了。传参、序列化、Excel 导入导出——它们自己会搞定。
2026-06-09 08:27:12
184
原创 后端转全栈学习-Day6-JavaScript 基础-4
第5天第6天操作内存里的 JS 对象操作页面上的 HTML 标签user.name = '大明'title.textContent = '新标题'改完看不见,要改完页面直接变化纯 JS 语法JS + 浏览器 API(DOM)今天的核心就是:用 JS 找到页面上的标签,然后修改它。事件 = 用户做了某个动作 → 你写的代码自动执行。// 翻译:当用户点击按钮时,执行这个函数console.log('按钮被点了')})这个模式叫事件监听——你在"等"用户做某个动作,用户做了,你的代码就跑起来。
2026-06-08 12:28:04
261
原创 从JDBC到SpringBoot:Java后端开发的框架进化之路
在没有框架的年代,我们操作数据库全靠JDBC。写一个简单的查询,代码长这样:这段代码有几个问题,相信写过的人都有体会:第一,太啰嗦。 一个简单的查询,业务逻辑只有3行(设置参数、执行、映射),剩下的全是样板代码。第二,手动映射结果集。 数据库的列名和Java对象的属性名要一个个对应起来。表有20个字段,你就得写20行。字段多了,漏一个都不好排查。第三,没有连接池。 每次查询都创建新连接、关闭连接,数据库压力山大。你可能会说"我自己搞个连接池不就行了",没错,但这就是在造轮子了。第四,SQL和Java代码耦
2026-06-08 08:28:29
506
原创 从零到一搞懂JavaWeb:Servlet、Cookie、Session、JSP、Filter、Ajax一次讲透
Tomcat是Apache开源组织使用Java开发的一款Web容器(也叫Web服务器)。它实现了JavaEE平台下的部分技术标准,比如Servlet、JSP、JNDI等。最关键的是——免费开源。服务器厂商是否免费WeblogicOracle收费WebSphereIBM收费JBossRedHat收费TomcatApache免费JettyEclipse免费HTTP(HyperText Transfer Protocol,超文本传输协议)是万维网数据通信的基础。简单说,它定义了。
2026-06-07 18:55:18
363
原创 Snowflake ID 全局序列化——Long → String,那一行配置背后的故事
最近跟同事联调一个功能的时候,他跑过来跟我说:“你看这个详情页,点编辑之后保存,提示数据不存在。我第一反应是——是不是没传 ID?或者传错了?。看着挺正常。但切到 Network 仔细看 Payload,发现请求体的 ID 变成了——末尾几位全变成了 0。"这不废话嘛,"我说,“JS 精度丢了呗。more。
2026-06-07 11:56:50
171
原创 可组合的 Jackson 元注解:用 ContextualSerializer 实现参数化脱敏
文章摘要 本文介绍了如何利用Jackson的ContextualSerializer特性实现参数化脱敏,避免为每种脱敏类型创建单独的序列化器。方法包括: 定义脱敏类型枚举(如手机号、邮箱等),统一管理脱敏规则 创建自定义注解@SensitiveMask,使用@JacksonAnnotationsInside将其与Jackson注解组合 实现SensitiveMaskSerializer,通过createContextual()方法读取字段注解配置 在序列化时根据配置应用不同的脱敏策略 这种组合式元注解方案显
2026-06-06 18:40:43
227
原创 大模型开发01- 大模型基础
现在我们说的大模型,一般指定都是LLM,全称是Large Language Model,也就是大语言模型。比如我们常用的ChatGPT、DeepSeek、通义千问等等,都是大语言模型。所谓大语言模型,其实就是用于做和自然语言相关任务的深度学习模型,它是基于海量文本数据训练出来的,能够理解和生成人类的自然语言。大模型,和以前的模型相比,主要的差异就在于大。
2026-06-06 00:01:53
277
原创 Session vs JWT:为什么我们最终放弃了无状态 Token?
维度JWT撤销需要额外机制(黑名单)直接删 Key多设备每个设备一个 Token,管理复杂Redis Hash 天然支持安全性localStorage 有 XSS 风险HttpOnly Cookie 防 XSS续期需要 Refresh Token 机制滑动 TTL性能不查存储(但黑名单方案会查)查 Redis(1ms 以内)适用场景Serverless、跨域、移动端B 端系统、安全要求高技术选型没有银弹,关键是要理解每种方案的 trade-off。
2026-06-05 17:27:51
619
原创 API 签名防重放机制:基于 HMAC-SHA256 的设计与实现
目标解决方案真实性appKey + appSecret(只有双方知道密钥)完整性HMAC-SHA256 签名(篡改后签名不匹配)新鲜性timestamp + nonce(过期拒绝 + 一次性使用)用一个只有双方知道的密钥,对请求的关键信息算一个带密钥的哈希,附在请求里。服务端用同样的密钥和规则重新计算,对比结果。再加上时间戳和随机数防止重放。整个方案没有引入任何外部依赖,用的都是 JDK 标准库(),实现起来也就几十行代码。如果你的项目有对接第三方 API 的需求,不妨试试。
2026-06-05 17:19:46
346
原创 AES 加密模式深度解析:ECB、CBC、GCM 对比与 Java 最佳实践
本文介绍了加密的基本概念、分类以及AES加密的核心原理。主要内容包括: 加密的必要性:保护敏感数据不被未授权访问,确保机密性、完整性和认证。 加密分类:对称加密(AES等)速度快,适合大数据量;非对称加密(RSA等)速度慢,用于密钥交换等场景。 AES详解: 历史:从DES到AES的演进 核心参数:固定128位块大小,支持128/192/256位密钥长度,对应10/12/14轮加密 加密过程:多轮变换(字节替换、行移位、列混合、轮密钥加) 加密模式: AES本身只能处理16字节数据,实际应用需要加密模式
2026-06-04 17:16:46
500
原创 后端转全栈学习-Day4-JavaScript 基础-2
作用域 = 变量可以被访问的范围。全局作用域 = 全公司公告(所有人能看到)函数作用域 = 部门内部文件(只有本部门的人能看到)块级作用域 = 会议室里说的话(只有会议室里的人能听到)作用域声明位置访问范围示例全局函数外面任何地方const APP = '电商'函数函数里面只在函数内块级{}里面(let/const)只在块内const global = '全局'const funcScope = '函数作用域'const blockScope = '块级作用域'
2026-06-04 13:17:32
214
原创 后端转全栈学习-Day3-JavaScript 基础-1
你现在的网页只有 HTML + CSS,就像一张海报——好看但不能交互。JS 就是让按钮能点、数据能刷、页面能动的能力。因为 JS 在浏览器里跑,你只需要浏览器——Chrome 最好。2.3 试试手在控制台里直接输入下面内容,按回车:你会看到控制台打印出"你好,小明"。控制台就是你学 JS 最好的练习场——打开 F12 就能写,不用建文件,不用编译。 标签就是往页面里写 JS 代码的地方。可以放在 里,也可以放在 前面(推荐放 body 最后,这样能保证先渲染页面再执行 JS)。3.2 co
2026-05-30 15:42:02
282
原创 后端转全栈学习-Day1
这篇文章是后端开发者转全栈的第一天HTML学习笔记,主要包含以下内容: HTML基础概念:介绍HTML作为标记语言的本质和作用,强调其只负责内容结构而非样式或交互。 HTML文档结构:详细解析了标准HTML文档的骨架组成,包括DOCTYPE声明、head配置区和body内容区。 标签语法:讲解标签的基本组成、嵌套规则和常见分类(块级/行内标签)。 核心标签大全:分类整理了最常用的HTML标签,包括: 文档级标签(html, head, body等) 结构分区标签(div, header, section等)
2026-05-25 15:16:10
362
原创 Agent入门
别把 Agent 简单理解为“聊天机器人”。如果说 ChatGPT 是“百科全书”,那 Agent 就是“全能实习生”。具备能力:查询数据库、调用API、写文件、自我纠错一个用于构建Agentic, Workflow和 Multi-agent应用的Java框架。Agent Framework会解析成Graph, Graph最终通过SpringAi的API 实现大模型的通信;Agent Framework是方便版的GraphGraph是自由版的AgentSpringAi 完成了基础设施。
2026-05-09 10:29:20
348
原创 MySQL 事务写入流程详解
1. 写 Undo Log(在 Buffer Pool 中修改 Undo 页,同时生成对应的 Redo Log)2. 修改数据页(Buffer Pool)3. 写 Redo Log(Redo Log Buffer)4. 提交时:Redo Log prepare → 刷盘(fsync)5. 提交时:写 Binlog → 刷盘(fsync)6. 提交时:Redo Log commit(仅内存,不强制刷盘)BEGIN│├─ 创建事务 TRX_ID 和 XID│UPDATE 语句│。
2026-04-14 10:36:46
401
原创 MySQL事务底层与高可用原理
在聚簇索引中,记录是按照主键值的大小连成了一个单向链表的,如果我们更新了某条记录的主键值,意味着这条记录在聚簇索引中的位置将会发生改变,比如你将记录的主键值从1更新为10000,如果还有非常多的记录的主键值分布在1 ~ 10000之间的话,那么这两条记录在聚簇索引中就有可能离得非常远,甚至中间隔了好多个页面。更新记录时,对于被更新的每个列来说,如果更新后的列和更新前的列占用的存储空间都一样大,那么就可以进行就地更新,也就是直接在原记录的基础上修改对应列的值。往这张表中插入多条记录。
2026-04-13 20:31:27
346
原创 MySQL体系架构
MySQL变种有好几个,主要有三个久经考验的主流变种:Percona Server,MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持,均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库,值得我们了解一下。
2026-04-07 10:57:13
386
原创 MySQL中的索引
能表示的整数范围当然也是依次递增,如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用NEDIUMINT就不要使用INT,这是因为数据类型越小,在查询时进行的比较操作越快(CPU层次)数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
2026-04-02 14:08:34
429
原创 数据库基础知识
范式来自英文Normal Form,简称NF。实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。
2026-04-01 14:58:05
411
原创 MySQL事务原理与优化最佳实践
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制、日志机制,用一整套机制来解决多事务并发问题。接下来的,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。
2026-04-01 14:29:53
337
原创 MySQL Explain详解与索引优化最佳实践
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字 ,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。
2026-03-27 17:16:54
509
原创 一文搞懂hadoop的HDFS
Hadoop是由Apache基金会所开发的分布式系统基础架构,旨在解决海量数据存储和计算分析问题。狭义上来说,Hadoop是指Apache Hadoop开源框架,包含以下三种核心组件:广义上来说,Hadoop通常是指围绕Hadoop打造的大数据生态圈,部分技术栈如下图:Hadoop最初是由Doug Cutting和Mike Cafarella于2002年左右创建的,最早起源于Nutch,其最初的目标是构建一个能够处理大规模数据集的分布式文件处理系统。后期,Doug Cutting以Google的GFS(G
2026-03-27 14:10:59
821
原创 深入理解MySQL索引底层数据结构与算法
在日常开发中,我们经常遇到这样的场景:一张千万级数据量的用户表,一个简单的查询语句竟然需要运行几十秒甚至更久。而加上合适的索引后,查询时间瞬间降到了毫秒级别。这种性能上的巨大差异,背后究竟隐藏着什么样的技术秘密?索引的本质,是在空间换时间的策略下,为数据查询构建的加速结构。理解索引的底层原理,不仅能帮助我们写出高效的SQL,更能在系统设计和性能优化时做出正确的技术决策。本文将从数据结构的角度,深入剖析MySQL索引的设计哲学和实现细节,并通过实际场景对比,让你真正掌握索引的精髓。选择性原则。
2026-03-26 17:26:09
430
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅