MySQL-NULL
参考文献
技术分享 | MySQL默认值选型(是空,还是 NULL)
NULL值
在 MySQL 中的 NULL 是一种特殊的数据.一个字段是否允许为 NULL,字段默认值是否为 NULL.
字段类型
表定义中设置方式
字段值
数值类型 (INT/BIGINT)
Default NULL / Default 0
NULL / NUM
字符类型 (CHAR/VARCHAR)
Default NULL / Default ” / Default ‘ab’
NULL / ” / String
NULL 与空字符存储上的区别
表中如果允许字段为 NULL,会为每行记录分配 NULL 标志位.NULL 除了在每行的行首存有 NULL 标志位,实际存储不占有任何空间.如果表中所有字段都是非 NULL,就不存在这个标示位了
NULL的问题
数值类型,以 INT 列为例
在 min / max / sum / avg 中 NULL 值会被直接忽略掉
对 NULL 做加减操作,如 1 + NULL,结果仍是 NULL
order by 以升序检索字段的时候 NULL ...
MySQL-表维护
参考文献
MySQL 8.0 Cookbook
An Overview of DDL Algorithm’s in MySQL ( covers MySQL 8)
17.12.1 Online DDL Operations
表维护
使用Percona工具包
修改表结构
Linux工具-火焰图
参考文献
https://github.com/brendangregg/FlameGraph
Flame Graph
火焰图的类型
On-CPU火焰图: CPU占用高的问题
Off-CPU火焰图: I/O,网络阻塞,锁竞争,死锁导致的性能下降
内存火焰图: 申请,释放内存多,内存泄漏
Hot/Cold火焰图: 结合On-CPU和Off-CPU火焰图
其他火焰图: JVM,浏览器
如何读火焰图
X轴
由多个方块组成,每个方块表示一个函数
函数在X轴占据的宽度越宽,表示它被采样到的次数越多,可以简单的粗暴的近似理解为执行时间
Y轴
表示函数调用栈,调用栈越深,火焰越高
顶部是CPU正在执行的函数,下方是它的父函数
火焰图生成的步骤
采集堆栈
perf
SystemTap
sample-bt
折叠堆栈
stackcollapse.pl
生成火焰图
flamegraph.pl
Python-argparse
参考文献
https://docs.python.org/3/library/argparse.html
argparse
简单用法
12345678910# 创建解析器parser = argparse.ArgumentParser( prog='ProgramName', description='What the program does', epilog='Text at the bottom of help')# 添加参数parser.add_argument('filename') # positional argumentparser.add_argument('-c', '--count') # option that takes a valueparser.add_argument('-v ...
Java java.util.Comparator
参考文献
Java stream sorted使用 Comparator 进行多字段排序
java.util.Comparator
1234567891011121314151617List<User> list = new ArrayList<>();// 根据单个字段排序 升序list.sort(Comparator.comparing(User::getName));// 根据多个字段排序 升序list.sort(Comparator.comparing(User::getName) .thenComparing(User::getAge));// 根据单个字段排序 降序list.sort(Comparator.comparing(User::getName, Comparator.reverseOrder()));// 根据多个字段排序 升序list.sort(Comparator.comparing(User::getName, Comparator.reverseOrder()) .thenComparing(Us ...
Linux工具-sar
参考文献
sar
sar是System Activity Reporter(系统活动情况报告)的缩写.sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态.它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小
安装
1sudo apt install sysstat
语法格式
1sar -[ options ] time_interval number_of_tines_to_display
查看CPU信息
1234567891011# 输出CPU信息间隔2秒 一共输出5次# sar -u 2 5Linux 5.4.0-150-generic (yw-PowerEdge-R740) 2024年09月06日 _x86_64_ (40 CPU)13时20分04秒 CPU %user %nice %system %iowait %steal %idle13时20分06秒 all 1.13 0.00 0.14 1. ...
架构设计
参考文献
极客时间 架构实战案例解析
架构的本质
通过合理的内部编排,保证系统高度有序,能够不断扩展,满足业务和技术的变化.
首先,架构的出发点是业务和技术在不断复杂化,引起系统混乱,需要通过架构来保证有序.
其次,架构实现从无序到有序,是通过合理的内部编排实现的,基本的手段,就是"分"与"合",先把系统打散,然后将它们重新组合,形成更合理的关系.
"分"就是把系统拆分为各个子系统,模块,组件.
"合"就是基于业务流程和技术手段,把各个组件有机整合在一起.
架构的分类
业务架构(概念)/应用架构(逻辑)/技术架构(物理)
业务架构就是讲清楚核心业务的处理过程,定义各个业务模块的相互关系,它从概念层面帮助我们理解系统面临哪些问题已经如何处理.
应用架构就是讲清楚系统内部是怎么组织的,有哪些应用,相互间是怎么调用的,它从逻辑层面帮助我们理解系统内部是如何分工与协作的.
技术架构就是讲清楚系统由哪些硬件,操作系统和中间件组成,它们是如何和我们开发的应用一起配合,应对各种异常情况,保持 ...
k8s-kubeadm搭建集群
参考文献
环境说明
主机: MBP M1 macOS 14.1.2
拓扑结构: 一个Master节点,一个Node节点
角色
hostname
IP
Master
node-1
192.168.11.173
Node
node-2
192.168.11.174
虚拟机版本: Ubuntu 20.04.5 LTS
系统配置
注: 以下操作需要在所有节点上执行
配置固定IP
配置固定IP,可参考Linux工具-技巧篇中的修改"修改Ubuntu20.04 IP为静态IP"
配置内核模块
创建/etc/modules-load.d/containerd.conf配置文件,确保在系统启动时自动加载所需的内核模块,以满足容器运行时的要求
1234cat << EOF > /etc/modules-load.d/containerd.confoverlaybr_netfilterEOF
执行以下命令使配置生效
12modprobe overlaymodprobe br_netfilter
创建/etc/ ...
MyBatis-缓存
参考文献
聊聊MyBatis缓存机制
Java并发源码分析-线程池源码分析
参考文献
AbstractExecutorService源码解析
submit方法
123456789101112131415161718192021222324252627282930public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); // 通过submit方法提交的Callable任务会被封装成了一个FutureTask对象。 // 通过Executor.execute方法提交FutureTask到线程池中等待被执行,最终执行的是FutureTask的run方法; RunnableFuture<Void> ftask = newTaskFor(task, null); execute(ftask); return ftask; } /** * @throws RejectedExecutionException { ...