Engineering notes

Coding

Java、数据库、分布式系统和工程实践的长期笔记。

Coding

领域驱动设计

DDD 是什么 传统的 MVC MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码,其中 Model 是数据库模型,View 层负责视图展示,而业务

2025.11.23 · 16 min
Coding

Java ThreadLocal

共享变量在多线程环境下容易出现并发问题,ThreadLocal为每个线程创建独立的存储空间,用以存储线程本地变量,多个线程之间互不干扰,从而避免了线程安全问题。 每个 Thread 内部都有一个 ThreadLocalMap 对象 th

2025.11.15 · 3 min
Coding

MySQL DDL 执行方式

本篇文章主要是由于近期组内线上的 MySQL 变更,导致主从延迟,产生业务问题,而引发的思考,重新复习了一下 ,以及主从延迟和 DDL 语句的执行方式。 DDL 执行原理 Copy 在MySQL 5.6.7 版本之前,DDL 操作采用

2025.05.25 · 2 min
Coding

MySQL 锁机制

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数

2025.05.11 · 7 min
Coding

Redis 缓存迁移实践

背景 由于组织架构等历史原因,所在业务的一个核心服务和另一业务线的多个服务是共用了一个 Redis 集群,前段时间该集群发生了连接数过高等问题,为了避免其它业务的服务干扰 Redis 集群进而影响我们自己业务,需要将该服务所使用的 Re

2025.03.09 · 3 min
Coding

关于网关

网关概述 四层网关 也被称为传输层网关,主要工作在OSI模型的传输层,处理TCP/UDP等传输层协议,典型的有阿里SLB、腾讯VGW等。 它基于IP地址和端口号进行请求的转发,不关心应用层协议的具体内容。四层网关通过监听特定的IP地址和

2024.12.08 · 5 min
Coding

Java Stream 流

介绍 Java Stream 流是一组结合Lambda表达式,简化集合、数组操作的API,可以以声明的方式处理数据,类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。流的特点有: 不是数据结

2024.10.28 · 7 min
Coding

Elasticsearch 学习

概述 Elasticsearch(简称ES)是一个分布式、高扩展、近实时的搜索与数据分析引擎,它能很方便的使大量数据具有搜索、分析和探索的能力,充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。ES的使用场

2024.08.15 · 9 min
Coding

Mock 测试

前言 错误率恒定定律 :程序员的错误产出比是个常数 规模代价平方定律 :定位并修复一个BUG所需的代价正比于目标代码规模的平方 错误率恒定定律告诉我们错误是不可避免的,而规模代价平方定律告诉我们要尽早发现错误。单元测试作为一个行之有效的

2024.07.14 · 5 min
Coding

JVM 垃圾回收

垃圾回收算法 标记 清除 Mark Sweep,分为两步:首先标记出需要回收的对象;标记完成后,统一回收被标记的对象。实现简单,但两个过程的执行效率都随对象数量增长而降低,并且会造成内存碎片。 标记 复制 Mark Copy,核心思想是

2024.03.12 · 10 min
Coding

Java 引用类型

引用概述 Java中有四种引用类型,它们分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型都有其特

2024.03.06 · 6 min
Coding

JVM 运行时数据区

总览 java 源文件经过编译后变成静态的 class 字节码文件,JVM 在启动时经过加载、链接、初始化,把字节码数据加载进内存,称为 JVM 运行时数据区,最后,执行引擎(解释器 + JIT)不断和内存数据进行交互从而执行程序。 运

2024.03.02 · 7 min
Coding

Synchronized 锁机制

为了避免临界区的竞态条件发生,可以用非阻塞式的原子变量,也可以用阻塞式的锁。Java 多线程的锁都是 对象锁 ,采用互斥的方式让同一时刻只有一个线程能够持有对象锁,从而进入临界区,而其它线程只能阻塞等待,因此不用担心线程上下文切换造成共

2024.01.05 · 5 min
Coding

Thread 源码阅读

线程是操作系统进行调度的最小单位,Java 中的 Thread 是对操作系统线程的封装,很多实际的控制是靠底层 Native 方法实现的,因此 Java 的 Thread 类还是比较简单的。 成员 Thread 内部的成员变量还是比较多

2023.12.23 · 3 min
Coding

Hive SQL 语法大全

本文档基于 + 整理。 基于语法描述说明 如上语法,在语法描述中出现: [] ,表示可选,如上 [LOCATION] 表示可写、可不写 ,表示或,如上 ASC DESC ,表示二选一 ...,表示序列,即未完结,如上 SELECT ex

2023.12.22 · 10 min
Coding

Linux 命令备忘录

more mkdir find grep wc & tail tr tar Linux 常用的压缩格式包括 tar 归档文件(tarball,仅封装不压缩)、gz 格式压缩(gzip)等。 vim 三种工作模式: 命令模式:所敲的按键编

2023.12.15 · 1 min
Coding

大数据 - Hadoop 概述

大数据 人类的行为及产生的事件的一种记录称之为数据,对数据的内容进行深入分析,可以更好的帮助了解事和物在现实世界的运行规律。 大数据 就是对超大规模的数据进行处理并挖掘出数据背后价值的技术体系,是信息化时代的基础支撑,以数据为生活赋能。

2023.12.14 · 11 min
Coding

ThreadPoolExecutor 源码分析

概述 Java 的线程池是一种基于池化思想,用于管理和重用线程的机制。使用线程池可以带来一系列好处: 1. 降低资源消耗 :通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。 2. 提高响应速度 :任务到达时,无需等待线程

2023.12.08 · 20 min
Coding

LockSupport 源码阅读

概述 LockSupport 是 Java 并发包中提供的一个工具类,用于支持线程的阻塞和唤醒操作,通常与其他同步工具一起使用,例如 ReentrantLock 、 Condition 等,以实现更复杂的线程协作。 LockSuppor

2023.12.04 · 2 min
Coding

Unsafe 源码阅读

Unsafe 是 JDK 提供了一个工具类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升 Java 运行效率、增强 Java 语言底层资源操作能力方面起到了很大的作用。但由于

2023.12.03 · 3 min
Coding

AQS 源码解析

JDK 14 的 AQS 相比 JDK 8 有了较大的改进,之后一直到 JDK 17 都没有改动,本文以 JDK 17 的源码为例,学习 AQS 的设计。前置知识: 、 、常用的锁工具如 ReentrantLock 基本用法。 概述 A

2023.11.25 · 5 min
Coding

Pro Git 阅读笔记

闲来无事,读一读 Git Pro —— Git 圣经,记录一些以前没有注意过的问题和底层实现的原理。 起步 特点 Git 和其它版本控制系统在对待数据的方式上有很大的区别,大部分 VCS 系统(如 CVS、Subversion、Perf

2023.11.09 · 11 min
Coding

Guava 笔记

基本工具 Optional Guava 的 Optional 是用来处理可能为 null 值的容器类,在业务代码里,应该明确区分 null 和 空 的含义,避免混淆 null/空 的语义,提高程序的健壮性。JDK 8 开始也提供了 Op

2023.11.04 · 9 min
Coding

MyBatis 深入学习

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口

2023.10.26 · 13 min
Coding

Netty 网络框架 02

粘包半包 现象 粘包 现象,发送 abc def ,接收 abcdef 原因 应用层:接收方 ByteBuf 设置太大(Netty 默认 1024) 滑动窗口:假设发送方 256 bytes 表示一个完整报文,但由于接收方处理不及时且窗

2023.10.12 · 22 min
Coding

Netty 网络框架 01

概述 Netty 是什么? Netty is an asynchronous event driven network application framework for rapid development of maintainabl

2023.09.25 · 20 min
Coding

Java NIO

三大组件 Channel channel 类似 BIO 的 stream,可以作为数据源,是读写数据的 双向通道 。 常见的 Channel: FileChannel DatagramChannel SocketChannel Serv

2023.09.15 · 12 min
Coding

Guide-RPC 代码阅读

项目地址: 项目结构 example client : 客户端示例 HelloController NettyClient SocketClient examle server :服务端示例 HelloServiceImpl Netty

2023.09.07 · 5 min
Coding

MQ-Kafka

简介 Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。同时也是一个开源的分布式事件流平台(Event Streaming Platform),用于高性能数据管道、流分析、数据集成和关键任务应用。 更多

2023.08.01 · 20 min
Coding

Java 日志框架

日志框架 设计模式 正式进入 Java 日志之前,先了解几个日志相关的设计模式。 门面模式 门面模式(Facade Pattern)是一种结构型设计模式,也称外观模式。它提供了一个统一的接口,用于访问子系统中的一群接口,隐藏了系统的复杂

2023.07.29 · 10 min
Coding

Spring 事务

事务基础 事务是逻辑上的一组操作,要么都执行,要么都不执行。典型场景是一个方法中包含多个insert,update,delete操作通过添加事务保证原子性,要么全部成功,要么全部失败。比如在往数据库里添加数据时,需要级联得添加若干数据,

2023.07.16 · 14 min
Coding

Code Review

风格 if 后面哪怕只有一条语句,也要加上大括号 判等时,只要有一方是对象,就尽量用 equals 日期转换统一使用 DateUtils 工具类 尽量使用各种工具类,如 Objects.isNull, StringUtils.isNot

2023.07.15 · 1 min
Coding

Zookeeper 学习笔记

基本介绍 概念 ZooKeeper 是一种分布式协调服务,用于管理大型主机,目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。在分布式环境中协调和管理服务是一个复杂的

2023.07.02 · 10 min
Coding

RPC-Thrift

Thrift 是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务,被当作一个远程过程调用(RPC)框架来使用。 使用步骤 通过 IDL 定义需要远程方法调用的接口 通过 thrift 编译器生成代码,包含接口定义、Cli

2023.06.07 · 2 min
Coding

手撸 Spring 项目

项目地址: 参考文档: 进度: ✅ IoC ✅ AOP ✅ 其它 IoC 部分 BeanFactory 类图 完整版类图: 简化版类图如下,主要间接继承 BeanFactory 和 SingletonBeanRegistry 两个接口。

2023.05.27 · 8 min
Coding

分布式事务

本地事务 在单体应用中,多个业务操作使用同一条连接操作相同数据库中不同的数据表,一旦有异常可以很容易实现整体回滚。 事务特征 1. 原子性:事务中包含的操作要么全部执行,要么全部不执行 2. 一致性:事务执行前后,数据库的完整性没有被破

2023.04.26 · 9 min
Coding

消息队列概述

介绍 消息队列是一种进程间通信或同一进程的不同线程间的通信方式,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。消息发布者只管把消息发布到 MQ 中而不用管谁来取

2023.04.19 · 14 min
Coding

认证登录

短信验证码 前端通过阿里云 API 发送短信验证码,并缓存到 Redis(根据缓存时间防止接口被刷) 用户点击注册后校验验证码和其它信息 校验通过后,用 Spring Security 对密码进行 MD5 加盐加密,最后存入 DB 登录

2023.04.15 · 5 min
Coding

分布式缓存

缓存分类 缓存之所以能够加快系统速度,本质原因在于: 减小了 CPU 消耗:将原来需要实时计算的内容提前准备好,复用公用的数据,减少 CPU 消耗,从而提升响应性能 减小了 I/O 消耗:将原来对网络、磁盘等慢速介质的读写访问变为对内存

2023.04.14 · 7 min
Coding

面试八股

实习 目的地搜索优化 以前用户在搜索机场数据时,只会展示对应的城市机场信息,新的需求是用户在搜索某个景点信息时,展示对应城市的机场信息。另外优化了两个问题: 邻近机场距离由机场 邻近城市 机场 邻近机场:增加near airport d

2023.03.10 · 139 min
Coding

Redis 独立功能

发布与订阅 Redis的发布订阅功能由PUBLISH, SUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE等命令实现,客户端可以订阅一个或多个频道/模式,服务器根据是否订阅频道、模式是否匹配,决定是否发送给指定客户端

2023.02.23 · 10 min
Coding

Redis 多机

复制 Redis中可以使用 SLAVEOF 实现主从复制,复制功能分两个操作: 同步:将从服务器的数据库状态更新至主服务器的最新状态 命令传播:在主服务器的数据库状态被修改,导致主从不一致时,让主从数据库重新回到一致状态 旧版复制实现

2023.02.20 · 16 min
Coding

Redis 单机

数据库 实现 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。数组长度(数据库数量)

2023.02.16 · 13 min
Coding

Redis 数据结构

简单动态字符串 定义 Redis仅使用C字符串作为字面量,大多数情况下,使用 SDS Simple Dynamic String 简单动态字符串作为字符串表示。 len:记录buf数组中已使用字节数,等于SDS保存字符串的长度 free

2023.02.13 · 8 min
Coding

MySQL 深入原理

配置文件与变量 一般是安装目录或用户home目录下的 ini/cnf 文件,不同目录下的配置文件有优先级顺序,命令行中的参数优先级最高,多个组重复选项则后出现的优先级高。选项只能使用长形式。 配置文件中大多数选项对应了MySQL中的某个

2023.01.28 · 27 min
Coding

Windows-WSL 实现MySQL主从同步

本文介绍 Windows 连接 WSL 中的 MySQL 服务,并配置主从同步。 Step0. 调整WSL下MySQL的密码安全策略 可选 Linux下,MySQL默认的强密码策略比较麻烦,如果只在自己机器上实验可以先修改一下密码校验策

2023.01.20 · 4 min
Coding

LeetCode-排列组合

排列组合问题 子集、组合、排列 问题就是从序列中以给定规则取若干元素构成集合的集合。本质上就是穷举所有解,而这些解呈现树形结构,因此合理使用回溯算法框架就可以一网打尽。 主要记住下面两棵 回溯树 ,所有问题都是这两棵树的变种,关键在于剪

2022.12.31 · 1 min
Coding

MySQL 基础

概述 名称 简介 : : : DB 存储数据的仓库,对数据进行有组织的存储 DBMS 操纵和管理数据库的大型软件 SQL 操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准 关系型数据库 :建立在关系模型基础上,由多张相互

2022.12.03 · 27 min
Coding

Java 并发学习

基本概念 + 并发:多个任务交替执行 (微观串行,宏观并行) + 并行:多个任务同时执行 同步:一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为 异步:一旦开始,调用就会立即返回,调用者可以继续后续的操作 临界区:存在对共享资

2022.11.20 · 15 min
Coding

手撕算法

数据结构 \[I]: 接口 \[C]: 类 其中,Vector、Stack、HashTable线程安全,但已经基本不用了。 数组 Array或ArrayList get和set操作时间上都是O(1) add和remove都是O(N) A

2022.11.17 · 4 min
Coding

Java 虚拟机笔记

内存结构 见: 垃圾回收 对象存活判断 引用计数法 引用计数法为每个对象维护一个引用计数器,记录该对象当前被引用的次数。每当创建一个新的引用指向该对象时,其计数器加 1;每当指向该对象的引用失效时,计数器减 1。当对象的引用计数器为 0

2022.10.25 · 30 min
Coding

LeetCode-位运算

LeetCode 136. 只出现一次的数字 链接:https://leetcode.cn/problems/single number/ 找出数组中唯一成单的数字,主要学习异或运算的性质和哈希表的使用。 解法1. 异或运算 异或运算的

2022.10.16 · 2 min
Coding

Java 基础

数据类型 1. 引用数据类型 2. 基本数据类型 4大类8种 (1 2 4 8) + 自动类型转换:类型范围小的变量,可以直接赋值给类型范围大的变量 byte short (char) int long float double + 在

2022.10.08 · 19 min