Redis 高可用:主从复制、哨兵模式、集群模式

news2024/11/25 16:50:55

文章目录

  • 一、redis高可用性概述
  • 二、主从复制
    • 2.1 主从复制
    • 2.2 数据同步的方式
      • 2.2.1 全量数据同步
      • 2.2.2 增量数据同步
    • 2.3 实现原理
      • 2.3.1 服务器 RUN ID
      • 2.3.2 复制偏移量 offset
      • 2.3.3 环形缓冲区
  • 三、哨兵模式
    • 3.1 原理
    • 3.2 配置
    • 3.3 流程
    • 3.4 使用
    • 3.5 缺点
  • 四、cluster集群
    • 4.1 原理
    • 4.2 特征
    • 4.3 流程
    • 4.4 缺点
    • 4.5 故障转移
      • 4.5.1 故障检测
      • 4.5.2 故障转移
    • 4.6 集群配置和管理
      • 4.6.1 主要命令
      • 4.6.2 创建集群
      • 4.6.3 查看集群配置信息
      • 4.6.4 测试集群
      • 4.6.5 扩容
      • 4.6.6 缩容

一、redis高可用性概述

1、高可用是分布式的概念。
Redis的高可用性是指在Redis集群中,当主节点宕机了,通过切换备用节点顶替它继续运行,保持系统正常运行且数据可靠性不受影响。

2、通过实现Redis的高可用性,可以提供以下几个主要优势:
1)避免单点故障:通过配置和设置多个Redis节点,如果其中一个节点发生故障,其他节点可以接替工作,避免了单点故障对整个系统的影响。

2)数据冗余和复制:通过数据的复制和持久化备份,Redis能够在主节点出现故障时,自动切换到备用节点,并恢复数据,确保数据的持久性和可用性。

3)故障自动检测和故障转移:Redis的高可用方案通常具备故障检测和自动故障转移的功能,能够监控节点的健康状态,并在节点故障时自动将从节点升级为主节点。

3、因此,redis的高可用主要完成以下工作:
1)数据同步。主节点和从节点(备用节点)之间的数据需要进行同步。

2)主从切换。若主节点宕机,需要有一种机制可以切换从节点变成主节点。

二、主从复制

2.1 主从复制

主从复制是数据同步方式,解决了单点故障的问题,但不能保证高可用(是高可用的基础)。主要用来实现 redis 数据的可靠性,防止主 redis 所在磁盘损坏,造成数据永久丢失。

主从之间采用异步复制的方式,以及采用读写分离的方式,主节点(master)可以进行读写操作,从节点(replica)一般是只读。也就是说,所有的数据修改只在主节点上进行,然后将最新的数据同步给节点,这样就使得主从服务器的数据是一致的。
在这里插入图片描述
需要注意的是:
1)主从复制无法提供高可用和数据保护能力,因为主节点发生故障时,需要手动进行故障转移。

2)从节点主动向主节点建立连接,从节点主动同步主节点的数据。

2.2 数据同步的方式

2.2.1 全量数据同步

1)全量数据同步是在从节点刚加入复制集群或者需要进行完整数据更新时执行的同步过程。

2)它的目标是将主节点上的所有数据完整地同步到从节点。全量数据同步的过程是将主节点上的所有内存数据通过快照(RDB文件)方式发送给从节点,从节点接收到快照后将其加载到自己的数据库中。

3)全量数据同步会消耗较大的网络带宽和时间,特别是在数据集较大的情况下。并且在全量数据同步过程中,从节点无法处理外部的读取请求,因为它正在重新加载大量的数据。
在这里插入图片描述

2.2.2 增量数据同步

1)增量数据同步是在全量数据同步完成后,用于保持主从节点之间数据的一致性。

2)它通过记录主节点上的增量写命令(例如AOF日志文件)并将其发送给从节点来实现。增量数据同步的过程是在主节点上记录所有的写操作,并将这些操作记录传输给从节点,从节点接收到后执行这些操作以保持与主节点的数据一致。

3)增量数据同步具有实时性,可以减少数据同步的延迟

从数据库会记录一个偏移量offset(即记录同步到哪里了)。当从数据库断开重连,主数据库补发丢失数据到从数据库。此时如果offset在环形缓冲区当中,从数据库就会将offset后面的那部分数据同步过来,增量同步;如果offset不在环形缓存区中,说明数据过期太久,就会全量同步,把主数据库内部所有数据都同步过来。
在这里插入图片描述

2.3 实现原理

主从复制主要由环形缓冲区、复制偏移量、RUN ID三个部分组成。

2.3.1 服务器 RUN ID

RUNID用于构建主从的关系。无论主库还是从库都有自己的 RUN ID , RUN ID 启动时自动产生, RUN ID 由 40 个随机的十六进制字符组成。

当从库对主库初次复制时,主库将自身的 RUN ID 传送给从库,从库会将 RUN ID 保存。
当从库断线重连主库时,从库将向主库发送之前保存的 RUN ID :
∙ \bullet 从库 RUN ID 和主库 RUN ID 一致,说明从库断线前复制的就是当前的主库;主库尝试执行增量同步操作;
∙ \bullet 若不一致,说明从库断线前复制的主库并不时当前的主库,则主库将对从库执行全量同步操作。

2.3.2 复制偏移量 offset

主从都会维护一个复制偏移量:
∙ \bullet 主库向从库发送 N 个字节的数据时,将自己的复制偏移量上加 N;
∙ \bullet 从库接收到主库发送的 N 个字节数据时,将自己的复制偏移量加上 N。

通过比较主从偏移量得知主从之间数据是否一致;偏移量相同,则数据一致;偏移量不同,则数据不一致。

2.3.3 环形缓冲区

本质:固定长度先进先出队列。

当因某些原因(网络抖动或从库宕机)从库与主库断开连接,避免重新连接后开始全量同步,在主库设置了一个环形缓冲区;该缓冲区会在从库失联期间累计主库的写操作;当从库重连,会发送自身的复制偏移量到主库,主库会比较主从的复制偏移量“
∙ \bullet 若从库 offset 还在复制积压缓冲区中,则进行增量同步;
∙ \bullet 否则,主库将对从库执行全量同步。

在这里插入图片描述

三、哨兵模式

3.1 原理

哨兵模式是 Redis 可用性的解决方案,它由一个或多个 sentinel实例构成 sentinel 系统。该系统通过 ping-pong 心跳检测的方法监视任意多个主库以及这些主库所属的从库。当主库处于下线状态,自动将该主库所属的某个从库升级为新的主库,从而实现高可用。

客户端来连接集群时,会首先连接 sentinel,通过 sentinel 来查询主节点的地址,然后再连接主节点进行数据交互。当主节点发生故障时,客户端会重新向 sentinel 索要主库地址,sentinel会将最新的主库地址告诉客户端。通过这样客户端无须重启即可自动完成节点切换。

Sentinel 节点个数是奇数,不存储数据,用来监控节点的状态和选举主节点,只提供一个数据节点服务。Sentinel 节点不仅监控 Redis 主从节点,同时还互相监控,形成多哨兵模式。

Sentinel 模式当中涉及的多个选举流程采用的是 raft 一致性算法。

在这里插入图片描述

3.2 配置

# sentinel.cnf
# sentinel 只需指定检测主节点就行了,通过主节点自动发现从节点
sentinel monitor mymaster 127.0.0.1 6379 2
# 判断主观下线时长
sentinel down-after-milliseconds mymaster 30000
# 指定可以有多少个Redis服务同步新的主机,一般而言,这个数字越小同步时间越长,而越大,则对网络资源要求越高
sentinel parallel-syncs mymaster 1
# 指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
sentinel failover-timeout mymaster 180000

3.3 流程

1)主观下线
sentinel 会以每秒一次的频率向所有节点(其他sentinel、主节点、以及从节点)发送 ping 消息,然后通过接收返回判断该节点是否下线。如果在配置指定 down-after-milliseconds 时间内则被判断为主观下线。

2)客观下线
当一个 sentinel 节点将一个主节点判断为主观下线之后,为了确认这个主节点是否真的下线,它会向其他 sentinel 节点进行询问,如果收到一定数量(半数以上)的已下线回复,sentinel 会将主节点判定为客观下线,并通过领头 sentinel 节点对主节点执行故障转移。

3)故障转移
主节点被判定为客观下线后,开始领头 sentinel 选举。按照谁发现谁处理的原则选举领头 sentinel,需要半数以上的 sentinel 支持。选举领头 sentinel 后,开始执行对主节点故障转移:
∙ \bullet 从从节点中选举一个从节点作为新的主节点
∙ \bullet 通知其他从节点复制连接新的主节点
∙ \bullet 若故障主节点重新连接,将作为新的主节点的从节点

3.4 使用

1)连接哨兵节点 —— 连接一个哨兵节点,并且获取主节点信息:SENTINEL GET-MASTER-ADDR-BY-NAME 。

2)获取主节点地址并连接 —— 验证当前获取的主节点:ROLE 或者 INFO REPLICATION。

3)发起发布订阅连接,监听主节点迁移信息 —— 为当前连接的哨兵节点,添加发布订阅(PUB/SUB)连接,并且订阅 +switch-master 频道,以此互相感知,互相连接,组成哨兵集群。

3.5 缺点

redis 采用异步复制的方式,意味着当主节点挂掉时,从节点可能没有收到全部的同步消息,这部分未同步的消息将丢失。如果主从延迟特别大,那么丢失可能会特别多。sentinel 无法保证消息完全不丢失,但是可以通过配置来尽量保证少丢失。

# 主库必须有一个从节点在进行正常复制,否则主库就停止对外
写服务,此时丧失了可用性
min-slaves-to-write 1
# 这个参数用来定义什么是正常复制,该参数表示如果在10s内
没有收到从库反馈,就意味着从库同步不正常;
min-slaves-max-lag 10

总结来说:
1)部署麻烦:哨兵模式的配置相对复杂,需要管理和维护多个哨兵节点以及与它们关联的 Redis 服务器。调试和故障排除也可能变得更加困难。

2)数据一致性:哨兵模式下的故障转移是异步进行的,这意味着在发生主服务器故障时,可能会有一段时间内的数据丢失。因此,在一些对数据一致性要求非常高的场景下,哨兵模式可能无法满足需求。

3)难以在线扩容的缺点,Redis的容量受限于单机配置

4)延迟增加:当主服务器故障时,哨兵节点需要通过选举机制选择新的主服务器,并通知其他从服务器切换到新的主服务器。这个过程需要时间(至少十几秒),会导致系统的延迟增加。

5)单点故障:哨兵节点是集群的核心,,它们负责监控主服务器和从服务器的状态,并执行故障转移操作。然而,如果哨兵节点本身发生故障,整个系统的可用性将会受到影响。

四、cluster集群

4.1 原理

Redis cluster 通过将数据库分散存储到多个节点上来平衡各个节点的负载压力,实现了 Redis 的分布式存储。

通过分布式一致性hash算法crc(key)%16384,将所有数据划分为 16384( 2 14 2^{14} 214)个槽位,每个redis 节点负责其中一部分槽位。cluster 集群是一种去中心化的集群方式;
在这里插入图片描述

如图,该集群由三个 redis 节点组成,每个节点负责整个集群的一部分数据,每个节点负责的数据多少可能不一样。这三个节点相互连接组成一个对等的集群,它们之间通过一种特殊的二进制协议交互集群信息。

当 redis cluster 的客户端来连接集群时,会得到一份集群的槽位配置信息。这样当客户端要查找某个 key 时,可以直接定位到目标节点。
在这里插入图片描述
客户端为了可以直接定位(对 key 通过 crc16 进行 hash 再对 2 14 2^{14} 214取余 crc16(key)% 16384)某个具体的 key 所在节点,需要缓存槽位相关信息,这样才可以准确快速地定位到相应的节点。同时因为可能会存在客户端与服务器存储槽位的信息不一致的情况,还需要纠正机制(比如通过返回 -MOVED 3999 127.0.0.1:6479 ,客户端收到后需要立即纠正本地的槽位映射表)来实现槽位信息的校验调整。

另外,redis cluster 的每个节点会将集群的配置信息持久化到配置文件中,这就要求确保配置文件是可写的,而且尽量不要依靠人工修改配置文件。

4.2 特征

1)去中心化,主节点关系对等

2)解决了数据扩容

3)客户端与服务端缓存槽位信息,以服务端为准,客户节点缓存主要为了避免连接切换

4)可人为迁移数据

5)主节点处理读写命令

4.3 流程

1)连接集群中任意一个节点

2)若数据不在该节点,将收到连接切换的命令,继而连接到目标节点

3)故障转移(主节点下移)
∙ \bullet 集群结点间互相监控,交换节点的状态信息
∙ \bullet 若某主节点下线,将会被其他主节点标记下线
∙ \bullet 接着从下线主节点的从节点中选择一个数据最新的从节点作为主节点
∙ \bullet 从节点继承下线主节点的槽位信息,并广播该消息给集群中的其他节点

4.4 缺点

主从异步复制在故障转移时仍存在数据丢失的问题

4.5 故障转移

cluster 集群中节点分为主节点和从节点,其中主节点用于处理槽,而从节点则用于复制该主节点,并在主节点下线时,代替主节点继续处理命令请求。

4.5.1 故障检测

集群中每个节点都会定期地向集群中的其他节点发送 ping 消息,如果接收 ping 消息的节点没有在规定时间内回复 pong消息,那么这个没有回复 pong消息的节点会被标记为 PFAIL(probable fail)。

集群中各个节点会通过互相发送消息的方式来交换集群中各个节点的状态信息;如果在一个集群中,半数以上负责处理槽的主节点都将某个主节点 A 报告为疑似下线,那么这个主节点 A将被标记为下线( FAIL );标记主节点 A 为下线状态的主节点会广播这条消息,其他节点(包括A节点的从节点)也会将A节点标识为 FAIL

4.5.2 故障转移

当从节点发现自己的主节点进入 FAIL 状态,从节点将开始对下线主节点进行故障转移:
∙ \bullet 从数据最新的从节点中选举为主节点;
∙ \bullet 该从节点会执行 replica no one 命令,称为新的主节点;
∙ \bullet 新的主节点会撤销所有对已下线主节点的槽指派,并将这些槽全部指派给自己;
∙ \bullet 新的主节点向集群广播一条 pong 消息,这条 pong 消息可以让集群中的其他节点立即知道这个节点已经由从节点变成主节点,并且这个主节点已经接管了之前下线的主节点;
∙ \bullet 新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移结束

4.6 集群配置和管理

4.6.1 主要命令

redis-cli --cluster help

# 创建集群
create <ip>:<port>
--cluster-replicas <num>	# 创建集群的同时,为每个主节点配备的从节点个数

# 查看集群的信息,群中任意节点地址作为参数,后面同理
info <ip>:<port>	
# 检查集群的配置
check <ip>:<port>	

# 重分片,将指定数量的槽从源节点迁移至目标节点,由目标节点负责迁移的槽和槽中数据
reshared <ip>:<port>
--cluster-from 	# 源节点的ID
--cluster-to	# 目标节点的ID
--cluster-slots <num> # 需要迁移的槽数量

# 添加节点,添加新节点 new 集群 existing,默认添加主节点
add-node <new_host>:<port> <existing_host>:<port>
# 添加从节点,需要以下两个子命令
--cluster-slave 
--cluster-master-id <id> # 设置从节点要复制的主节点

# 移除节点
del-node <ip>:<port> <id>

4.6.2 创建集群

zxm@ubuntu:~/cluster-example$ redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

4.6.3 查看集群配置信息

zxm@ubuntu:~/cluster-example$ redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (0456481a...) -> 1 keys | 6461 slots | 1 slaves.
127.0.0.1:7002 (2b83d979...) -> 1 keys | 4961 slots | 1 slaves.
127.0.0.1:7003 (da48c6b4...) -> 0 keys | 4962 slots | 1 slaves.
[OK] 2 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: 0456481a2e18b0ec97ad8173dd0352f890d39659 127.0.0.1:7001
   slots:[0-5961],[10923-11421] (6461 slots) master
   1 additional replica(s)
S: 78d4179ab020052fbc4197d4d7867607c3787d27 127.0.0.1:7006
   slots: (0 slots) slave
   replicates da48c6b4d48ae37d6e8ac6b1e12e9e2831f484e2
S: 96d453c5607eef91ce068f0c09193877a1cf3346 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 0456481a2e18b0ec97ad8173dd0352f890d39659
S: 1e8d9da3b8649c3b52ef407d031efbb11bcc56c1 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 2b83d9798821b0e2b1353c8b83da17e018b2b754
M: 2b83d9798821b0e2b1353c8b83da17e018b2b754 127.0.0.1:7002
   slots:[5962-10922] (4961 slots) master
   1 additional replica(s)
M: da48c6b4d48ae37d6e8ac6b1e12e9e2831f484e2 127.0.0.1:7003
   slots:[11422-16383] (4962 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4.6.4 测试集群

#集群模式主从节点对等,可从任意节点进入。
# 虽然从7005进入,但是crc16计算后,应分配在7002节点,切换
zxm@ubuntu:~/cluster-example$ redis-cli -c -h 127.0.0.1 -p 7005  
127.0.0.1:7005> set zxm 1
-> Redirected to slot [9010] located at 127.0.0.1:7002 
OK

# 虽然从7005进入,但是zxm的值在7002节点,切换
zxm@ubuntu:~/cluster-example$ redis-cli -c -h 127.0.0.1 -p 7005
127.0.0.1:7005> get zxm
-> Redirected to slot [9010] located at 127.0.0.1:7002
"1"

4.6.5 扩容

先添加节点,再分配槽位。

# 1,创建节点文件
cp -R 7001 7007
cd 7007
mv 7001.conf 7007.conf
rm 7001.log dump.rdb nodes-7001.conf
sed -i "s/7001/7007/g" 7007.conf

cd ..
cp -R 7007 7008
cd 7008
mv 7007.conf 7008.conf
sed -i "s/7007/7008/g" 7008.conf

cd ..
redis-server 7007/7007.conf
redis-server 7008/7008.conf

# 2, 添加节点
# 添加主节点,新添加的节点默认作为主节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 
# 添加从节点
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001  --cluster-slave --cluster-master-id 0456481a2e18b0ec97ad8173dd0352f890d39659 

# 3,分配槽位
# 重分片,将主节点 7001 的 1000 个槽迁移至新的主节点 7007
redis-cli --cluster reshard 127.0.0.1:7001 --cluster-from 0456481a2e18b0ec97ad8173dd0352f890d39659 --cluster-to 9f3d34828e1eb41214c158a142c350ca3f604487 --cluster-slots 1000

4.6.6 缩容

先移动槽位,再删除节点.

# 1,移动槽位
# 将主节点 7007 的所有槽迁移至主节点 7001
redis-cli --cluster reshard 127.0.0.1:7001 --cluster-from 9f3d34828e1eb41214c158a142c350ca3f604487 --cluster-to 0456481a2e18b0ec97ad8173dd0352f890d39659 --cluster-slots 1000

# 2、删除节点
# 删除节点 7007
redis-cli --cluster del-node 127.0.0.1:7001 9f3d34828e1eb41214c158a142c350ca3f604487 

# 此时 7008 成为其他节点的 副本节点
# S: d7316f5d4f0fdef182d7a27c56c911b9fe644b97 127.0.0.1:7008
#    slots: (0 slots) slave
#    replicates 0456481a2e18b0ec97ad8173dd0352f890d39659
# 删除从节点7008
redis-cli --cluster del-node 127.0.0.1:7001 d7316f5d4f0fdef182d7a27c56c911b9fe644b97

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

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

相关文章

芯片制造详解.薄膜沉积.学习笔记(六)

这里附上原视频链接&#xff0c;此文章是对于视频的归纳和整理。 如何造出芯片&#xff1a;薄膜沉积&#xff5c;芯片制造详解06 芯片制造详解.薄膜沉积.学习笔记 六 一、由薄膜引出沉积二、沉积的分类2.1 物理沉积(PVD)2.2 化学气相沉积(CVD) 三、沉积的历史3.1 V1.0 常压化学…

无涯教程-Lua - 简介

Lua是一种轻量语言&#xff0c;它的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快。它用ANSI C语言编写并以源代码形式开放&#xff0c;编译后仅仅一百余K&#xff0c;可以很方便的嵌入别的程序里。和许多“大而全”的语言不一样&#xff0c;网络通信…

STM32基础知识学习笔记汇总

笔记后面补充汇集到此 怎么选 初学&#xff1a;海创、杨桃杜洋、江科大、千峰进阶&#xff1a;安福莱、普中过度&#xff1a;韦东山深入&#xff1a;正点、野火其他&#xff1a;金沙滩、自化协、硬石 扩展 库函数操作相当于C&#xff0c;面向对象寄存器操作相当于C &#xff…

【HarmonyOS】键盘遮挡输入框时,实现输入框显示在键盘上方

【关键字】 harmonyOS、键盘遮挡input&#xff0c;键盘高度监听 【写在前面】 在使用API6、API7开发HarmonyOS应用时&#xff0c;常出现页面中需要输入input&#xff0c;但是若input位置在页面下方&#xff0c;在input获取焦点的时候&#xff0c;会出现软键盘挡住input情况&a…

【备战csp-j】 csp常考题型详解(2)

二.计算机网络。 1. TCP/IP 协议共有( )层协议 。 A.3 B.4 C.5 D.6 答案&#xff1a;B 解析&#xff1a; 2.Ipv4 地址是由( ) 位二进制数码表示的。 A.16 B.32 C.24 D.8 答案&#xff1a;B 解析&#xff1a;IP地址是IP协议提供的一种统一的地址格式。在目前使用的IPv…

使用Python创建快速创建剪映草稿轨道,自动生成视频

使用Python创建快速创建剪映草稿轨道&#xff0c;自动生成视频 一、实现原理 实现原理 : JianYingPro 项目文件是 json 的形式存储的&#xff0c;只需要创建draft_content.json,draft_mate_info.json 打开软件后会自动补全。 作用&#xff1a;快速生成草稿&#xff0c;可以完…

jenkins通过sshPut传输文件的时候,报错Permission denied的SftpException

一、背景 使用jenkins的ssh插件传输文件至远程机器的指定目录&#xff0c;php程序打包后&#xff0c;经过zip压缩为oms.zip zip -rq oms.zip ./ -x .git/* -x .env然后我们求md5值 md5sum oms.zip最后执行传输。 09:03:02 Executing command on ssh[116.61.10.149]: mkdir…

深度技术解析:验证码短信API的实现原理与优化策略

引言 验证码短信在现代应用中扮演着至关重要的角色&#xff0c;它是一种简单而高效的安全验证方式&#xff0c;被广泛用于各类应用和场景。验证码短信在现代应用中的起着账号安全保障、交易与支付安全保障等重要作用。 在本文中&#xff0c;本文将围绕验证码短信 API 的基本原…

消息队列中间件 MetaQ/RocketMQ

简介—— 消息队列中间件 MetaQ/RocketMQ 中间件 MetaQ 是一种基于队列模型的消息中间件&#xff0c;MetaQ 据说最早是受 Kafka 的影响开发的&#xff0c;第一版的名字 "metamorphosis"&#xff0c;是奥地利作家卡夫卡的名作——《变形记》。RocketMQ 是 MetaQ 的开…

【零基础??天速成 Java】Day1 - 初识 java

目录 前言 1. 第一个 java 程序 2. java 开发的注意事项 3. java 的注释 4. javadoc 标签 5. java 的变量 6. java 的 String 和 基本类型转换 7. java 的输入 8. java 的数组 9. java 的方法 10. java 方法的传参 写在最后&#xff1a; 前言 我的 java 基础学习…

工业机器人:现代制造业的革命力量

随着科技的迅猛发展&#xff0c;工业机器人已经成为现代制造业中不可或缺的一环。工业机器人的发展历经几十年的演进&#xff0c;从最早只能完成重复性、单一性的任务&#xff0c;到如今可以完成复杂多变的工序。工业机器人的应用领域也不断扩大&#xff0c;如汽车制造、电子制…

《零基础入门学习Python》第074讲:GUI的终极选择:Tkinter11

今天我们来讲讲 事件绑定。正如我们此前所提到的&#xff0c;一个 tkinter 的应用程序大部分时间是花费在事件循环中的&#xff0c;也就是通过 mainloop() 方法进入时间循环了&#xff0c;事件可以有各种各样的来源&#xff0c;比如说 用户移动、点击一下鼠标&#xff0c;会产生…

git常用命令速查表

1.git add -u [<路径>]: 把<路径>中所有跟踪&#xff08;tracked&#xff09;文件中被修改过或已删除文件的信息添加到索引库。它不会处理未跟踪&#xff08;untracked&#xff09;的文件。省略<路径>表示&#xff1a;即当前目录。 2.git add -a [<路径&…

BGP属性+选路规则

目录 一&#xff0c;BGP的属性—基础属性 1.PrefVal 2.LocPrf 3、优先本地下一跳 &#xff08;NextHop&#xff09; 4、AS-PATH 5、起源属性 6、MED -多出口鉴别属性 二&#xff0c;BGP选路规则 三&#xff0c;BGP的社团属性 一&#xff0c;BGP的属性—基础…

埃隆马斯克五步工作法丨IDCF

作者&#xff1a;徐磊 文章首发地址&#xff1a;https://smartide.cn/zh/blog/2022-0707-elonmusk-5steps/ 埃隆马斯克在2021年被福布斯杂志评选为世界首富&#xff0c;截至2022年7月他的个人财富为2214亿美金&#xff0c;他同时也是多家公司的CEO&#xff0c;包括&#xff1a…

便利生活,探索上门家政小程序的必备功能与用户体验

上门家政小程序是一种方便用户在线预约家政服务的应用程序。下面将介绍一下开发上门家政小程序时的必备功能&#xff0c;以及这些功能如何提供便利和增加用户体验。   在线预约功能&#xff1a;上门家政小程序提供了在线预约平台&#xff0c;用户可以通过手机随时随地选择需要…

Linux命令(56)之ifconfig

Linux命令之ifconfig 1.ifconfig介绍 linux命令ifconfig可以用来查看网卡信息&#xff0c;启停网卡&#xff0c;设置网络IP等&#xff0c;基于实际运维场景&#xff0c;我们就来说说ifconfig普遍的常规用法 2.ifconfig用法 ifconfig [网络设备名称] [参数] ifconfig参数 参…

try catch 应该在for循环里面还是外面

使用场景 为什么要把 使用场景 摆在第一个 &#xff1f; 因为本身try catch 放在 for循环外面和里面&#xff0c;如果出现异常&#xff0c;产生的效果是不一样的。 怎么用&#xff0c;就需要看好业务场景&#xff0c;去使用了。 ① try catch在for循环外面 代码示例 &…

免费Scrum工具,Scrum敏捷研发管理流程

Leangoo领歌它覆盖了敏捷项目研发全流程&#xff0c;包括小型团队Scrum敏捷开发&#xff0c;规模化敏捷SAFe&#xff0c;Scrum of Scrums大规模敏捷。它提供了灵活的敏捷模板和极致的协作体验&#xff0c;可以让团队快速上手&#xff0c;快速落地Scrum敏捷开发管理。 首先建立产…

Arcgis 分区统计majority参数统计问题

利用Arcgis 进行分区统计时&#xff0c;需要统计不同矢量区域中栅格数据的众数&#xff08;majority&#xff09;&#xff0c;出现无法统计majority参数问题解决 解决&#xff1a;利用copy raster工具&#xff0c;将原始栅格数据 64bit转为16bit