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 { ...
解决方案-压测
参考文献
全链路压测数据隔离方案的选择
影子库
影子表
工具
wrk
Windows-遇到的问题
参考文献
I have some issues when I run “kubeadm init”
kubeadm init error
123456789101112# kubeadm init --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'I0814 13:18:08.628892 4337 version.go:256] remote version is much newer: v1.31.0; falling back to: stable-1.28W0814 13:18:18.638114 4337 version.go:104] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.28.txt": Get "https://cdn.dl.k8s. ...
好文收藏
好文收藏
Netty
聊聊Netty那些事儿之从内核角度看IO模型 ⭐⭐⭐⭐⭐
很详细的介绍了各种I/O模型,附带图文,源码
算法-内存分配算法
参考文献
内存分配算法
常用的内存分配算法:
动态内存分配(Dynamic memory allocation DMA)
伙伴算法
Slab算法
动态内存分配(Dynamic memory allocation DMA)
动态内存分配,又称堆内存分配.操作系统根据程序运行过程中需求及时分配内存,且分配的内存大小就是程序需求的大小.在大部分场景下,只有程序运行的时候才知道所需要分配的内存大小,如果提前分配可能分配的大小无法把控,分配太大会浪费空间,分配太小会无法使用.
DMA是从一整块内存中按需分配,对于分配的内存会记录元数据,同时还会使用空闲分区链维护空闲内存,便于在内存分配时查找可用的空闲分区.常用的有三种查找策略:
首次适应算法(first fit)
循环适应算法(next fit)
最佳适应算法(best fit)
首次适应算法(first fit)
空闲分区链以地址递增的顺序,将空闲分区以双向链表的形式连接在一起,从空闲分区链中找到第一个满足分配条件的空闲分区,然后从空闲分区中划分一块可用内存给请求进程,剩余的空闲分区仍然保留在空闲分区链中.
如下图 ...