超详细Redis入门教程——Redis分布式系统

news2024/9/19 10:56:25

前言

在这里插入图片描述

本文小新为大家带来 Redis分布式系统 相关知识,具体内容包括数据分区算法(包括:顺序分区哈希分区),系统搭建与运行(包括:系统搭建系统启动与关闭),集群操作(包括:连接集群写入数据集群查询故障转移集群扩容集群缩容),分布式系统的限制等进行详尽介绍~

不积跬步,无以至千里;不积小流,无以成江海。每天进步一点点,在成为强者的路上,小新与大家共同成长!

📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)

🚩欢迎关注小新的Git仓库:小新Java成长之路,不定期更新Java学习资料~

↩️本文上接:超详细Redis入门教程——Redis 主从集群(下)


目录

文章标题

  • 前言
  • 目录
  • 一、数据分区算法
    • 1️⃣顺序分区
    • 2️⃣哈希分区
  • 二、系统搭建与运行
    • 1️⃣系统搭建
    • 2️⃣系统启动与关闭
  • 三、集群操作
    • 1️⃣连接集群
    • 2️⃣写入数据
    • 3️⃣集群查询
    • 4️⃣故障转移
    • 5️⃣集群扩容
    • 6️⃣集群缩容
  • 四、分布式系统的限制
  • 后记

在这里插入图片描述
Redis 分布式系统,官方称为 Redis Cluster,Redis 集群,其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决不同 Redis 节点存放不同数据,并将用户请求方便地路由到不同 Redis 的问题。

一、数据分区算法

分布式数据库系统会根据不同的数据分区算法,将数据分散存储到不同的数据库服务器节点上,每个节点管理着整个数据集合中的一个子集。

在这里插入图片描述

常见的数据分区规则有两大类:顺序分区与哈希分区。

1️⃣顺序分区

顺序分区规则可以将数据按照某种顺序平均分配到不同的节点。不同的顺序方式,产生了不同的分区算法。例如,轮询分区算法、时间片轮转分区算法、数据块分区算法、业务主题分区算法等。由于这些算法都比较简单,所以这里就不展开描述了。

🍀(1)轮询分区算法

每产生一个数据,就依次分配到不同的节点。该算法适合于数据问题不确定的场景。其分配的结果是,在数据总量非常庞大的情况下,每个节点中数据是很平均的。但生产者与数据节点间的连接要长时间保持。

🍀(2)时间片轮转分区算法

在某人固定长度的时间片内的数据都会分配到一个节点。时间片结束,再产生的数据就会被分配到下一个节点。这些节点会被依次轮转分配数据。该算法可能会出现节点数据不平均的情况(因为每个时间片内产生的数据量可能是不同的)。但生产者与节点间的连接只需占用当前正在使用的这个就可以,其它连接使用完毕后就立即释放。

🍀(3)数据块分区算法

在整体数据总量确定的情况下,根据各个节点的存储能力,可以将连接的某一整块数据分配到某一节点。

🍀(4)业务主题分区算法

数据可根据不同的业务主题,分配到不同的节点。

2️⃣哈希分区

哈希分区规则是充分利用数据的哈希值来完成分配,对数据哈希值的不同使用方式产生了不同的哈希分区算法。哈希分区算法相对较复杂,这里详细介绍几种常见的哈希分区算法。

🍀(1)节点取模分区算法

该算法的前提是,每个节点都已分配好了一个唯一序号,对于 N 个节点的分布式系统,其序号范围为[0, N-1]。然后选取数据本身或可以代表数据特征的数据的一部分作为 key,计算 hash(key)与节点数量 N 的模,该计算结果即为该数据的存储节点的序号。

该算法最大的优点是简单,但其也存在较严重的不足。如果分布式系统扩容或缩容,已经存储过的数据需要根据新的节点数量 N 进行数据迁移,否则用户根据 key 是无法再找到原来的数据的。生产中扩容一般采用翻倍扩容方式,以减少扩容时数据迁移的比例。

🍀(2)一致性哈希分区算法

一致性 hash 算法通过一个叫作一致性 hash 环的数据结构实现。这个环的起点是 0,终点是 232 - 1,并且起点与终点重合。环中间的整数按逆/顺时针分布,故这个环的整数分布范围是[0, 232 - 1]

在这里插入图片描述
上图中存在四个对象 o1、o2、o3、o4,分别代表四个待分配的数据,红色方块是这四个数据的 hash(o)在 Hash 环中的落点。同时,图上还存在三个节点 m0、m1、m2,绿色圆圈是这三节点的 hash(m)在 Hash 环中的落点。

现在要为数据分配其要存储的节点。该数据对象的 hash(o) 按照逆/顺时针方向距离哪个节点的 hash(m)最近,就将该数据存储在哪个节点。这样就会形成上图所示的分配结果。

该算法的最大优点是,节点的扩容与缩容,仅对按照逆/顺时针方向距离该节点最近的节点有影响,对其它节点无影响。

当节点数量较少时,非常容易形成数据倾斜问题,且节点变化影响的节点数量占比较大,即影响的数据量较大。所以,该方式不适合数据节点较少的场景。

🍀(3)虚拟槽分区算法

该算法首先虚拟出一个固定数量的整数集合,该集合中的每个整数称为一个 slot 槽。这个槽的数量一般是远远大于节点数量的。然后再将所有 slot 槽平均映射到各个节点之上。例如,Redis 分布式系统中共虚拟了 16384 个 slot 槽,其范围为[0, 16383]。假设共有 3 个节点,那么 slot 槽与节点间的映射关系如下图所示:

在这里插入图片描述

而数据只与 slot 槽有关系,与节点没有直接关系。数据只通过其 key 的 hash(key)映射到slot 槽:slot = hash(key) % slotNums。这也是该算法的一个优点,解耦了数据与节点,客户端无需维护节点,只需维护与 slot 槽的关系即可。

Redis 数据分区采用的就是该算法。其计算槽点的公式为:slot = CRC16(key) % 16384。CRC16()是一种带有校验功能的、具有良好分散功能的、特殊的 hash 算法函数。其实 Redis中计算槽点的公式不是上面的那个,而是:slot = CRC16(key) &16383。

若要计算 a % b,如果 b 是 2 的整数次幂,那么 a % b = a & (b-1)。

二、系统搭建与运行

1️⃣系统搭建

🍀(1)系统架构

下面要搭建的 Redis 分布式系统由 6 个节点构成,这 6 个节点的地址及角色分别如下表所示。一个 master 配备一个 slave,不过 master 与 slave 的配对关系,在系统搭建成功后会自动分配。

序号角色地址
1master127.0.0.1:6380
2master127.0.0.1:6381
3master127.0.0.1:6382
4slave127.0.0.1:6383
5slave127.0.0.1:6384
6slave127.0.0.1:6385

🍀(2)删除持久化文件

先将之前“Redis 主从集群”中在 Redis 安装目录下生成的 RDB 持久化文件 dump638*.conf与 AOF 持久化文件删除。因为 Redis 分布式系统要求创建在一个空的数据库之上。注意,AOF持久化文件全部在appendonlydir 目录中。

在这里插入图片描述

🍀(3)创建目录

在 Redis 安装目录中 mkdir 一个新的目录 cluster-dis,用作分布式系统的工作目录。

🍀(4)复制 2 个配置文件

将 cluster 目录中的 redis.conf 与 redis6380.conf 文件复制到 cluster-dis 目录。

在这里插入图片描述

🍀(5)修改 redis.conf

对于 redis.conf 配置文件,主要涉及到以下三个四个属性:

A、dir

在这里插入图片描述

指定工作目录为前面创建的 cluster-dis 目录。持久化文件、节点配置文件将来都会在工作目录中自动生成。

B、 cluster-enabled

在这里插入图片描述

该属性用于开启 Redis 的集群模式。

C、 cluster-config-file

在这里插入图片描述

该属性用于指定“集群节点”的配置文件。该文件会在第一次节点启动时自动生成,其生成的路径是在 dir 属性指定的工作目录中。在集群节点信息发生变化后(如节点下线、故障转移等),节点会自动将集群状态信息保存到该配置文件中。

不过,该属性在这里仍保持注释状态。在后面的每个节点单独的配置文件中配置它。

D、cluster-node-timeout

在这里插入图片描述

用于指定“集群节点”间通信的超时时间阈值,单位毫秒。

🍀(6)修改 redis6380.conf

在这里插入图片描述

仅添加一个 cluster-config-file 属性即可。

🍀(7)复制 5 个配置文件

使用 redis6380.conf 复制出 5 个配置文件 redis6381.conf、redis6382.conf、redis6383.conf、redis6384.conf、redis6385.conf。

在这里插入图片描述

cluster-dis 中出现了 7 个配置文件。

在这里插入图片描述

🍀(8)修改 5 个配置文件

修改 5 个配置文件 redis6381.conf、redis6382.conf、redis6383.conf、redis6384.conf、redis6385.conf 的内容,将其中所有涉及的端口号全部替换为当前文件名称中的端口号。例如,下面的是 redis6381.conf 的配置文件内容。

在这里插入图片描述

2️⃣系统启动与关闭

🍀(1)启动节点

启动所有 Redis 节点。

在这里插入图片描述

在这里插入图片描述

此时查看 cluster-dis 目录,可以看到生成了 6 个 nodes 的配置文件。

在这里插入图片描述
🍀(2)创建系统

6 个节点启动后,它们仍是 6 个独立的 Redis,通过 redis-cli --cluster create 命令可将 6个节点创建了一个分布式系统。

在这里插入图片描述

该命令用于将指定的 6 个节点连接为一个分布式系统。–cluster replicas 1 指定每个master 会带有一个 slave 作为副本。

回车后会立即看到如下日志:

在这里插入图片描述
输入 yes 后回车,系统就会将以上显示的动态配置信息真正的应用到节点上,然后就可可看到如下日志:

在这里插入图片描述

🍀(3)测试系统

在这里插入图片描述

通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况。只要能看到每个节点给出 connected,就说明分布式系统已经成功搭建。不过,对于客户端连接命令 redis-cli,需要注意两点:

  • redis-cli 带有-c 参数,表示这是要连接一个“集群”,而非是一个节点。
  • 端口号可以使用 6 个中的任意一个。

🍀(4)关闭系统

对于分布式系统的关闭,只需将各个节点 shutdown 即可。

在这里插入图片描述

三、集群操作

1️⃣连接集群

连接集群

在这里插入图片描述

与之前单机连接相比的唯一区别就是增加了参数-c。

2️⃣写入数据

🍀(1)key 单个写入

无论 value 类型为 String 还是 List、Set 等集合类型,只要写入时操作的是一个 key,那么在分布式系统中就没有问题。例如,

在这里插入图片描述
在这里插入图片描述

🍀(2)key 批量操作

对一次写入多个 key 的操作,由于多个 key 会计算出多个 slot,多个 slot 可能会对应多个节点。而由于一次只能写入一个节点,所以该操作会报错。

在这里插入图片描述

不过,系统也提供了一种对批量 key 的操作方案,为这些 key 指定一个统一的 group,让这个 group 作为计算 slot 的唯一值。

在这里插入图片描述

3️⃣集群查询

🍀(1)查询 key 的 slot

通过 cluster keyslot 可以查询指定 key 的 slot。例如,下面是查询 emp 的 slot。

在这里插入图片描述

🍀(2)查询 slot 中 key 的数量

通过 cluster countkeysinslot 命令可以查看到指定 slot 所包含的 key 的个数。

在这里插入图片描述

🍀(3)查询 slot 中的 key

通过 cluster getkeysinslot 命令可以查看到指定 slot 所包含的 key。

在这里插入图片描述

4️⃣故障转移

分布式系统中的某个 master 如果出现宕机,那么其相应的 slave 就会自动晋升为 master。如果原 master 又重新启动了,那么原 master 会自动变为新 master 的 slave。

🍀(1)模拟故障

通过 cluster nodes 命令可以查看系统的整体架构及连接情况。
在这里插入图片描述

当然,也可以通过 info replication 查看当前客户端连接的节点的角色。可以看到,6381节点是 master,其 slave 为 6383 节点。

在这里插入图片描述

为了模拟 6381 宕机,直接将其 shutdown。

在这里插入图片描述

通过客户端连接上 6383 节点后可以查看到,其已经自动晋升为了 master。

在这里插入图片描述

重启 6381 节点后查看其角色,发现其自动成为了 6383 节点的 slave。

在这里插入图片描述

🍀(2)全覆盖需求

如果某 slot 范围对应节点的 master 与 slave 全部宕机,那么整个分布式系统是否还可以对外提供读服务,就取决于属性cluster-require-full-coverage 的设置。

在这里插入图片描述

该属性有两种取值:

  • yes:默认值。要求所有 slot 节点必须全覆盖的情况下系统才能运行。
  • no:slot 节点不全的情况下系统也可以提供查询服务。

5️⃣集群扩容

下面要在正在运行的分布式系统中添加两个新的节点:端口号为 6386 的节点为 master节点,其下会有一个端口号为 6387 的 slave 节点。

🍀(1)复制并修改 2 个配置文件

使用 redis6380.conf 复制出 2 个配置文件 redis6386.conf 与 redis6387.conf,并修改其中的各处端口号为相应端口号,为集群扩容做前期准备。

🍀(2)启动系统与 2 个节点

由于要演示的是在分布式系统运行期间的动态扩容,所以这里先启动分布式系统。

在这里插入图片描述

要添加的两个节点是两个 Redis,所以需要先将它们启动。只不过,在没有添加到分布式系统之前,它们两个是孤立节点,每个节点与其它任何节点都没有关系。

在这里插入图片描述

🍀(3)添加 master 节点

在这里插入图片描述

通过命令 redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort}可以将新的节点添加到系统中。其中{newHost}:{newPort}是新添加节点的地址,{existHost}:{existPort}是原系统中的任意节点地址。

添加成功后可看到如下日志。

在这里插入图片描述

添加成功后,通过 redis-cli -c -p 6386 cluster nodes 命令可以看到其它 master 节点都分配有 slot,只有新添加的 master 还没有相应的 slot。当然,通过该命令也可以看到该新节点的动态 ID。

在这里插入图片描述

🍀(4)分配 slot

为新的 master 分配的 slot 来自于其它节点,总 slot 数量并不会改变。所以 slot 分配过程本质是一个 slot 的移动过程。

通过 redis-cli –c --cluster reshard {existIP}:{existPort}命令可开启 slot 分配流程。其中地址{existIP}:{existPort}为分布式系统中的任意节点地址。

在这里插入图片描述
该流程中会首先查询出当前节点的 slot 分配情况。

在这里插入图片描述

然后开始 Q&A 交互。一共询问了四个问题,这里有三个:

  • 准备移动多少 slot?
  • 准备由谁来接收移动的 slot?
  • 选择要移动 slot 的源节点。有两种方案。如果选择键入 all,则所有已存在 slot 的节点都将作为 slot源节点,即该方案将进行一次 slot 全局大分配。也可以选择其它部分节点作为 slot 源节点。此时将源节点的动态 ID 复制到这里,每个ID 键入完毕后回车,然后再复制下一个 slot 源节点动态 ID,直至最后一个键入完毕回车后再键入 done。

这里键入的是 all,进行全局大分配。

在这里插入图片描述

其首先会检测指定的 slot 源节点的数据,然后制定出 reshard 的方案。

在这里插入图片描述

这里会再进行一次 Q&A 交互,询问是否想继续处理推荐的方案。键入 yes,然后开始真正的全局分配,直至完成。

在这里插入图片描述

此时再通过 redis-cli -c -p 6386 cluster nodes 命令查看节点信息,可以看到 6386 节点中已经分配了 slot,只不过分配的 slot 编号并不连续。master 节点新增完成。

在这里插入图片描述

🍀(5)添加 slave 节点

现要将 6387 节点添加为 6386 节点的 slave。当然,首先要确保 6387 节点的 Redis 是启动状态。

通过 redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort} --cluster-slave --cluster-master-id masterID 命令可将新添加的节点直接添加为指定 master 的 slave。

在这里插入图片描述

回车后可看到如下的日志,说明添加成功。

在这里插入图片描述

此时再通过 redis-cli -c -p 6386 cluster nodes 命令可以看到其已经添加成功,且为指定master 的 slave。
在这里插入图片描述
在这里插入图片描述

6️⃣集群缩容

下面要将 slave 节点 6387 与 master 节点 6386 从分布式系统中删除。

🍀(1)删除 slave 节点

对于 slave 节点,可以直接通过 redis-cli --cluster del-node : delNodeID命令删除。

在这里插入图片描述

此时再查看集群,发现已经没有了 6387 节点。

在这里插入图片描述

🍀(2)移出 master 的 slot

在删除一个 master 之前,必须要保证该 master 上没有分配有 slot。否则无法删除。所以,在删除一个 master 之前,需要先将其上分配的 slot 移出。

在这里插入图片描述
以上交互指定的是将 6386 节点中的 1999 个 slot 移动到 6380 节点。

注意:

  • 要删除的节点所包含的 slot 数量在前面检测结果中都是可以看到的,例如,6386 中的并不是 2000 个,而是 1999 个
  • What is the receiving node ID?仅能指定一个接收节点

回车后继续。

在这里插入图片描述
在这里插入图片描述

此时再查看发现,6386 节点中已经没有 slot 了。

在这里插入图片描述
🍀(3)删除 master 节点

此时就可以删除 6386 节点了。

在这里插入图片描述

此时再查看集群,发现已经没有了 6386 节点。

在这里插入图片描述

四、分布式系统的限制

Redis 的分布式系统存在一些使用限制:

  • 仅支持 0 号数据库
  • 批量 key 操作支持有限
  • 分区仅限于 key
  • 事务支持有限
  • 不支持分级管理

后记

在这里插入图片描述

👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~

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

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

相关文章

把 OpenGrok search 上的Android 开源代码扒下来

1、下载工具 wget (window10版本)以及配置环境变量 工具我会上传到本篇博客的“代码包”区域,可以自行下载! 当然如果可以访问如下链接的话,也可以在这个地址自行下载一个比较新的版本即可!GNU Wget 1.21.…

Web服务器群集:LVS+Keepalived高可用群集

目录 一、理论 1.Keepalived 2.VRRP协议(虚拟路由冗余协议) 3.部署LVSKeepalived 高可用群集 二、实验 1.LVSKeepalived 高可用群集 三、问题 1.备服务器网卡启动报错 四、总结 一、理论 1.Keepalived (1)简介 Keepal…

【动态规划算法】-第一题:1137.第N个斐波那契数

💖作者:小树苗渴望变成参天大树 🎉作者宣言:认真写好每一篇博客 🎊作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 文章目录 前言 前言 各位友友们&#xff0c…

element之el-table合并列功能

目标效果如下&#xff1a; 实现代码如下&#xff1a; html部分&#xff1a; <!--定义表格组件,用组件自带的span-method属性定义合并列的方法--> <el-table :data"tableData" :span-method"spanRow"><el-table-column prop"RegionNa…

在proteus中仿真arduino驱动点阵屏matrix-led

我们都知道&#xff0c;如果我们仅仅在某个时间段点亮一个数码管是没有任何困难的&#xff0c;但如果我们点亮多个数码管就会出现问题&#xff0c;因为多个数码管都使用着同样的端口来控制数码管的各个段的亮灭。所以&#xff0c;就会用上一个很重要的方法&#xff0c;对&#…

使用javaScript脚本生成openFoam网格

简介 OpenFoam的首选网格生成器是blockMesh。blockMesh可以根据blockMeshDict这个字典中的信息生成openFoam网格。但是有时候需要修改网格&#xff0c;而网格中的几何点之间又存在约束关系&#xff0c;如果手动修改blockMeshDict那么工作量将是巨大的&#xff0c;所以有必要使…

有没有免费提取音频的软件,分享几个给大家!

在日常生活中&#xff0c;我们经常遇到需要从视频中提取音频的情况&#xff0c;无论是为了制作音频片段、录制语音笔记还是进行后期编辑。本文将介绍三种免费提取音频的方法&#xff0c;分别是记灵在线工具、PR&#xff08;Adobe Premiere Pro&#xff09;和剪映。通过这些方法…

【Vue3】学习笔记-自定义hook函数

概念 什么是hook? 本质是一个函数&#xff0c;把setup函数中使用的Composition API进行了封装。 类似于vue2.x中的mixin。(但是mixins会组件的配置项覆盖。vue3使用了自定义hooks替代mixnins&#xff0c;hooks本质上是函数&#xff0c;引入调用。) 自定义hook的优势: 复用代…

PPU (power policy unit)

写在前边 最近在做低功耗验证&#xff0c;项目中涉及到PPU这一块儿&#xff0c;在家查了好久资料&#xff0c;发现能找到的有价值的文章真的好少&#xff0c;机缘巧合之下&#xff0c;让我找到下边总结&#xff0c;分享出来&#xff0c;希望对和我有相同境遇的小伙伴带来帮助&a…

每周学点数学 2:概率论基础1

泊松分布、正态分布、二项分布 文章目录 1.概率论学习中的重难点2.主要工具介绍1. Python2. MATLAB3. R4. Octave5. Microsoft Excel6. 统计软件 3.理论内容概览&#xff08;前两点&#xff09;1. 概率2. 概率分布 注&#xff1a;本文适用于在在数学建模的应用中&#xff0c;回…

牛客网基础语法101~110题

牛客网基础语法101~110题&#x1f618;&#x1f618;&#x1f618; &#x1f4ab;前言&#xff1a;今天是咱们第十期刷牛客网上的题目。 &#x1f4ab;目标&#xff1a;对打印图案做到有手就行。 &#x1f4ab;鸡汤&#xff1a;与其花时间应付以后不理想的生活&#xff0c;不如…

学习c++ Part02

学习c Part02 前言1.函数注意点&#xff1a;全局函数&#xff08;默认函数&#xff09;静态函数 2.预处理2.1 变量 3.头文件4.宏函数5.指针5.1 普通变量与指针变量建立关系&#xff1a;5.2 指针初始化5.3 指针变量的注意事项5.3.1 void 不能定义普通变量,void * 可以定义指针变…

SpringBoot源码解析

1.Spring Boot介绍,源码阅读环境搭建,插件安装 2.spring boot 源码解析2-SpringApplication初始化 3.spring boot 源码解析3-SpringApplication#run 4.spring boot 源码解析4-SpringApplication#run第4步 5.spring boot 源码解析5-SpringApplication#run第5步 6.spring boot 源…

springboot医院挂号小程序

医院挂号系统 springboot医院挂号系统小程序 java医院挂号小程序 技术&#xff1a; 基于springbootvue小程序医院挂号系统的设计与实现 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;…

在线教育场景下客户端实践与优化——RTC服务在线教育

在线教育场景下对提供稳定、高质量的音视频服务提出了非常高的要求。而不断推陈出新的课堂形式以及新技术的应用&#xff0c;使得好未来自研音视频SDK面临更多的挑战。 LiveVideoStackCon 2022北京站邀请到好未来音视频开发高级专家郭晓明介绍好未来自研SDK在工程化上所做出的努…

【编译、链接、装载十五】系统调用与API——printf源码分析

【编译、链接、装载十五】系统调用与API——printf源码分析 一、系统调用介绍1、什么是系统调用2、Linux系统调用3、系统调用的弊端 二、系统调用原理1、中断 三、linux下系统调用实现1、 strace 查看可知&#xff0c;printf调用了系统函数write2、gdb调试查看——printf3、gdb…

实践|随机森林中缺失值的处理方法

动动发财的小手&#xff0c;点个赞吧&#xff01; 除了在网上找到的一些过度清理的数据集之外&#xff0c;缺失值无处不在。事实上&#xff0c;数据集越复杂、越大&#xff0c;出现缺失值的可能性就越大。缺失值是统计研究的一个令人着迷的领域&#xff0c;但在实践中它们往往很…

并查集的讲解

什么是并查集&#xff1f; --是一个森林&#xff1b;&#xff08;由多颗树构成的&#xff09; 并查集原理 在一些应用问题中&#xff0c;需要 将 n 个不同的元素划分成一些不相交的集合 。 开始时&#xff0c;每个元素自成一个 单元素集合&#xff0c;然后按一定的规律将归于…

springboot开启热部署

第一步引入spring-boot-devtools依赖 <!--热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><!--默认false改依赖是否可以传递&…

【Servlet】如何使用 Servlet 编写第一个 helloword 程序

文章目录 前言一、创建 Maven 项目二、引入依赖三、创建目录四、编写代码五、打包项目六、部署程序七、运行程序总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习…