qinghuan

QINGHUAN / JAVA & BACKEND LEARNING

从第一行 Java,到后端系统。

语法、计算机基础、Web、数据、项目与工程,按前置知识逐步深入。

115篇笔记 · 78 篇必会主线
零基础起点 / 单元 01

从零开始:安装 JDK 并运行第一个 Java 程序

安装并核对 JDK 17,创建源文件,分别完成编译和运行,用终端输出确认每一步成功。

从零开始学习
每天一个小闭环
  1. 读懂对照知识点,补齐前置
  2. 动手运行示例,完成练习
  3. 复盘自测并记录自己的结论
配套专题实验:N+1 查询、跨行约束与跨域请求。带完整示例、实际观察记录和独立练习。
MYGIT

黑马点评每日学习总结 ↗

根据自己的提交复盘代码。Day01:短信登录与商户查询缓存,附实际调用链、源码边界和独立练习。

10 月 30 日资料补充:缓存、Java 执行、JDBC 与训练验收的 23 篇讲义。按问题选读,附官方来源、示例与待完成的验收练习。

先知道,哪些值得先学

重要程度与难度,分开看。

先沿 P0 主线学习,遇到前置知识先补齐;再按目标扩展 P1、P2。编号是建议顺序,不限制每天的篇数。筛选后的编号会保留,方便回到完整路线。

P0 · 必会主线
后续学习和独立开发反复依赖
P1 · 重点提升
提升工程能力与问题定位能力
P2 · 按需深入
在特定场景下进一步研究

显示 115 / 115 篇

L0 · 零基础

从环境、术语和第一个可运行的例子开始,不预设相关知识。

15 篇
单元01
P0 · 必会主线L0 · 零基础

从零开始:安装 JDK 并运行第一个 Java 程序

安装并核对 JDK 17,创建源文件,分别完成编译和运行,用终端输出确认每一步成功。

源代码与字节码 · JDK/JRE/JVM 职责 · JDK 17 安装与架构选择

单元02
P0 · 必会主线L0 · 零基础

IDE、终端与调试:看见程序怎样执行

先让 IDE 和终端使用同一套 JDK,再用断点查看变量和调用过程,找到程序首次偏离预期的位置。

IDE、终端、JDK 分工 · 项目 SDK 与运行配置 · 工作目录和参数

单元03
P0 · 必会主线L0 · 零基础

变量、基本类型与运算符:先算对一个表达式

先理解变量保存什么,再检查表达式使用的类型,避免整数除法、数值溢出和转换顺序造成错误。

八种基本类型 · 局部变量初始化 · 字面量与 long 后缀

单元04
P0 · 必会主线L0 · 零基础

控制台输入、条件与循环:写一个可交互程序

读取一行输入,检查并转换成数据,再通过条件和循环完成一个能反复交互的小程序。

标准输入与输出 · Scanner token 与整行 · 输入类型和范围验证

单元05
P0 · 必会主线L0 · 零基础

方法、作用域与递归:把程序拆成可验证步骤

把大程序拆成输入输出清楚的方法,分清局部变量与共享对象,再为递归写好结束条件。

参数与返回类型 · void 与 return · 方法签名和重载

单元06
P0 · 必会主线L0 · 零基础

数组与二维数组:下标、遍历和复制边界

用一组成绩理解数组下标和固定长度,再分清共享同一数组、复制数组以及二维数组的区别。

数组长度与合法下标 · 元素默认值 · 普通与增强遍历

单元07
P0 · 必会主线L0 · 零基础

字符串与 StringBuilder:文本长度并不总是字符数

分清修改变量和修改字符串,再理解为什么一个表情的 length 可能大于 1,以及何时使用 StringBuilder。

String 不可变结果 · 字符串内容比较 · substring 半开区间

单元08
P0 · 必会主线L0 · 零基础

后端开发需要的 HTML 与 CSS 最小基础

先做一张完整小页面,分清内容结构、颜色布局和按钮行为,再通过浏览器工具检查实际结果。

HTML 元素与属性 · 语义标题链接按钮 · UTF-8 和 viewport

单元09
P0 · 必会主线L0 · 零基础

从零准备 MySQL:安装、连接与第一条查询

先启动数据库服务,再用客户端连接、选择独立练习库并执行第一条查询,逐步确认连接和权限。

服务端与客户端的职责 · MSI 安装与 Configurator 配置 · Windows 服务、安装路径和端口

单元10
P0 · 必会主线L0 · 零基础

JavaScript、DOM 与异步:让页面响应操作

从按钮事件开始操作页面,再理解 Promise、await 和 fetch,避免旧请求晚返回时覆盖新结果。

JavaScript 与 Java 区别 · let/const 绑定 · DOM 查询

单元11
P0 · 必会主线L0 · 零基础

从零准备 Redis:启动隔离实例并读写第一个键

启动独立 Redis 7.4 练习容器,分清本机与容器端口,再用 PING、SET、GET 和 TTL 核对结果。

Redis 服务与 redis-cli 客户端 · Docker 镜像和容器的最小概念 · Docker 客户端与引擎状态

单元12
P0 · 必会主线L0 · 零基础

从零设计关系表:先确定事实,再添加约束

先明确每行记录的事实,再用主键、唯一、外键和必填规则保护数据,区分无意重复与必要的历史记录。

实体与关系 · 主键与候选键 · NOT NULL

单元13
P0 · 必会主线L0 · 零基础

Redis 数据结构入门:从需要的操作反推存储方式

从会话、点赞和排行榜要做的操作出发,选择 String、Hash、Set 或 Sorted Set,并限制单个键的规模。

String · Hash · List

单元14
P0 · 必会主线L0 · 零基础

Git 从零工作流:让每次修改都能检查、解释和撤回

从工作区、暂存区和提交三个状态开始,每次先检查再提交,学会解释修改并在共享历史中撤回效果。

工作区 · 暂存区 · 提交

单元15
P0 · 必会主线L0 · 零基础

Linux 入门排障:先读路径、权限、进程和服务状态

先核对服务实际使用的账号、路径和 JDK,再逐层看权限、进程、端口和请求结果,找到第一处失败。

路径与当前目录 · 用户和组 · 读写执行权限

L1 · 基础

掌握日常开发的基本方法,能独立完成小功能并解释结果。

38 篇
单元16
P0 · 必会主线L1 · 基础

值、引用与对象:从一次方法调用说起

用两个变量指向同一个对象的例子,理解方法为什么能改对象内容,却不能直接替调用方重新赋值。

基本值与引用值 · 对象与引用变量 · null 引用

单元17
P0 · 必会主线L1 · 基础

面向对象:从封装、继承到接口多态

从优惠券和余额的规则出发,理解对象怎样保护数据,以及接口怎样让不同实现被统一使用。

封装业务不变量 · 构造器输入验证 · 继承的 is-a 关系

单元18
P0 · 必会主线L1 · 基础

包、访问权限与 static/final:组织代码的边界

先把类放进包并正确运行,再分清访问权限、属于类的 static 成员和限制重新赋值的 final。

完整类名与包目录 · import 与 classpath · 四类访问权限

单元19
P0 · 必会主线L1 · 基础

equals 与 hashCode:让“相同”有一致的含义

先决定两个对象怎样才算相同,再让 equals 和 hashCode 配合,理解为什么改动 Map 的键会影响查找。

引用 == 与内容 equals · Object 默认相等语义 · 自反对称传递一致

单元20
P0 · 必会主线L1 · 基础

List、Set、Map:先看业务,再选集合

从订单明细、任务去重和购物车入手,判断该用 List、Set 还是 Map,再检查顺序和修改规则。

List 有序与重复 · Set 唯一元素 · Map 键值关系

单元21
P0 · 必会主线L1 · 基础

泛型:把类型约束写进接口

用 List<String> 理解泛型如何提前发现类型错误,再从读入和写出的方向看懂 extends 与 super。

泛型类型参数 · 包装类型与基本类型 · 泛型不变性

单元22
P1 · 重点提升L1 · 基础

枚举与 record:写清状态和数据

用枚举限定可选状态,用 record 减少数据类的重复代码,再检查状态变化和内部可变对象的限制。

枚举独立类型 · 稳定状态编码 · ordinal 持久化风险

单元23
P0 · 必会主线L1 · 基础

BigDecimal 与金额:构造、舍入和比较都要有规则

从输入方式开始保证金额精度,再约定币种、单位、比较和舍入规则,避免只换类型却留下计算问题。

二进制浮点近似 · 字符串构造 BigDecimal · 不可变运算结果

单元24
P1 · 重点提升L1 · 基础

日期与时间:分清日历时间、时间点和时区

从生日、营业时间和日志时间出发选择类型,分清日期、确定时刻和时区,避免同一时间被解释成不同意思。

LocalDate/LocalTime · LocalDateTime 无时区 · Instant 时间线

单元25
P0 · 必会主线L1 · 基础

Lambda 与 Optional:传入一段行为,表达没有结果

把判断或转换行为传给方法,用方法引用简化合适的写法,再用 Optional 明确表达可能没有结果。

函数式接口单抽象方法 · Predicate/Function 等职责 · Lambda 目标类型

单元26
P0 · 必会主线L1 · 基础

异常与资源释放:失败也要有出口

失败时给调用方明确结果,同时把文件、连接等资源关好,避免打印了错误却继续假装成功。

Throwable 分类 · checked/unchecked 约束 · 局部恢复与上抛

单元27
P0 · 必会主线L1 · 基础

IO:字节、字符、缓冲与资源关闭

先分清字节与文本,再按实际读取数量处理数据,明确编码、缓冲和谁负责关闭资源。

字节流与字符流 · 字符集显式转换 · 缓冲作用与限制

单元28
P0 · 必会主线L1 · 基础

进程、线程与文件系统:程序运行时依赖什么

从运行中的程序出发,分清进程、线程、并发和并行,再理解路径、文件与资源关闭。

进程地址空间 · 线程执行栈和共享堆 · 并发与并行

单元29
P0 · 必会主线L1 · 基础

复杂度入门:输入扩大后,工作量怎样增长

先数程序做了多少次关键操作,再判断数据翻倍后的变化,分清增长趋势和一次实际运行的耗时。

输入规模与关键操作 · O/Ω/Θ 定义 · 最好平均最坏情况

单元30
P0 · 必会主线L1 · 基础

数组、链表、栈与队列:按访问方式选择结构

先看要按位置查找、在两端取放,还是按到达顺序处理,再理解数组、链表、栈和队列各自的代价。

数组按下标定位 · 动态扩容与移动 · 链表节点和后继

单元31
P0 · 必会主线L1 · 基础

排序与二分查找:先想清范围,再写循环

先写清排序规则和每轮搜索的范围,再实现二分查找,减少漏查、越界与死循环。

比较规则与稳定性 · 平方级排序 · 归并排序及空间

单元32
P0 · 必会主线L1 · 基础

DNS、TCP 与 TLS:一次 HTTPS 请求经过哪些阶段

把访问网站拆成查地址、建连接、验证证书和处理 HTTP 请求,逐步定位问题出在哪一层。

DNS 层次与递归解析 · TTL 和缓存观察差异 · TCP 有序字节流

单元33
P0 · 必会主线L1 · 基础

HTTP 请求与响应:先读懂接口的语言

读懂方法、地址、请求头和状态码,再用删除和编辑的例子理解幂等与条件请求。

方法与请求目标 · 路径和查询参数 · 请求头与消息内容

单元34
P0 · 必会主线L1 · 基础

表单与 JSON:同一组字段为什么发送结果不同

查看浏览器真正发出的格式和字段,分清表单与 JSON,再让 Content-Type、字段名和服务端读取方式对应。

name/id/label 职责 · 可提交控件规则 · GET 与 POST 表单

单元35
P0 · 必会主线L1 · 基础

Maven 主线:坐标、生命周期与依赖范围

用 POM 写清依赖和构建步骤,分清 package、clean 与插件动作,再判断依赖在哪些阶段可用。

groupId/artifactId/version · packaging 与标准目录 · 生命周期阶段

单元36
P0 · 必会主线L1 · 基础

Maven 与运行环境:从“能编译”走到“能请求”

先找出从工具、编译、启动到接口请求的哪一步失败,再核对实际 JDK、依赖与服务配置。

POM 与 Java 目标 · Maven 实际 JDK · IDE Runner 与 JAVA_HOME

单元37
P0 · 必会主线L1 · 基础

MySQL 入门:CRUD、约束与事务

用商户表练习增删改查,再通过唯一约束和事务提交、回滚检查哪些数据规则由数据库保证。

表与列类型 · 主键非空唯一 · 外键与级联规则

单元38
P0 · 必会主线L1 · 基础

JDBC 与连接池:从 SQL 参数到连接归还

沿着取连接、传 SQL 参数、读结果和归还连接走一遍,理解连接池及框架实际替你做的工作。

Connection/Statement/ResultSet · PreparedStatement 参数绑定 · SQL 结构白名单

单元39
P0 · 必会主线L1 · 基础

Servlet、Filter 与 MVC:请求经过哪些关口

把容器、Filter、DispatcherServlet 和 Controller 连成请求路线,理解谁能拦截请求、返回时又经过哪里。

Servlet 容器分发 · Filter 前后处理 · chain.doFilter

单元40
P0 · 必会主线L1 · 基础

Cookie 与 Session:登录状态如何串起请求

沿着登录、保存会话和下次请求读取用户信息的过程,分清 Cookie、会话 ID 与 Session 的职责。

Cookie 作用域 · 会话 ID 与对象 · Session 属性读写

单元41
P0 · 必会主线L1 · 基础

Spring IoC:把对象关系交给容器管理

先用构造器写清 Service 必需的协作者,再理解 Spring 怎样注册和组合对象,并区分依赖与请求数据。

IoC 与依赖注入 · Bean 定义和注册 · 构造器依赖

单元42
P0 · 必会主线L1 · 基础

Spring Boot:启动、自动配置与 Profiles

从启动入口追到容器创建,按条件解释 Bean 为什么出现或缺失,再用 Profile 管理环境差异。

SpringApplication 启动 · SpringBootApplication 组合 · 组件扫描包范围

单元43
P0 · 必会主线L1 · 基础

参数绑定与校验:别让错误输入走进业务

先从正确位置读取并转换请求,再分别检查字段格式、当前业务状态和用户权限,给出准确错误。

PathVariable · RequestParam · RequestBody

单元44
P0 · 必会主线L1 · 基础

接口分层与异常处理:让输入输出各司其职

按输入、存储和展示分别设计字段,再把业务失败转换成清楚、稳定且不会泄露内部信息的响应。

DTO/Entity/VO 分工 · 输出字段白名单 · Controller 边界职责

单元45
P0 · 必会主线L1 · 基础

SQL 连接与 NULL:让零订单用户也正确出现在结果里

从一个用户多张订单的例子看懂 JOIN 展开,再检查 ON、WHERE 和 NULL 怎样影响漏行与重复统计。

INNER JOIN · LEFT JOIN · 一对多展开

单元46
P0 · 必会主线L1 · 基础

聚合、子查询与 CTE:把统计问题拆成可验证的阶段

先确定一行结果代表什么,再分步筛选、分组和汇总,避免连接展开或 NULL 让统计悄悄出错。

分组粒度 · COUNT 与 SUM · WHERE 与 HAVING

单元47
P0 · 必会主线L1 · 基础

Redis 的键为什么消失:过期、淘汰与 TTL

分清到期消失和内存淘汰,再观察覆盖写入怎样影响 TTL,为缓存和登录状态选择合适的失效规则。

TTL 与 PTTL · 惰性和主动过期 · SET 覆盖 TTL

单元48
P0 · 必会主线L1 · 基础

RabbitMQ 入门:消息如何经过交换机到达队列

从订单事件的多个接收方出发,画清交换机、绑定和队列,分清独立订阅与同一队列内分担任务。

Producer · Exchange · Queue

单元49
P1 · 重点提升L1 · 基础

RocketMQ 基础模型:Topic、队列与消费组如何配合

用一条订单事件分清 Topic、队列和消费组,再区别业务事件编号、消息 ID 与每次发送尝试。

Topic · Message Queue · Producer

单元50
P0 · 必会主线L1 · 基础

JUnit 与 Mockito:把业务规则写成有意义的单元测试

先列业务必须满足的结果和拒绝条件,再用 JUnit 断言与 Mockito 替身检查,明确模拟测试能证明什么。

Arrange Act Assert · 正常与异常分支 · 边界输入

单元51
P0 · 必会主线L1 · 基础

日志与调试:让一次失败请求留下足够而克制的证据

让日志能串起一条请求的关键步骤、结果与异常,同时控制字段和敏感信息,并正确清理线程上下文。

日志级别 · 参数化日志 · 异常堆栈

单元52
P0 · 必会主线L1 · 基础

OpenAPI:把接口输入、输出和错误说明白

把参数、成功结果和各类失败写清楚,再对照运行时校验与授权检查,避免文档完整但接口行为不一致。

OpenAPI 3.1 · 路径参数 · Schema

单元53
P0 · 必会主线L1 · 基础

认证与授权:登录成功之后仍要检查每个资源

用本人、他人和管理员访问订单的例子,分清登录身份与资源权限,再理解 Session 和 JWT 的作用。

认证与授权 · 默认拒绝 · 角色与对象所有权

L2 · 进阶

把知识串成系统,处理并发、可靠性、检索质量与真实故障。

48 篇
单元54
P0 · 必会主线L2 · 进阶

Stream:筛选、转换和汇总一批数据

用筛选、转换和分组处理一批数据,理解什么时候真正执行,以及收集结果和并行处理要遵守什么规则。

数据源和流水线 · 中间与终止操作 · 一次消费

单元55
P1 · 重点提升L2 · 进阶

集合视图与快照:改一处,另一处会变吗

分清不能增删、不能修改和不会跟着来源变化,避免把集合视图误当成完全独立的副本。

不可修改视图 · List.copyOf 快照 · Arrays.asList 固定大小

单元56
P1 · 重点提升L2 · 进阶

反射、注解与动态代理如何连起来

从运行时查看方法开始,理解框架怎样读取注解,再通过代理在调用前后添加处理。

公开成员反射访问 · RetentionPolicy.RUNTIME · Target 使用位置

单元57
P1 · 重点提升L2 · 进阶

NIO 文件操作:路径解析、目录遍历与文件替换

分清路径文字和实际文件,再用 Path 与 Files 完成目录遍历、复制和移动,检查覆盖与并发变化。

Path 与文件区别 · resolve/normalize · 绝对路径和真实路径

单元58
P0 · 必会主线L2 · 进阶

并发基础:一次 count++ 为什么不够安全

用两个线程同时加一的例子,分清更新丢失、读不到新值和共享数据范围,再选择合适的保护方式。

count++ 复合操作 · 原子性与可见性 · volatile 的限制

单元59
P1 · 重点提升L2 · 进阶

网络编程:TCP 字节流与 HTTP 客户端

分清连接成功、收到完整消息和业务成功,再用带超时与状态检查的 HTTP 客户端发送请求。

Socket 字节流 · 应用消息边界 · 连接与请求超时

单元60
P1 · 重点提升L2 · 进阶

哈希表、树与堆:定位、范围和优先级的不同答案

按编号查、按范围查、反复取最优项是三种不同需求,分别理解哈希表、搜索树和堆的作用。

哈希映射和冲突 · 散列分布与负载 · 稳定键

单元61
P1 · 重点提升L2 · 进阶

图与遍历:查路线、找连接、排任务顺序

用图保存连接和依赖关系,再选择逐层查找、沿路深入或安排先后顺序的算法。

有向与无向图 · 邻接表与矩阵成本 · BFS 队列与最短步数

单元62
P1 · 重点提升L2 · 进阶

回溯与动态规划:怎样少做重复计算

从尝试所有选择开始,找出反复计算的小问题,再用状态和转移规则把答案保存下来。

递归状态与可选动作 · 终止条件与推进 · 选择探索撤销

单元63
P1 · 重点提升L2 · 进阶

Maven 多模块:聚合、继承与版本管理

分清模块一起构建、继承配置和引用依赖三件事,再统一版本并安排清楚的依赖方向。

聚合 modules · parent 继承 · dependencies 引用

单元64
P1 · 重点提升L2 · 进阶

Servlet 生命周期:实例、请求和异步任务何时结束

分清 Servlet 实例和一次请求的存活时间,再检查并发访问、请求再次分派与异步完成的边界。

加载与 init 时机 · service/doGet/doPost · 实例并发复用

单元65
P1 · 重点提升L2 · 进阶

Spring Bean 何时准备好:初始化与代理调用

跟踪对象从构造、初始化到交给调用者的过程,理解何时能使用依赖,以及哪些调用会经过 AOP 代理。

实例化与依赖注入 · 初始化回调 · BeanPostProcessor

单元66
P1 · 重点提升L2 · 进阶

Boot 配置绑定与日志:让运行参数可解释

跟踪配置从 YAML 到对象、校验再到实际使用的过程,并用能关联请求和失败位置的日志帮助排查。

属性源优先级 · ConfigurationProperties 绑定 · 配置类型注册

单元67
P0 · 必会主线L2 · 进阶

Boot 测试分层:单元、MVC 切片与集成验证

按要验证的行为选择单元、MVC 切片或集成测试,并说明哪些依赖真实运行、哪些只是模拟。

行为与边界断言 · 普通单元测试 · WebMvcTest 切片

单元68
P0 · 必会主线L2 · 进阶

MyBatis:参数、SQL 与结果映射要对得上

沿 Mapper 调用、SQL 展开、参数绑定和结果填充逐步检查,弄清为什么能查到数据却映射不对。

参数占位与预编译 · ${} 文本替换风险 · 动态结构白名单

单元69
P0 · 必会主线L2 · 进阶

Spring 事务:注解之外,更要看调用边界

先确定哪些数据库修改必须一起提交,再追踪代理调用、异常和传播方式,检查事务到底覆盖了哪里。

业务原子边界 · 事务管理器与资源 · 代理外部调用

单元70
P1 · 重点提升L2 · 进阶

MySQL 索引:用 EXPLAIN 验证查询假设

从订单筛选和排序方式设计索引,再用执行计划检查实际选择,避免把“用了索引”当成“一定更快”。

联合索引字段顺序 · 筛选排序分页形状 · 最左前缀

单元71
P1 · 重点提升L2 · 进阶

Redis 缓存:命中之外,还要设计失效

从先查缓存、未命中再查数据库开始,继续设计键名、空值缓存、过期和更新后的失效处理。

Cache-Aside 读取回填 · 数据库事实源 · 业务维度键

单元72
P0 · 必会主线L2 · 进阶

Redis 事务与 Lua:中途失败后,哪些修改还在

通过一条故意失败的命令观察实际结果,分清连续执行、WATCH 冲突检查与失败回滚。

MULTI 与 EXEC · WATCH 乐观检查 · 运行期错误

单元73
P0 · 必会主线L2 · 进阶

MySQL 隔离与 MVCC:事务读到的是哪一版数据

用两个数据库会话按顺序操作,观察 RC、RR、普通查询和锁定查询分别能看到哪一版数据。

ACID 边界 · RC 与 RR · 一致性读

单元74
P0 · 必会主线L2 · 进阶

MySQL 锁与死锁:为什么等待,失败后怎样重试

用两笔事务反向更新数据看懂死锁,再区分锁等待超时与死锁的回滚范围,决定怎样重新执行。

记录锁 · 间隙锁 · next-key lock

单元75
P1 · 重点提升L2 · 进阶

MySQL 慢查询排查:时间到底花在哪里

先量出请求在哪一步花时间,再用慢日志、执行计划和等待记录判断该改 SQL、处理锁,还是调整应用排队。

请求时间窗口 · 慢查询日志 · 语句摘要

单元76
P1 · 重点提升L2 · 进阶

Redis 持久化与恢复:备份能不能真的用起来

按允许丢多少数据、多久恢复来比较 RDB、AOF 和副本,再在隔离环境核对恢复的值与有效期。

RDB 快照 · AOF 追加 · fsync 策略

单元77
P1 · 重点提升L2 · 进阶

Redis Cluster:键存在哪里,多键怎样一起操作

先分清分片和副本,再看槽怎样决定请求去向,以及需要一起操作的多个键为何必须提前规划。

16384 哈希槽 · 节点与分片 · MOVED 与 ASK

单元78
P0 · 必会主线L2 · 进阶

黑马点评:先画业务与数据导图

按用户的实际操作串起项目,再画清用户、商户、笔记和订单的关系,理解数据为什么这样保存。

用户与商户 · 评价与关注 · 券与订单

单元79
P0 · 必会主线L2 · 进阶

黑马点评:商户缓存与一致性边界

从商户详情的读写流程出发,分清没缓存、缓存不存在和缓存旧值,再检查更新与删除之间的失败窗口。

Cache Aside · 未命中与空值标记 · 穿透

单元80
P0 · 必会主线L2 · 进阶

黑马点评:秒杀 Lua 与数据库唯一约束

用 Lua 保护 Redis 内的检查和预扣,再由数据库约束、条件更新和事务确保最终订单与库存一致。

库存校验 · Lua 原子执行 · 重复购买集合

单元81
P1 · 重点提升L2 · 进阶

黑马点评:点赞、关注与滚动 Feed

先正确记录谁点过赞、关注了谁,再处理 Feed 的排序和翻页边界,避免重复计数或漏掉同一时间的内容。

ZSet 点赞 · 成员去重 · Set 关注关系

单元82
P1 · 重点提升L2 · 进阶

黑马点评:附近商户、签到、UV 与复盘

按业务分别使用 GEO、Bitmap 和 HyperLogLog,检查距离、连续天数与近似访客统计各自的限制。

经度与纬度 · GEOSEARCH · 数据库详情回查

单元83
P0 · 必会主线L2 · 进阶

RabbitMQ 可靠消费:确认、重试与死信各管哪一段

分别确认发布、路由和消费的结果,再处理重复投递与永久失败,理解为什么提交数据库后仍可能收到重投。

Publisher Confirm · mandatory return · 手动 ack

单元84
P1 · 重点提升L2 · 进阶

Kafka 分区与消费组:并行能力从哪里来

用分区和消费组看懂实例怎样分工,再检查扩容是否增加并行,以及同一业务的顺序是否仍能保证。

分区日志 · 分区内顺序 · 消息 key

单元85
P1 · 重点提升L2 · 进阶

Spring Cloud 起点:服务发现与配置中心各解决什么

分清查找服务地址和读取运行配置,再沿实例发现、选择、连接和配置实际生效逐步验证。

注册与发现 · DiscoveryClient · 负载均衡

单元86
P0 · 必会主线L2 · 进阶

网关认证:验证身份之后还要守住哪些入口

先验证令牌确实适用于本系统,再可靠传递身份,并在下游继续检查资源权限和绕过网关的入口。

路由过滤器 · JWT 校验 · issuer 与 audience

单元87
P0 · 必会主线L2 · 进阶

JMM 与 volatile:先区分可见性,再讨论原子性

从一个线程发布结果、另一个线程读取入手,理解 JMM 的可见性保证,以及 volatile 为什么保护不了 count++。

共享变量 · 数据竞争 · happens-before

单元88
P0 · 必会主线L2 · 进阶

synchronized 与监视器:互斥、等待和唤醒要用同一套条件

用单槽邮箱理解锁对象、wait 与唤醒,始终在同一套同步规则下检查条件、修改状态和发通知。

对象监视器 · 实例锁与类锁 · 可重入

单元89
P0 · 必会主线L2 · 进阶

JUC 锁与 CAS:保护的是变量还是完整业务规则

先写清库存、余额等数据必须共同满足的规则,再判断互斥锁或 CAS 能否保护完整操作。

互斥锁 · 可重入 · finally 解锁

单元90
P0 · 必会主线L2 · 进阶

线程协作与中断:用明确协议等待结果并结束任务

先明确线程等待的条件,再选择协作工具,给任务安排有界提交、超时、中断响应和资源清理。

中断标志 · InterruptedException · 保留中断

单元91
P0 · 必会主线L2 · 进阶

线程池:队列容量、扩容与拒绝策略如何决定结果

按线程、队列和等待时间一起规划容量,再决定忙不过来时怎样明确拒绝或放慢提交。

核心线程 · 工作队列 · 最大线程

单元92
P0 · 必会主线L2 · 进阶

并发集合:容器安全不代表跨调用业务自动原子

用计数更新看懂并发集合能保护哪一次操作,再检查多次调用、多个键和可变 value 是否仍会相互影响。

ConcurrentHashMap · putIfAbsent · compute 与 merge

单元93
P0 · 必会主线L2 · 进阶

ThreadLocal 与线程复用:请求结束后清理身份上下文

用线程连续处理不同用户的例子,看清 ThreadLocal 为什么要清理,以及异步和嵌套调用怎样传递、恢复上下文。

线程绑定值 · 线程复用 · try finally remove

单元94
P0 · 必会主线L2 · 进阶

黑马点评:短信登录与 Redis 用户态 DTO

分清验证码、会话令牌和 UserDTO,沿登录保存、每次请求读取、到请求结束清理走完流程。

验证码与限流 · 随机登录令牌 · UserDTO

单元95
P1 · 重点提升L2 · 进阶

CompletableFuture:组合任务、传播失败与管理超时

按先后依赖和独立汇合来组织异步任务,再处理失败、线程选择和超时,避免 Future 完成与业务完成混淆。

thenApply · thenCompose · thenCombine

单元96
P0 · 必会主线L2 · 进阶

JVM 内存与类加载:把规范概念和实现细节分开

按职责理解堆、栈和方法区,再分清类加载、链接与初始化,避免把 JVM 规范和某种实现混为一谈。

堆 · 虚拟机栈 · 方法区

单元97
P1 · 重点提升L2 · 进阶

GC 与日志:先读出分配和停顿,再调整参数

先看对象为何还被保留,再把 GC 停顿与真实请求时间对应,在相同负载下比较回收表现。

可达性 · 分配速率 · 存活集

单元98
P0 · 必会主线L2 · 进阶

Spring 集成测试:用真实边界验证数据库与 HTTP 行为

用真实 MySQL 容器和需要的 HTTP 环境验证数据库与接口行为,同时处理测试数据隔离和回滚范围。

测试切片 · SpringBootTest · 随机端口

单元99
P0 · 必会主线L2 · 进阶

常见 API 漏洞:权限、SQL 与外部访问分别检查

分别检查资源权限、可修改字段、SQL 参数和服务器外部访问,用应被拒绝的请求验证规则是否生效。

对象级授权 · 属性级授权 · 参数化 SQL

单元100
P0 · 必会主线L2 · 进阶

Docker 交付入门:镜像、网络与数据卷分别负责什么

把已测试的 Java 应用做成镜像,再分清容器网络、端口和数据卷,确保部署的是同一份内容。

镜像与容器 · Dockerfile 层 · Java 17 运行时

单元101
P1 · 重点提升L2 · 进阶

CI、发布与监控:怎样确认这次上线可用

从固定构建结果开始,按就绪、真实请求和回退条件检查发布,并分清应用回滚与数据库恢复。

流水线 job 与 step · 构建一次 · 不可变制品

L3 · 深入

进入机制、诊断与权衡,用证据判断复杂设计是否必要。

14 篇
单元102
P2 · 按需深入L3 · 深入

泛型方法:写清类型关系,减少强制转换

让泛型方法写清输入输出的关系,再理解类型上界、运行时信息和未检查转换为什么可能留下错误。

方法类型参数 · Comparable 递归上界 · 类型参数与通配符联系

单元103
P2 · 按需深入L3 · 深入

注解如何生效:谁读取,何时读取

先找出谁在读取注解,再理解保留阶段、重复注解和编译期处理,避免以为加上标记就会自动生效。

Target 与 Retention · 默认 CLASS 策略 · Documented 用途

单元104
P2 · 按需深入L3 · 深入

字符编码与 ByteBuffer:分块读取怎样避免乱码

用被分成两次读取的汉字理解乱码,再看懂 ByteBuffer 的读写范围和连续解码方法。

变长编码与跨块字符 · CharsetDecoder 增量解码 · REPORT 与 REPLACE

单元105
P1 · 重点提升L3 · 深入

分布式锁到期后:怎样挡住旧任务的写入

用旧线程暂停后又恢复的例子,理解锁到期为什么不等于任务停止,以及资源端怎样拒绝旧写入。

SET NX PX · 唯一持有者令牌 · 比较删除

单元106
P0 · 必会主线L3 · 深入

黑马点评:分布式锁与异步订单可靠性

沿着拿锁、写数据库和确认消息的顺序,检查程序暂停或重试时会发生什么,并防止重复下单。

锁持有者令牌 · 租约窗口 · Stream 消费组

单元107
P1 · 重点提升L3 · 深入

黑马点评演练:缓存失效时,数据库会承受多少请求

分别模拟不存在的商户、热点过期和缓存不可用,在同一时间段同时检查数据正确性与数据库压力。

隔离压测数据 · 基线 · 穿透实验

单元108
P1 · 重点提升L3 · 深入

RocketMQ 进阶消息:顺序、延迟与事务的适用边界

分别用订单先后、超时检查和提交后发事件的需求,理解顺序、延迟与事务消息能保证到哪一步。

消息组顺序 · 生产串行 · 消费串行

单元109
P1 · 重点提升L3 · 深入

Kafka offset 与幂等:一次处理的边界究竟在哪里

分清读到、业务完成和提交恢复位置,再检查 Kafka 幂等与事务究竟覆盖哪些操作、哪些还要自己保证。

当前位置 · 已提交 offset · 下一条位置

单元110
P0 · 必会主线L3 · 深入

消息消费幂等与重放:把重复投递变成可判断的业务状态

用固定事件编号认出重复操作,把去重记录与业务修改一起提交,再为重放、乱序和冲突规定处理方式。

事件唯一 ID · 消费去重表 · 同一数据库事务

单元111
P1 · 重点提升L3 · 深入

黑马点评演练:程序中断后,异步订单怎样恢复

分别模拟提交前中断、提交后未确认和永久失败,再核对订单、库存与消息记录能否正确恢复。

固定业务事件 ID · 状态转移 · 提交前崩溃

单元112
P0 · 必会主线L3 · 深入

远程调用治理:超时、重试与熔断如何配合

先设整个请求的等待上限,再判断重试会不会重复写入,并用熔断和资源配额限制故障影响。

连接超时 · 读取超时 · 总截止时间

单元113
P1 · 重点提升L3 · 深入

可观测性与一致性:一次跨服务请求如何留下证据

把指标、日志和追踪对应到一次跨服务请求,再用持久业务记录确认订单是否完成,避免只看某段调用成功。

trace 与 span · 上下文传播 · 采样

单元114
P1 · 重点提升L3 · 深入

Java 死锁:找出谁在等谁,再统一拿锁顺序

从线程记录画出谁在等谁,分清普通等待、死锁和任务饥饿,再用统一拿锁顺序消除等待环。

互斥资源 · 持有并等待 · 循环等待

单元115
P1 · 重点提升L3 · 深入

性能诊断与 OOM:先定位资源,再选择证据工具

先辨认 CPU、等待或哪类内存出了问题,再用线程记录、JFR 或内存分析追到具体资源和引用关系。

CPU 与等待 · 线程转储 · JFR

学习笔记 · 整理于 2026.09.26
难度与重要程度服务于学习排序。用练习结果验证掌握情况,再决定是否进入下一篇。