Engineering notes
Coding
Java、数据库、分布式系统和工程实践的长期笔记。
领域驱动设计
DDD 是什么 传统的 MVC MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码,其中 Model 是数据库模型,View 层负责视图展示,而业务
Java ThreadLocal
共享变量在多线程环境下容易出现并发问题,ThreadLocal为每个线程创建独立的存储空间,用以存储线程本地变量,多个线程之间互不干扰,从而避免了线程安全问题。 每个 Thread 内部都有一个 ThreadLocalMap 对象 th
MySQL DDL 执行方式
本篇文章主要是由于近期组内线上的 MySQL 变更,导致主从延迟,产生业务问题,而引发的思考,重新复习了一下 ,以及主从延迟和 DDL 语句的执行方式。 DDL 执行原理 Copy 在MySQL 5.6.7 版本之前,DDL 操作采用
MySQL 锁机制
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数
Redis 缓存迁移实践
背景 由于组织架构等历史原因,所在业务的一个核心服务和另一业务线的多个服务是共用了一个 Redis 集群,前段时间该集群发生了连接数过高等问题,为了避免其它业务的服务干扰 Redis 集群进而影响我们自己业务,需要将该服务所使用的 Re
关于网关
网关概述 四层网关 也被称为传输层网关,主要工作在OSI模型的传输层,处理TCP/UDP等传输层协议,典型的有阿里SLB、腾讯VGW等。 它基于IP地址和端口号进行请求的转发,不关心应用层协议的具体内容。四层网关通过监听特定的IP地址和
Java Stream 流
介绍 Java Stream 流是一组结合Lambda表达式,简化集合、数组操作的API,可以以声明的方式处理数据,类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。流的特点有: 不是数据结
Elasticsearch 学习
概述 Elasticsearch(简称ES)是一个分布式、高扩展、近实时的搜索与数据分析引擎,它能很方便的使大量数据具有搜索、分析和探索的能力,充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。ES的使用场
Mock 测试
前言 错误率恒定定律 :程序员的错误产出比是个常数 规模代价平方定律 :定位并修复一个BUG所需的代价正比于目标代码规模的平方 错误率恒定定律告诉我们错误是不可避免的,而规模代价平方定律告诉我们要尽早发现错误。单元测试作为一个行之有效的
JVM 垃圾回收
垃圾回收算法 标记 清除 Mark Sweep,分为两步:首先标记出需要回收的对象;标记完成后,统一回收被标记的对象。实现简单,但两个过程的执行效率都随对象数量增长而降低,并且会造成内存碎片。 标记 复制 Mark Copy,核心思想是
Java 引用类型
引用概述 Java中有四种引用类型,它们分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型都有其特
JVM 运行时数据区
总览 java 源文件经过编译后变成静态的 class 字节码文件,JVM 在启动时经过加载、链接、初始化,把字节码数据加载进内存,称为 JVM 运行时数据区,最后,执行引擎(解释器 + JIT)不断和内存数据进行交互从而执行程序。 运
Synchronized 锁机制
为了避免临界区的竞态条件发生,可以用非阻塞式的原子变量,也可以用阻塞式的锁。Java 多线程的锁都是 对象锁 ,采用互斥的方式让同一时刻只有一个线程能够持有对象锁,从而进入临界区,而其它线程只能阻塞等待,因此不用担心线程上下文切换造成共
Thread 源码阅读
线程是操作系统进行调度的最小单位,Java 中的 Thread 是对操作系统线程的封装,很多实际的控制是靠底层 Native 方法实现的,因此 Java 的 Thread 类还是比较简单的。 成员 Thread 内部的成员变量还是比较多
Hive SQL 语法大全
本文档基于 + 整理。 基于语法描述说明 如上语法,在语法描述中出现: [] ,表示可选,如上 [LOCATION] 表示可写、可不写 ,表示或,如上 ASC DESC ,表示二选一 ...,表示序列,即未完结,如上 SELECT ex
Linux 命令备忘录
more mkdir find grep wc & tail tr tar Linux 常用的压缩格式包括 tar 归档文件(tarball,仅封装不压缩)、gz 格式压缩(gzip)等。 vim 三种工作模式: 命令模式:所敲的按键编
大数据 - Hadoop 概述
大数据 人类的行为及产生的事件的一种记录称之为数据,对数据的内容进行深入分析,可以更好的帮助了解事和物在现实世界的运行规律。 大数据 就是对超大规模的数据进行处理并挖掘出数据背后价值的技术体系,是信息化时代的基础支撑,以数据为生活赋能。
ThreadPoolExecutor 源码分析
概述 Java 的线程池是一种基于池化思想,用于管理和重用线程的机制。使用线程池可以带来一系列好处: 1. 降低资源消耗 :通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。 2. 提高响应速度 :任务到达时,无需等待线程
LockSupport 源码阅读
概述 LockSupport 是 Java 并发包中提供的一个工具类,用于支持线程的阻塞和唤醒操作,通常与其他同步工具一起使用,例如 ReentrantLock 、 Condition 等,以实现更复杂的线程协作。 LockSuppor
Unsafe 源码阅读
Unsafe 是 JDK 提供了一个工具类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升 Java 运行效率、增强 Java 语言底层资源操作能力方面起到了很大的作用。但由于
AQS 源码解析
JDK 14 的 AQS 相比 JDK 8 有了较大的改进,之后一直到 JDK 17 都没有改动,本文以 JDK 17 的源码为例,学习 AQS 的设计。前置知识: 、 、常用的锁工具如 ReentrantLock 基本用法。 概述 A
Pro Git 阅读笔记
闲来无事,读一读 Git Pro —— Git 圣经,记录一些以前没有注意过的问题和底层实现的原理。 起步 特点 Git 和其它版本控制系统在对待数据的方式上有很大的区别,大部分 VCS 系统(如 CVS、Subversion、Perf
Guava 笔记
基本工具 Optional Guava 的 Optional 是用来处理可能为 null 值的容器类,在业务代码里,应该明确区分 null 和 空 的含义,避免混淆 null/空 的语义,提高程序的健壮性。JDK 8 开始也提供了 Op
MyBatis 深入学习
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口
Netty 网络框架 02
粘包半包 现象 粘包 现象,发送 abc def ,接收 abcdef 原因 应用层:接收方 ByteBuf 设置太大(Netty 默认 1024) 滑动窗口:假设发送方 256 bytes 表示一个完整报文,但由于接收方处理不及时且窗
Netty 网络框架 01
概述 Netty 是什么? Netty is an asynchronous event driven network application framework for rapid development of maintainabl
Java NIO
三大组件 Channel channel 类似 BIO 的 stream,可以作为数据源,是读写数据的 双向通道 。 常见的 Channel: FileChannel DatagramChannel SocketChannel Serv
Guide-RPC 代码阅读
项目地址: 项目结构 example client : 客户端示例 HelloController NettyClient SocketClient examle server :服务端示例 HelloServiceImpl Netty
MQ-Kafka
简介 Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。同时也是一个开源的分布式事件流平台(Event Streaming Platform),用于高性能数据管道、流分析、数据集成和关键任务应用。 更多
Java 日志框架
日志框架 设计模式 正式进入 Java 日志之前,先了解几个日志相关的设计模式。 门面模式 门面模式(Facade Pattern)是一种结构型设计模式,也称外观模式。它提供了一个统一的接口,用于访问子系统中的一群接口,隐藏了系统的复杂
Spring 事务
事务基础 事务是逻辑上的一组操作,要么都执行,要么都不执行。典型场景是一个方法中包含多个insert,update,delete操作通过添加事务保证原子性,要么全部成功,要么全部失败。比如在往数据库里添加数据时,需要级联得添加若干数据,
Code Review
风格 if 后面哪怕只有一条语句,也要加上大括号 判等时,只要有一方是对象,就尽量用 equals 日期转换统一使用 DateUtils 工具类 尽量使用各种工具类,如 Objects.isNull, StringUtils.isNot
Zookeeper 学习笔记
基本介绍 概念 ZooKeeper 是一种分布式协调服务,用于管理大型主机,目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。在分布式环境中协调和管理服务是一个复杂的
RPC-Thrift
Thrift 是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务,被当作一个远程过程调用(RPC)框架来使用。 使用步骤 通过 IDL 定义需要远程方法调用的接口 通过 thrift 编译器生成代码,包含接口定义、Cli
手撸 Spring 项目
项目地址: 参考文档: 进度: ✅ IoC ✅ AOP ✅ 其它 IoC 部分 BeanFactory 类图 完整版类图: 简化版类图如下,主要间接继承 BeanFactory 和 SingletonBeanRegistry 两个接口。
分布式事务
本地事务 在单体应用中,多个业务操作使用同一条连接操作相同数据库中不同的数据表,一旦有异常可以很容易实现整体回滚。 事务特征 1. 原子性:事务中包含的操作要么全部执行,要么全部不执行 2. 一致性:事务执行前后,数据库的完整性没有被破
消息队列概述
介绍 消息队列是一种进程间通信或同一进程的不同线程间的通信方式,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。消息发布者只管把消息发布到 MQ 中而不用管谁来取
认证登录
短信验证码 前端通过阿里云 API 发送短信验证码,并缓存到 Redis(根据缓存时间防止接口被刷) 用户点击注册后校验验证码和其它信息 校验通过后,用 Spring Security 对密码进行 MD5 加盐加密,最后存入 DB 登录
分布式缓存
缓存分类 缓存之所以能够加快系统速度,本质原因在于: 减小了 CPU 消耗:将原来需要实时计算的内容提前准备好,复用公用的数据,减少 CPU 消耗,从而提升响应性能 减小了 I/O 消耗:将原来对网络、磁盘等慢速介质的读写访问变为对内存
面试八股
实习 目的地搜索优化 以前用户在搜索机场数据时,只会展示对应的城市机场信息,新的需求是用户在搜索某个景点信息时,展示对应城市的机场信息。另外优化了两个问题: 邻近机场距离由机场 邻近城市 机场 邻近机场:增加near airport d
Redis 独立功能
发布与订阅 Redis的发布订阅功能由PUBLISH, SUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE等命令实现,客户端可以订阅一个或多个频道/模式,服务器根据是否订阅频道、模式是否匹配,决定是否发送给指定客户端
Redis 多机
复制 Redis中可以使用 SLAVEOF 实现主从复制,复制功能分两个操作: 同步:将从服务器的数据库状态更新至主服务器的最新状态 命令传播:在主服务器的数据库状态被修改,导致主从不一致时,让主从数据库重新回到一致状态 旧版复制实现
Redis 单机
数据库 实现 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。数组长度(数据库数量)
Redis 数据结构
简单动态字符串 定义 Redis仅使用C字符串作为字面量,大多数情况下,使用 SDS Simple Dynamic String 简单动态字符串作为字符串表示。 len:记录buf数组中已使用字节数,等于SDS保存字符串的长度 free
MySQL 深入原理
配置文件与变量 一般是安装目录或用户home目录下的 ini/cnf 文件,不同目录下的配置文件有优先级顺序,命令行中的参数优先级最高,多个组重复选项则后出现的优先级高。选项只能使用长形式。 配置文件中大多数选项对应了MySQL中的某个
Windows-WSL 实现MySQL主从同步
本文介绍 Windows 连接 WSL 中的 MySQL 服务,并配置主从同步。 Step0. 调整WSL下MySQL的密码安全策略 可选 Linux下,MySQL默认的强密码策略比较麻烦,如果只在自己机器上实验可以先修改一下密码校验策
LeetCode-排列组合
排列组合问题 子集、组合、排列 问题就是从序列中以给定规则取若干元素构成集合的集合。本质上就是穷举所有解,而这些解呈现树形结构,因此合理使用回溯算法框架就可以一网打尽。 主要记住下面两棵 回溯树 ,所有问题都是这两棵树的变种,关键在于剪
MySQL 基础
概述 名称 简介 : : : DB 存储数据的仓库,对数据进行有组织的存储 DBMS 操纵和管理数据库的大型软件 SQL 操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准 关系型数据库 :建立在关系模型基础上,由多张相互
Java 并发学习
基本概念 + 并发:多个任务交替执行 (微观串行,宏观并行) + 并行:多个任务同时执行 同步:一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为 异步:一旦开始,调用就会立即返回,调用者可以继续后续的操作 临界区:存在对共享资
手撕算法
数据结构 \[I]: 接口 \[C]: 类 其中,Vector、Stack、HashTable线程安全,但已经基本不用了。 数组 Array或ArrayList get和set操作时间上都是O(1) add和remove都是O(N) A
Java 虚拟机笔记
内存结构 见: 垃圾回收 对象存活判断 引用计数法 引用计数法为每个对象维护一个引用计数器,记录该对象当前被引用的次数。每当创建一个新的引用指向该对象时,其计数器加 1;每当指向该对象的引用失效时,计数器减 1。当对象的引用计数器为 0
LeetCode-位运算
LeetCode 136. 只出现一次的数字 链接:https://leetcode.cn/problems/single number/ 找出数组中唯一成单的数字,主要学习异或运算的性质和哈希表的使用。 解法1. 异或运算 异或运算的
Java 基础
数据类型 1. 引用数据类型 2. 基本数据类型 4大类8种 (1 2 4 8) + 自动类型转换:类型范围小的变量,可以直接赋值给类型范围大的变量 byte short (char) int long float double + 在