红黑树
红黑树二叉查找树Binary Search Tree 「BST」,特性:
某节点的左子树节点值仅包含小于该节点值
某节点的右子树节点值仅包含大于该节点值
左右子树每个也必须是二叉查找树
二叉树很容易出现树分叉平衡,查找次数或时间复杂度 O(h)可能会随着一边长无限增长而红黑树其实就是去除二叉查找树不平衡的解决方案,从而达到树的平衡
红黑树定义红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),树上的每个节点都遵循下面的规则:
每个节点都有红色或黑色
树的根始终是黑色的
没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点)
从节点(包括根)到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点
recolor 与 rotation如何构成红黑树,先尝试 recolor,如果 recolor 不能达到红黑树的 4 点要求,然后我们尝试 rotation
将新插入的节点标记为红色
如果 X 是根结点(root),则标记为黑色
如果 X 的 parent 不是黑色 ...
Cgroups 与 Systemd
Cgroups 与 SystemdSystemd 依赖 cgroupsSystemd 是一个强大的 init 系统,它甚至为我们使用 cgorups 提供了便利!Systemd 提供的内在机制、默认设置和相关的操控命令降低了配置和使用 cgroups 的难度。
来源Cgroups 与 Systemd
linux下CPU的指标
linux下CPU的指标node_cpu_seconds_total指标的思考当对节点cpu进行监控时,会经常用到下面这条PromQL
12345678- alert: HighCpuLoad expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 5m labels: severity: warning annotations: summary: "High CPU load (instance {{ $labels.instance }})" description: "CPU load is > 80%\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
可以看到 ...
利用策略模式避免过多if
利用策略模式避免过多if背景对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过多,就会大大的影响其可读性和可维护性。
假设需求123456789101112131415161718192021public BigDecimal calPrice(BigDecimal orderPrice, String buyerType) { if (用户是专属会员) { if (订单金额大于30元) { returen 7折价格; } } if (用户是超级会员) { return 8折价格; } if (用户是普通会员) { if(该用户超级会员刚过期并且尚未使用过临时折扣){ 临时折扣使用次数更新(); returen 8折价格; ...
idea 记录
idea 记录idea 常用插件
Alibaba Java Coding Guidelines
FindBugs
Free Mybatis plugin
GenerateAllSetter
Grep Console
GsonFormat
Lombok plugin
Maven Helper
VisualVM Launcher
快捷键跳转项目的跳转 ctrl+Alt+[]
文件的跳转ctrl+e 最近的文件ctrl+shift+e 最近编辑的文件
浏览修改位置的跳转ctrl+shift+backspace
最新浏览位置的修改ctrl+shift+左箭头(win10会改变屏幕方向)
使用书签进行跳转标记书签 ctrl+shift+数字或字母跳转书签 ctrl+数字或者字母总览书签 shift+F11
插件emacs在同一屏幕内支持跳转到任何字母需要自己设置快捷键使用方法是点下快捷键后在点下相应的字母
快速寻找功能快捷键——ctrl+shift+A
搜索 定位定位类ctrl+n
定位文件ctrl + shift +n
定位函数或者属性ctrl + shift + alt +n
字符串ctr ...
cgroups
linux cgroups 简介cgroups 是什么cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。
简单说,cgroups 可以限制、记录任务组所使用的物理资源。
本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
cgroups的重要性在以容器技术为代表的虚拟化技术大行其道的时代了解 cgroups 技术是非常必要的!比如我们可以很方便的限制某个容器可以使用的 CPU、内存等资源,这究竟是如何实现的呢?通过了解 cgroups 技术,我们可以窥探到 linux 系统中整个资源限制系统的脉络。从而帮助我们更好的理解和使用 linux 系统。
cgroups 的主要作用实现 cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,cgroups 提供了四大功能:
资源限制: ...
升级导致 mysql无法启动
升级导致 mysql无法启动从mysql5.7升级到8.0版本升级最好完全清理掉5.7版本的文件后再进行安装升级8.0版本,否则容易在重启mysql时出现
InnoDB: Unable to lock ./ibdata1, error: 11的报错问题
解决方法1234567891011cd /var/lib/mysql/su mysql(在容器部署的可以不执行此步骤)mv ibdata1 ibdata1.bakcp -a ibdata1.bak ibdata1mv ib_logfile0 ib_logfile0.bakcp -a ib_logfile0.bak ib_logfile0mv ib_logfile1 ib_logfile1.bakcp -a ib_logfile1.bak ib_logfile1重启mysql
切换到mysql用户再进行操作
参考链接mysql无法启动
kubernetes创建pod流程图
kubernetes创建pod流程图
创建Pod文字简述创建 Pod 时发生的过程:1.Pod 先存储在 etcd 中。2.调度程序会分配一个节点,再将节点写入 etcd。3.向 kubelet 通知有个新 Pod。4.kubelet 将创建容器的任务给CRI。5.kubelet 将容器附加到 CNI。6.kubelet 将容器中的卷委派给 CSI。7.CNI 分配 IP 地址。8.Kubelet 将 IP 地址通知给控制平面。9.IP 地址存储在 etcd 中。如果我们的 Pod 属于 某个Service:1.Kubelet 等待 Readiness 探针成功。2.对所有相关的 Endpoint 对象更改进行通知。3.Endpoint 将新 endpoint(IP 地址 + 端口)添加到列表中。4.Kube-proxy 被通知 Endpoint 更改,然后 Kube-proxy 会更新每个节点上的 iptables 规则。5.Ingress 控制器被通知 Endpoint 变化,然后控制器会将流量路由到新的 IP 地址。6.CoreDNS 被通知 Endpoint 更改。如果服务的类 ...
prometheus 中的 alert record
prometheus 中的 alert record在编写prometheus告警规则时,会发现有的告警规则表达式很长需要做比较多的运算。如果把过长过于复杂的alert rule直接写入告警规则中,会发现prometheus查询出现bad request的提示。prometheus官方针对这个问题 提出了alert record的概念,也就是说可以把较长的告警指标写成alert record,由prometheus定时查询形成新的指标存储到prometheus 中。
简单示例以prometheus-opretor中的kube-prometheus-node告警规则为例
1234567891011121314151617181920212223242526272829303132333435363738394041# record内容...spec: groups: - name: kube-prometheus-node-recording.rules rules: - expr: sum(rate(node_cpu_seconds_total{mode!=& ...
prometheus 配置postgres作为远程读写数据库
prometheus 配置postgres作为远程读写数据库当对于prometheus持久化指标时间要求较高和对prometheus有集群部署的需求时,我们就需要对prometheus配置远程读写库
1234567891011121314151617181920# prometheus 2.11支持远程读写的数据库AppOptics: writeChronix: writeCortex: read and writeCrateDB: read and writeElasticsearch: writeGnocchi: writeGraphite: writeInfluxDB: read and writeIRONdb: read and writeKafka: writeM3DB: read and writeOpenTSDB: writePostgreSQL/TimescaleDB: read and writeSignalFx: writeSplunk: read and writeTiKV: read and writeThanos: writeVictoriaMetrics: ...