算法/结构/理论复习1---理论基础----更新中

news2024/12/24 20:56:22

算法/结构/理论

  • 雪花算法
  • CAP理论
  • BASE理论
  • 分布式事务的解决方案
  • 数据结构
  • 树(Tree)
  • 二叉树
  • 二叉查找树
  • 平衡查找树
  • 红黑树(重点)
  • BTree(重点)
  • B+Tree

雪花算法

雪花算法主要是为了解决在分布式中id的生成问题
分布式id的生成规则是:全局唯一,不可以出现重复的id号,趋势递增
雪花算法指的是一个long的id,64位的2进制组成,第一位指的是0无意义主要是符号位 第二位到第42位的这41个组成的就是时间戳–生成是达到毫秒级别,后面的十位指的是机器的id(数据中心id+服务器的id),最后的12位数指的是序列号(从时间戳里面抽取出来的一连串数字)

再mybatis-plus中已经集成了雪花算法
使用的方法是

@TableId(value="id" ,type=IdType.ID_WORKER)
private Long id;

CAP理论

类别解释说明
一致性C在分布式系统中所有的节点看到的数据都是相同的,系统的状态再任何时刻都是一致的
可用性A系统不需保证再任何时刻都能处理请求返回正确的结果,即系统一致处于可用的状态
分区容错性P系统再遇到网络分区故障的时候仍然能够保证正常的工作,即系统能够容忍任意数量的消息丢失或网络分区

在这里插入图片描述

为什么CAP不可兼得
这是因为在分布式系统中,网络分区是不可避免的,然而保证一致性和可用性就需要对网络的分区进行取舍衡量


例如:当网络分区发生的时候,节点之间可能无法进行一致性的数据同步,因此在这种情况下,要么保证可用性,允许节点继续处理请求并且返回不一致的结果,要么保证一致性,暂停服务知道网络分区恢复

策略放弃说明
CA放弃容错性适用于小规模的集中式系统
CP放弃可用性适用于对数据一致性比较高的系统,如金融系统
AP放弃一致性适用于对数据实时性要求比较高的系统,如社交网络

BASE理论

这里指的是对CAP中AP的一种拓展,即使无法做到强一致性,但每个应用都可以根据自身业务特点采用适当的方式来使系统达到最终一致性

类别解释说明
Basically Available(基本可用)响应时间上的损失:正常情况下,处理用户请求需要0.5s返回结果,但是由于系统出现故障,处理用户请求的时间变成3s。 系统功能上的损失:正常情况下,用户可以使用系统的全部功能,但是由于系统访问量突然剧增,系统的非核心功能无法使用。
Soft state(软状态)数据同步允许一定的延迟。
Eventually consistent(最终一致性)系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态,不要求实时

最终一致性

类别解释说明
因果一致性(Causal consistency)如果节点 A 在更新完某个数据后通知了节点 B,那么节点 B 之后对该数据的访问和修改都是基于 A 更新后的值。于此同时,和节点 A 无因果关系的节点 C 的数据访问则没有这样的限制。
读己之所写(Read your writes)节点 A 更新一个数据后,它自身总是能访问到自身更新过的最新值,而不会看到旧值。其实也算一种因果一致性。
会话一致性(Session consistency)会话一致性将对系统数据的访问过程框定在了一个会话当中:系统能保证在同一个有效的会话中实现 “读己之所写” 的一致性,也就是说,执行更新操作之后,客户端能够在同一个会话中始终读取到该数据项的最新值。
单调读一致性(Monotonic read consistency)单调读一致性是指如果一个节点从系统中读取出一个数据项的某个值后,那么系统对于该节点后续的任何数据访问都不应该返回更旧的值。
单调写一致性(Monotonic write consistency)指一个系统要能够保证来自同一个节点的写操作被顺序的执行。

分布式事务的解决方案

2PC(二阶段提交)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fa15893823644f318b209312220d1bbf.png在这里插入图片描述

2PC 引入一个事务协调者的角色来协调管理各参与者(也可称之为各本地资源)的提交和回滚,二阶段分别指的是准备(投票)和提交两个阶段。


准备阶段:事务管理器告诉资源管理器准备执行事务,并锁住需要的资源。当准备完成后,资源管理器向事务管理器报告已准备就绪。


提交阶段:如果所有资源管理器都准备成功,第二阶段事务管理器回要求所有的资源管理器执行提交操作。如果任一资源管理器在第一阶段返回准备失败,那么事务管理器回要求所有的资源管理器在第二阶段执行回滚操作。


二阶段看起来能提供原子性操作,但是不幸的是,二阶段提交还是有几个缺点的
1.2PC是一个同步阻塞协议,资源管理器在执行的过程中会锁定资源。其他第三方节点想访问这些资源的时候不得不处于阻塞状态
2.一阶段有超时机制,在第一阶段事务管理器没有收到资源管理的响应,或者资源管理器挂了。超时就会判端事务失效,向所有资源管理器发送回滚命令。但二阶段只能不断重试
3.事务管理器存在单点风险,如果发生故障,则资源管理器会一直阻塞下去。

XA规范

XA规范是X/Open 组织针对二阶段提交协议的实现做的规范。目前几乎所有的主流数据库都对XA规范提供了支持
XA规范的特点是:
1.对代码无侵入,开发比较快速
2.对资源进行了长时间的锁定,并发程度比较低
在这里插入图片描述


TCC
在这里插入图片描述

TCC这种方案应该是在企业中应用最广泛的一种方案,在业务层面实现分布式事务。TCC是Try、Confirm、Cancel三个词语的缩写。


Try:负责业务资源检查和预留


Confirm:二阶段提交操作,所有的Try都成功了,则执行Confirm操作。Confirm真正执行业务,使用Try预留的资源


Cancel:二阶段回滚操作,只有一个Try失败了,则走到Cancel操作。Cancel释放Try预留的资源


特点:
1.并发程度高,在业务层面锁定资源
2.开发量大,一个业务员需要提供Try/Confirm/Cancel三个方法


本地消息表(异步确保)
在这里插入图片描述

我们以买书为例说一下大致流程
1.账号服务扣减账户余额,同时写入一条消息(状态为进行中),注意扣减账户余额和写消息在一个本地事务中
2.账号服务轮询消息表,将进行中的消息发送到消息队列
3.仓库服务收到消息后,扣减相应的库存。扣减完成后将结果通过给账号服务,账号服务将消息的状态更新为已完成(或者删除)
4.当消息发送失败,或者消息消费失败时,会不断重试,因此仓库服务要保证消费的幂等性。
特点 :需要创建额外的消息表,不断对消息表轮询


RocketMQ事务消息
在这里插入图片描述

在本地消息表方案中,生产者需要额外创建本地消息表,还要对本地消息进行轮询。RocketMQ在4.3之后的版本正式支持事务消息,该事务消息的本质是把本地消息表放在RocketMQ上,解决生产端消息发送和本地事务执行的原子性问题


RocketMQ实现分布式事务的流程如下:
1.producer向mq server发送一个半消息
2.mq server将消息持久化成功后,向发送方确认消息已经发送成功,此时消息并不会被consumer消费
3.producer开始执行本地事务逻辑
4.producer根据本地事务执行结果向mq server发送二次确认,mq收到commit状态,将消息标记为可投递,consumer会消费该消息。mq收到rollback则删除半消息,consumer将不会消费该消息,如果收到unknow状态,mq会对消息发起回查
5.在断网或者应用重启等特殊情况下,步骤4提交的2次确认有可能没有到达mq server,经过固定时间后mq会对该消息发起回查
6.producer收到回查后,需要检查本地事务的执行状态
7.producer根据本地事务的最终状态,再次提交二次确认,mq仍按照步骤4对半消息进行操作


消息投递到mq server,consumer消费失败怎么办?
如果是消费超时,重试即可。如果是由于代码等原因真的消费失败了,此时就得人工介入,重新手动发送消息,达到最终一致性。


最大努力通知

最大努力通知这种方案在充值系统中经常被使用
充值系统通过不断的重试将充值结果推送给账户系统。因此账户系统接收充值结果的系统要保持幂等。另外充值充值系统还要提供回查接口,让账户系统主动校验充值的状态。
在这里插入图片描述


Seata AT模式

这是阿里开源的事务框架Seata中主推的事务模式。Seata AT是一种无侵入的事务解决方案。事务的一阶段和二阶段均由框架自动生成。用户SQL作为分布式事务的一阶段,而二阶段由框架自动生成提交/回滚操作。和XA模式很类似
Seata AT模式特点:
1.对代码无侵入,开发速度较快
2.需要用全局锁来保证隔离性,并发程度较低

数据结构

栈(先进后出)

数据进入栈模型的过程叫做进栈/压栈
数据离开栈模型的过程叫做出栈/弹栈
在这里插入图片描述

队列(先进先出)
数组

1 查询数据通过索引定位,查询任意数据耗时相同,查询效率高
2.删除数据的时候,需要将原始的数据删除,同时后面的每一个数据前移,删除效率低
3 添加数据的时候,添加位置后的每一个数据都是需要后移的再添加元素,添加效率极低

在这里插入图片描述

链表

对比数组增删快
对比数组查询慢

在这里插入图片描述
哈希值

是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值
其中object类中的hashCode方法可以获取对象的哈希值
默认情况下,不同对象的哈希值都是不相同的,但是如果重写里面的hashCode的方法的时候是有可能一致的
计算哈希值除以16取余判断放在的位置
由于他的加载因子是0.75所以当数组里面存入了当前长度 * 0.75的元素的时候就会扩容为原来的2倍

哈希表
下面是数组+链表(jdk8之前)

在这里插入图片描述下面是数组+链表+红黑树(jdk8之后)
当链表的长度等于8的时候就会转变为红黑树

树(Tree)

树是由节点和边组成的,不存在环的一种数据结构.每个元素叫做节点;用来相邻的节点之间的关系叫做"父子关系"
在这里插入图片描述

二叉树

二叉树就是每个节点最多有2个叉,也就是2个子节点,但是二叉树不是必须要满足2个子节点也可以是一个子节点左子结点或者右子节点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述7表示根节点
4表示7的左子结点
10表示为7的右子节点

二叉查找树

二叉排序树/二叉搜索树
每一个节点最多有2个子节点
每一个节点的左边节点都是小于自己的
每一个节点的右边节点都是大于自己的
例如下面的图形就是典型的二叉查找树
在这里插入图片描述

平衡查找树

二叉树左右子树的高度差不超过1
任意节点的左右2个树都是一个平衡二叉树
但是下面的第一张图不是平衡二叉树但是第二张图是平衡二叉树在这里插入图片描述
下面就是左旋变为了平衡二叉树了
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2c1a31dd40044519816f23817bb2fd99.png

红黑树(重点)

是一个二叉B树
每一个节点可以是红或者黑
红黑树不是高度平衡的,这是通过自己的红黑规则进行实现的

红黑规则

1.每一个节点由红黑色组成
2.根节点必须是黑色的
3.如果一个节点没有子节点或者父节点,那么这个节点相应的指针属性值为Nil,这些Nil被视为叶节点,每个叶节点都是黑色的
4.如果有一个节点是红色的,那么他的子节点必须是黑色的,不能出现2个红色节点相连的情况
5.对于每一个节点来说,从该节点到其他所有的后代叶节点的简单路径上,都可以包含相同数目的黑色节点
在这里插入图片描述在这里插入图片描述
添加节点
1.添加节点的颜色,可以是红色也可以是黑色,再添加的元素的时候默认为红色的时候效率会高一点
2.添加的节点默认为红色,如果是根节点,那么就将当前的节点变为黑色
3.添加的节点默认为红色,如果不是根节点,这个时候需要判断父节点的颜色,如果父节点是黑色无需操作
在这里插入图片描述

BTree(重点)

解释:多路平衡搜索树
特点:
1.树中每个节点最多包含m个孩子
2.除了根节点和叶子结点外,每个节点至少有[ceil(m/2)]个孩子(m/2向上取整)
3.若根节点不是叶子结点,则至少有2个孩子
4.所有的叶子结点都在同一层
5.每个非叶子结点由n个key与n+1个指针组成,其中[ceil(m/2)] <= n <= m-1


下面会以5叉BTree树举例,插入字母为
CNGA H EKQ MFWLTZDPRXYS 数据
公式推到key的数量为2<= n <= 4 所以当n>4的时候,中间的节点分裂到父节点,2遍节点分裂


演变过程:
i.插入前4个字母
在这里插入图片描述
ii.插入H,n>4,中间而定字母G向上进行分裂到新的节点上
在这里插入图片描述
iii.插入EKQ不需要进行分裂
在这里插入图片描述
iv.插入M,中间的字母M向上分裂到父节点G
在这里插入图片描述v.插入FWLT 不需要进行分裂
在这里插入图片描述vi.插入Z,中间的元素T向上进行分裂到父节点
在这里插入图片描述vii.插入D,中间的D向上分裂到父节点,然后再去插入PRXY不需要进行分裂
在这里插入图片描述
viii.插入S,NPQR节点中Q向上分裂,但是分裂之后DGMT节点的n>4,所以中间节点M继续向上进行分裂
在这里插入图片描述

B+Tree

这个再mysql的索引数据结构使用的就是B+树结构
聚合索引/复合索引/前缀索引/唯一索引默认都是使用的B+Tree索引
B+Tree是Btree的变种
i.n叉B+Tree最多包含有n个key,而BTree最多含有n-1个key
ii.B+Tree的叶子结点保存了所有的key信息,依key大小顺序排列
iii.所有的非叶子节点都可以看做key的索引部分
在这里插入图片描述MySQL索引数据结构是对B+Tree进行了优化,在原来的B+Tree的基础上,增加了指针指向相邻的叶子结点的链表,这样就形成了带有顺序指针的B+Tree,提高了区间的访问效率
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1407554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ITK编译及安装

文章目录 前言CMake配置选项说明运行VS2015编译及安装VTK转ITKITK转VTK参考文献 最近想利用ITK读取整个Dicom图像到内存&#xff0c;再将读取到的ITK数据转换到VTK。于是乎&#xff0c;开始了一段ITK编译之路。以下将记录一些有用的信息&#xff0c;以备后用。 前言 DICOM图像…

Spring扩展点在微服务应用(待完善)

ApplicationListener扩展 nacos注册服务&#xff0c; 监听容器发布事件 # 容器发布事件 AbstractAutoServiceRegistration#onApplicationEvent # 接收事件吗&#xff0c;注册服务到nacos NacosServiceRegistry#register Lifecycle扩展 #订阅服务实例更改的事件 NamingService#…

超实用桌面助手!时间、日期、天气,一目了然!完全免费!

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f3e1; 环境 &#x1f3e1;&#x1f4d2; 使用方法 &#x1f4d2;⚓️ 相关链接 ⚓️ &#x1f4d6; 介绍 &#x1f4d6; 这是一款我根据自己的需求写的一个桌面小工具&#xff0c;自己一直在用&#xff0c;现在分享给需要的朋…

RabbitMQ发布确认

生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c; 所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c; broker就会发送一个确认给生产者(包含消息的唯一 ID)&…

【每日一题】最长交替子数组

文章目录 Tag题目来源解题思路方法一&#xff1a;双层循环方法二&#xff1a;单层循环 写在最后 Tag 【双层循环】【单层循环】【数组】【2024-01-23】 题目来源 2765. 最长交替子数组 解题思路 两个方法&#xff0c;一个是双层循环&#xff0c;一个是单层循环。 方法一&am…

Likeshop单商户SaaS商城源码系统-商家用过都说太香啦!

在互联网快速发展的时代&#xff0c;拥有一个个性化、功能丰富的在线商城是企业拓展市场、提高用户粘性的重要手段。 我是一名电商从业者&#xff0c;同时也是一个热衷于DIY的人&#xff0c;我总喜欢在自己的店铺中加入自己的一些想法和创意。然而&#xff0c;一般的电商平台无…

【思路合集】talking head generation+stable diffusion

1 以DiffusionVideoEditing为baseline&#xff1a; 改进方向 针对于自回归训练方式可能导致的漂移问题&#xff1a; 训练时&#xff0c;在前一帧上引入小量的面部扭曲&#xff0c;模拟在生成过程中自然发生的扭曲。促使模型查看身份帧以进行修正。在像VoxCeleb或LRS这样的具…

EasyX的安装与使用(VisualStudio C++免费绘图库)

EasyX Graphics Library 是针对 Visual C 的免费绘图库 安装教程 安装到Visual C 2010 EasyX 安装完毕。 在VC2010中建立控制台工程 工程建好后&#xff0c;鼠标右键点击工程名&#xff0c;并选择属性 安装到Visual C 2010 EasyX 安装完毕。 安装示例程序 easyxdemo.cpp 在VC…

Vulnhub-dc4

靶场下载 https://download.vulnhub.com/dc/DC-4.zip 信息收集 判断目标靶机的存活地址: # nmap -sT --min-rate 10000 -p- 192.168.1.91 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 16:36 CST Stats: 0:00:03 elapsed; 0 hosts completed (1 up…

机器学习 | 掌握Matplotlib的可视化图表操作

Matplotlib是python的一个数据可视化库&#xff0c;用于创建静态、动态和交互式图表。它可以制作多种类型的图表&#xff0c;如折线图、散点图、柱状图、饼图、直方图、3D 图形等。以渐进、交互式方式实现数据可视化。当然博主也不能面面俱到的讲解到所有内容&#xff0c;详情请…

装完32G内存条 电脑飞跃提升!

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 大家…

如何使用阿里云CDN服务?

如何使用阿里云CDN服务 一、开通阿里云CDN服务 注册自己阿里云账号&#xff0c;找到CDN服务&#xff0c;进行加速即可 二、配置域名信息 1、各配置参数的含义 添加加速域名&#xff1a; 如果需要使用CDN加速指定网站上的业务&#xff0c;则需要将该网站作为源站&#xff0…

ubuntu 20.04 使用 webrtc-streamer自动退出,报错GLIBC 问题解决方法

文章目录 前言Ubuntu 20.4中使用webrtc-streamer报错总结 前言 前端vue2 项目需要播放海康的视频流&#xff0c;本地启动起来了&#xff0c;现在需要的服务器上部署&#xff0c;服务器是Ubuntu 20.04&#xff0c;下面是部署时遇到的问题及解决方法&#xff0c;总耗时2天。 不知…

<蓝桥杯软件赛>零基础备赛20周--第16周--GCD和LCM

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

dolphinscheduler节点二次开发需要改动的部分

dolphinscheduler节点二次开发需要改动的部分 前端 在dolphinscheduler-ui/public/images/task-icons/目录下新增两个节点的logo图片&#xff0c;一个为激活状态的一个为非激活状态的&#xff0c;如下。 修改文件dolphinscheduler-ui/src/views/projects/task/constants/task…

git bash右键菜单失效解决方法

git bash右键菜单失效解决方法 这几天重新更新了git&#xff0c;直接安装新版本后&#xff0c;右键菜单失效找不到了。找了好几个博客&#xff0c;发现都不全面&#xff0c;最后总结一下解决方法&#xff1a; &#xff08;1&#xff09;按winr&#xff0c;输入regedit打开注册…

【学网攻】 第(3)节 -- 交换机配置聚合端口

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用 前言 网络已经成为了我们生活中不可或缺的一部分&#xff0c;它连接了世界各地的人们&#xff0c;让信息和资源得以自由流动。随着互联网的发展&#xff0c;我们可以通过网络学习、工作、娱乐…

idea创建公用依赖包项目

创建parent项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

C++读取txt文件中的逐个字符

为了增加读取的灵活性&#xff0c;所以separator和filename都设置为在主函数中获取输入或者在函数中传参的视线方法 举个例子&#xff0c;txt文件如下&#xff1a; household;2;true; 首先声明一个读取数据的文件 void read_data_file(const string& filename,char se…

使用Fiddler进行弱网测试

测试APP、web经常需要用到弱网测试&#xff0c;也就是在信号差、网络慢的情况下进行测试。我们自己平常在使用手机APP时&#xff0c;在地铁、电梯、车库等场景经常会遇到会话中断、超时等情况&#xff0c;这种就属于弱网。 普通的弱网测试可以选择第三方工具对带宽、丢包、延时…