Redis的主从复制和哨兵模式

Redis的主从复制和哨兵模式

    • Redis集群搭建(一主二从)
      • replication 主从复制配置文件 redis.conf
      • Redis主从复制工作原理
        • 全量复制
        • 增量复制
        • redis主从复制策略
      • 搭建集群 (主从复制引入)
    • 哨兵模式
      • 概念
      • 哨兵配置文件 sentinel.conf
        • 哨兵配置文件模板【入门】
      • 配置哨兵模式(一主二从三哨兵)
        • ① 先配置redis的主从服务器
        • ② 配置哨兵
        • ③ 启动服务
        • ④ 访问验证
        • ⑤ 主从服务器数据插入验证
        • ⑥ 验证主节点宕机,集群故障自动转移

Redis集群搭建(一主二从)

image.png

replication 主从复制配置文件 redis.conf

主从复制相关的配置项在redis.conf中的replication一栏中

以下是与 Redis 复制相关的配置项及其解释:

  1. replicaof <masterip> <masterport> :
  • 这个配置项用于设置 Redis 服务器作为从服务器(slave),并指定其主服务器(master)的 IP 地址和端口。
  • 例如,replicaof 192.168.1.100 6379 意味着这台 Redis 服务器将从 IP 地址为 192.168.1.100,端口为 6379 的 Redis 服务器复制数据。
  1. masterauth <masterr-password>:
  • 如果主服务器设置了密码,那么从服务器需要使用这个配置项来提供密码,以便能够连接到主服务器并进行数据复制。
  • 例如,masterauth mysecretpassword 将会设置从服务器的主服务器密码为 mysecretpassword
  1. repl-ping-slave-period :
  • 从服务器会每隔指定的秒数向主服务器发送一个 PING,用于确保连接是活动的。默认值是 10 秒。
  • 你可以通过调整这个值来平衡网络流量和确保连接的稳定性。
  1. repl-timeout :
  • 这是一个超时时间,用于定义从服务器等待主服务器的响应的最长时间。如果在这个时间内没有收到响应,从服务器将断开连接。默认值是 60 秒。
  • 如果网络不稳定或主服务器负载很高,可能需要增加这个值。
  1. repl-disable-tcp-nodelay:
  • 这个选项控制 TCP NoDelay 选项是否应用于从服务器与主服务器之间的连接。
  • 默认情况下,该选项是关闭的,这意味着 TCP NoDelay 是启用的。启用 TCP NoDelay 可以减少网络延迟,但可能会增加 CPU 使用率。
  • 在某些情况下,禁用 TCP NoDelay 可能会提高性能,尤其是在高延迟的网络环境中。
  1. repl-backlog-size :
  • 这个配置项设置了复制积压缓冲区的大小。复制积压是一个缓冲区,用于保存最近被主服务器写入的数据,以便从服务器可以进行部分同步。
  • 默认值是 1MB。如果你的数据集很大,或者从服务器经常断开连接并重新连接,可能需要增加这个值。
  1. repl-backlog-ttl :
  • 这个配置项设置了复制积压缓冲区的存活时间。当缓冲区中的数据超过这个指定的秒数没有被从服务器取走时,这些数据将被移除。
  • 默认值是 3600 秒(1 小时)。如果网络环境不稳定,或者从服务器经常离线,可能需要减少这个值。

Redis主从复制工作原理

Redis的主从复制可以根据是否是全量分为全量复制增量复制

全量复制

Redis的全量复制发生在Slave(从节点)初始化阶段,此时slave需要将master主机上的所有数据都复制一份。

  • 从服务器连接主服务器,发送SYNC同步命令
  • 主服务器收到sync同步命令后,开始执行bgsave命令生成.rdb文件,并使用缓冲区记录此后执行的所有写命令。
  • 主服务器bgsave执行完成之后,向所有从服务器发送快照,并在发送快照期间继续记录被执行的写命令。
  • 从服务器收到快照文件后,丢弃所有的旧数据,载入收到的快照
  • 主服务器快照发送完毕之后开始向从服务器发送缓冲区中的写命令
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来着主服务器缓冲区的写命令。

下面是从网上拿来的两张图,可以更清晰的了解主从复制原理及流程


增量复制

redis的增量复制发生在slave(从节点)初始化后开始正常工作时,主服务器发生的写操作同步到从服务器的过程。

增量复制:主服务器每执行一个写命令就会向从服务器发送一个相同的写命令,从服务器接收并执行收到的写命令。

redis主从复制策略

主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。

redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

搭建集群 (主从复制引入)

步骤如下:

  1. 拷贝redis.conf配置文件,我们一共需要三台redis-server,所以拷贝三份即可。
  2. 修改配置文件,因为每个redis-server都是不同的实例,所以需要修改配置文件
    • 修改port端口
    • 修改pidfile文件名
    • 后台启动服务
    • 修改rdb或者aof文件存放位置(具体看你的持久化使用的是rdb还是aof)
    • 修改logfile文件存放位置
    • 修改replication中的配置 replicaof masterip masterport(配置文件是永久有效,命令是临时有效 slaveof masterip masterport)
  3. 启动每个服务,并且查看不同redis-server的配置信息info replication

开始搭建集群!6379为主节点,其余6380,6381为从节点。

cp redis7.conf redis6379.conf
cp redis7.conf redis6380.conf
cp redis7.conf redis6381.conf

主节点6379

vim redis6379.conf# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6379  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6379.pid # 指定pidfile文件
logfile "/myredis/redis6379.log" # 指定Logfile文件
dbfilename dump6379.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
requirepass robin # 设定redis服务器的密码# 保存退出
ESC shift: wq

从节点6380

vim redis6380.conf# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6380  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6380.pid # 指定pidfile文件
logfile "/myredis/redis6380.log" # 指定Logfile文件
dbfilename dump6380.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证requirepass robin # 设定redis服务器的密码# 保存退出
ESC shift: wq

从节点6381

vim redis6381.conf# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6381  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6381.pid # 指定pidfile文件
logfile "/myredis/redis6381.log" # 指定Logfile文件
dbfilename dump6381.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证requirepass robin # 设定redis服务器的密码# 保存退出
ESC shift: wq

启动三个服务

# redis-server redis配置文件路径
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf

image.png
使用ps -ef | grep redis查看一下进程
image.png

登录到三台服务器上观察下:

# 开启三个窗口,然后进行不同服务器的登录redis-cli -a robin -p 6379redis-cli -a robin -p 6380redis-cli -a robin -p 6381

image.png

测试一下,基础的操作把!主节点用于写数据,从节点用于读数据不能写数据。
image.png

至此,一主二从的主从复制已经搭建完毕,但是正常业务中,并不是这么简单的。

当前我们只有一台主节点,那当我们的主节点意外宕机断开连接怎么办?
难道我们要一直等着主节点启动吗?当然不是,这个时候就需要哨兵模式来完成了(当然,手动也可以,但是比较繁琐,而且真实情况下也没人会用手动切换主从),当我们的主节点意外断开连接宕机,我们应该在剩下的从节点中,选出一台服务器作为主节点!!!

哨兵模式

概念

哨兵模式是一种特殊的模式,redis提供了哨兵的命令redis-sentinel,**哨兵是一个独立的进程,即独立运行。
哨兵模式的原理:哨兵通过发送命令,等待redis服务器响应,从而监控多个redis实例。

哨兵通过发送命令,监控主从服务器的运行状态
当哨兵检测到master宕机时,会自动将slave切换成master(根据哨兵的配置去切换),然后通过发布订阅模式publishsubcribe通知其他的从服务器,修改配置文件,让它们切换主机。

哨兵配置文件 sentinel.conf

下面是redis提供的哨兵配置文件例子 ,在redis的安装目录下sentinel.conf
image.png
sentinel.conf 是 Redis Sentinel 的配置文件,用于配置和管理 Sentinel 系统。

Sentinel 是 Redis 的一个高可用性解决方案,它可以监视任意多个 Redis 主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,代替已下线的主服务器继续处理请求。

以下是 sentinel.conf 文件中一些常见的配置项及其解释:

  1. sentinel monitor <master-name> <ip> <port> <quorum>
  • <master-name>:主服务器的名称,用于在 Sentinel 集群中唯一标识一个主服务器。
  • <ip><port>:主服务器的 IP 地址和端口号。
  • <quorum>:判断主服务器是否下线的最小 Sentinel 数量。
  1. **sentinel down-after-milliseconds **
  • 设置判断主服务器是否下线的超时时间。如果在指定的毫秒数内,Sentinel 没有收到主服务器的有效回复,则认为该主服务器已下线。
  1. **sentinel failover-timeout **
  • 设置故障转移的超时时间。如果在指定的毫秒数内,Sentinel 没有完成故障转移的操作,则放弃故障转移。
  1. **sentinel parallel-syncs **
  • 设置在进行故障转移时,可以有多少个从服务器同时对新的主服务器进行同步。
  1. sentinel can-failover <yes|no>
  • 设置 Sentinel 是否可以对指定的主服务器进行故障转移。
  1. sentinel deny-scripts-reconfig <yes|no>
  • 设置是否允许通过 SENTINEL RECONFIGURE 命令来修改 Sentinel 的配置。
  1. **sentinel auth-pass **
  • 设置与 Redis 主服务器进行通信时所使用的密码。
  1. **sentinel announcement-ip **
  • 设置 Sentinel 公告的 IP 地址。当 Sentinel 与其他 Sentinel 或 Redis 服务器通信时,将使用这个 IP 地址。
  1. **sentinel down-after-script **
  • 设置一个自定义的脚本,当 Sentinel 检测到主服务器下线时,会执行该脚本。
哨兵配置文件模板【入门】
# 设置sentinel的工作目录,注意这个路径必须是存在的  
dir /tmp  # 哨兵的默认端口为26379 我们配置多个哨兵就需要改成不同的端口
port 26379# 和redis-server一样。哨兵也需要维护唯一的pidfile
pidfile /var/run/redis-sentinel.pid# 6379表示要监听的服务器的端口  2 表示当两个哨兵认为master不可达时,才会发生故障转移
sentinel monitor mymaster 127.0.0.1 6379 2  # 设置判定主服务器下线的超时时间,默认是30秒  
sentinel down-after-milliseconds mymaster 30000  # 如果在指定时间内未能完成故障转移,则认为故障转移失败  
sentinel failover-timeout mymaster 180000  # 设置在故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,默认是1  
sentinel parallel-syncs mymaster 1  # 设置密码,如果你的redis主服务器设置了密码,这里也需要设置  
sentinel auth-pass mymaster yourpassword  # 允许通过SENTINEL RECONFIGURE命令来修改Sentinel的配置,默认为no  
sentinel deny-scripts-reconfig yes  # Sentinel公告的IP地址,当Sentinel与其他Sentinel或Redis服务器通信时,将使用这个IP地址  
# 如果未设置,将使用Sentinel绑定的IP地址  
# sentinel announcement-ip <ip>  # 当Sentinel检测到主服务器下线时,会执行该脚本  
# sentinel down-after-script mymaster /path/to/your/script.sh  # 其他配置项...

配置哨兵模式(一主二从三哨兵)

① 先配置redis的主从服务器

步骤如下:

  1. 拷贝redis.conf配置文件,我们一共需要三台redis-server,所以拷贝三份即可。
  2. 修改配置文件,因为每个redis-server都是不同的实例,所以需要修改配置文件
    • 修改port端口
    • 修改pidfile文件名
    • 后台启动服务
    • 修改rdb或者aof文件存放位置(具体看你的持久化使用的是rdb还是aof)
    • 修改logfile文件存放位置
    • 修改replication中的配置 replicaof masterip masterport(配置文件是永久有效,命令是临时有效 slaveof masterip masterport)
  3. 启动每个服务,并且查看不同redis-server的配置信息info replication

拷贝redis.conf配置文件

cp redis7.conf redis6379.conf
cp redis7.conf redis6380.conf
cp redis7.conf redis6381.conf

主节点6379

vim redis6379.conf# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6379  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6379.pid # 指定pidfile文件
logfile "/myredis/redis6379.log" # 指定Logfile文件
dbfilename dump6379.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
requirepass robin # 设定redis服务器的密码# 保存退出
ESC shift: wq

从节点6380

vim redis6380.conf# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6380  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6380.pid # 指定pidfile文件
logfile "/myredis/redis6380.log" # 指定Logfile文件
dbfilename dump6380.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证requirepass robin # 设定redis服务器的密码# 保存退出
ESC shift: wq

从节点6381

vim redis6381.conf# 改动内容如下
bind 0.0.0.0 # 我这里是为了允许任意远程登录
protected-mode no # 关闭保护模式
port 6381  # 服务启动端口
daemonize yes # 后台启动
pidfile /var/run/redis_6381.pid # 指定pidfile文件
logfile "/myredis/redis6381.log" # 指定Logfile文件
dbfilename dump6381.rdb # 指定rdb文件名
dir /myredis/ # 指定工作目录
replicaof 127.0.0.1 6379 # 指定从机的主机
masterauth robin # 从机的主机的密码验证requirepass robin # 设定redis服务器的密码# 保存退出
ESC shift: wq
② 配置哨兵

拷贝redis安装目录下的sentinel.conf

cp /opt/redis-7.2.4/sentinel.conf  /myredis/sentinel1.conf
cp /opt/redis-7.2.4/sentinel.conf  /myredis/sentinel2.conf
cp /opt/redis-7.2.4/sentinel.conf  /myredis/sentinel3.conf

接下来的步骤基本相同,每个哨兵的配置文件改动基本都是一致的:

  • 禁止保护模式
  • 配置哨兵启动端口(不同哨兵的端口不同 26379 26380 26381)
  • 配置哨兵后台启动
  • 配置logfile(为了方便log)
  • 配置要监听的主服务器
  • 配置要监听的主服务器的密码(有则配置,没密码不用配置)
  • 配置哨兵的工作目录(为了方便演示观察,改动一下)
  • … 其他配置

修改sentinel1.conf的配置

protected-mode noport 26379daemonize yeslogfile "/myredis/sentinel.log"dir /myredis/sentinel monitor mymaster 127.0.0.1 6379 2sentinel auth-pass mymaster robin
③ 启动服务

启动主从服务器

# redis-server redis配置文件路径
redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf

启动三个哨兵

# redis-sentinel sentinel配置文件路径
redis-sentinel sentinel1.conf 
redis-sentinel sentinel2.conf 
redis-sentinel sentinel3.conf 

查看一下进程 ps -ef | grep redis
image.png

④ 访问验证

创建三个远程终端,分别连接不同的redis-server

redis-cli -a robin -p 6379 redis-cli -a robin -p 6380redis-cli -a robin -p 6381

image.png
image.pngimage.png

⑤ 主从服务器数据插入验证
# master 6379
flushdb # 先清空一下数据
set k1 v1# slave 6380
get k1 # v1# slave 6381
get k1 # v1
⑥ 验证主节点宕机,集群故障自动转移

我们手动的停止掉master 6379主服务器,看哨兵是否会从salve6380和slave6381中选择出一台新的服务器

image.png

查看sentinel.log日志,日志显示当前6379宕机了,6381变成了新的master主机
image.png

去分别查看一下6380和6381的主从状态

image.png

image.png

查看下redis.conf配置文件

6381:
image.png

6380:
image.png

至此,哨兵模式已经ok啦,最后再次测试一下当我们的6379重新上线时,master会是谁?
答案:👻master仍然是6381

那么启动6379的服务,再次连接客户端查看一下把!

redis-server redis6379.confredis-cli -a robin -p 6379

image.png

如有错误,请各位同学指正😃

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

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

相关文章

ArcgisForJS如何使用ArcGIS Server发布的切片地图服务?

文章目录 0.引言1.准备海量地理数据2.ArcGIS Server发布切片地图服务3.ArcgisForJS使用ArcGIS Server发布的切片地图服务 0.引言 ArcGIS Server是一个由Esri开发的地理信息系统&#xff08;GIS&#xff09;服务器软件&#xff0c;它提供了许多功能&#xff0c;包括发布切片地图…

java面试设计模式篇

面试专题-设计模式 前言 在平时的开发中&#xff0c;涉及到设计模式的有两块内容&#xff0c;第一个是我们平时使用的框架&#xff08;比如spring、mybatis等&#xff09;&#xff0c;第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#…

挑战杯 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

Oracle迁移到mysql-导出mysql所有索引和主键

导出建库表索引等&#xff1a; [rootlnpg ~]# mysqldump -ugistar -pxxx -h192.168.207.143 --no-data -d lndb > lndb20230223-1.sql 只导出索引&#xff1a;参考&#xff1a;MYSQL导出现有库中的索引脚本_mysql 导出数据库所有表的主键和索引-CSDN博客 -- MYSQL导出现有…

TCP Keepalive 和 HTTP Keep-Alive

HTTP 的Keep-Alive 在 HTTP 1.0 中默认是关闭的&#xff0c;如果浏览器要开启 Keep-Alive&#xff0c;它必须在请求的包头中添加&#xff1a; Connection: Keep-Alive然后当服务器收到请求&#xff0c;作出回应的时候&#xff0c;它也添加一个头在响应中&#xff1a; Connec…

相信未来:技术的进步意味着重构

十年以来&#xff0c;呼声最高&#xff1a;AI、BigData、Cloud Service。 以本人看来&#xff0c;仅AI技术的进步和应用&#xff0c;整个软件行业&#xff0c;所有软件将被重构。 提醒&#xff1a;非大学毕业、非计算机及相关专业&#xff0c;在IT这个行业&#xff0c;特别是…

主流开发语言和开发环境:探索编程世界的基础

在当今这个快速发展的技术时代&#xff0c;软件开发已经成为推动创新的重要力量。无论是构建下一代应用、开发先进的算法还是创建复杂的系统&#xff0c;选择合适的编程语言和开发环境都是至关重要的。在本文中&#xff0c;我们将探讨当前流行的几种主流开发语言以及它们常用的…

MATLAB使用绘图plot制作动态GIF

文章目录 1 前言2 DemoDemo 1 - 不使用函数Demo 2 - 使用函数 1 前言 在PPT展示或者博客创作中&#xff0c;有时需要插入动态图如GIF&#xff0c;来演示算法效果或者结果。在MATLAB中&#xff0c;可以通过一些代码&#xff0c;将绘图plot转化为动态的GIF。 其大致方法为&…

【MySQL】如何理解事务

一、引出事务 假设我们有一张用户表&#xff0c;如图所示&#xff1a; 我们现在的需求是&#xff1a;小红向小明转账100块 那么我们可以执行如下指令&#xff1a; update user set salary salary-100 where id1;//第一条语句小红转一百 update user set salary salary100 …

学习使用在mysql中查询指定字段字符串包含多个字符串的方法

学习使用在mysql中查询指定字段字符串包含多个字符串的方法 使用LIKE关键字使用REGEXP关键字使用FIND_IN_SET函数使用INSTR函数和AND关键字 使用LIKE关键字 SELECT * FROM table_name WHERE column_name LIKE %string1% AND column_name LIKE %string2%;使用LIKE关键字&#x…

RabbitMQ(一):消息队列MQ

目录 1 消息队列MQ1.1 MQ简介1、什么是MQ2、MQ的优势流量削峰应用解耦异常处理数据分发分布式事务 3、消息中间件的弊端4、常用的MQ 1.2 MQ中几个基本概念1.3 MQ的通信模式1.4 消息的发布策略1.5 常用消息中间件协议1、AMQP协议2、MQTT协议3、OpenMessage协议4、kafaka协议 1 消…

TiDB 社区智慧合集丨TiDB 相关 SQL 脚本大全

非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 48】非正式 TiDB 相关 SQL 脚本征集大赛&#xff01;( https://asktug.com/t/topic/996635 )里提供的各种常用脚本。 在这篇文章中&#xff0c;我们整理了社区同学提供的一系列 TiDB 相关 SQL 脚本&#xff0c;希望能为大家在…

APP被针对攻击了,要怎么解决

随着APP行业的兴起&#xff0c;游戏公司异军突起&#xff0c;不管是在控证还是攻击方面都是属于最复杂的一个场面&#xff0c;游戏APP逐渐成为DDOS流量攻击的“重灾区”。没有提前做好了解就盲目进军游戏APP行业&#xff0c;一旦被攻击就会让公司束手无策。那么&#xff0c;刚上…

OpenAI视频生成模型Sora的全面解析:从ViViT、Diffusion Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

ubuntu20.04 安装 matlab R2023b

ubuntu20.04 使用matlab R2023b 起因步骤问题问题1问题2问题3 起因 闲着没事&#xff0c;想在ubuntu上安装matlab。 步骤 这个博客写得很好&#xff0c;我就不赘述了&#xff1a;参考博客 。但有点不一样&#xff1a;我现在matlab官网上下载的linux版本不是iso镜像文件&…

Redis实现滑动窗口限流

常见限流算法 固定窗口算法 在固定的时间窗口下进行计数&#xff0c;达到阈值就拒绝请求。固定窗口如果在窗口开始就打满阈值&#xff0c;窗口后半部分进入的请求都会拒绝。 滑动窗口算法 在固定窗口的基础上&#xff0c;窗口会随着时间向前推移&#xff0c;可以在时间内平滑控…

基于yolov5的苹果检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的苹果检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的苹果检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的项目&#xf…

H12-821_45

45.如图所示,同一局域网中的四台路由器运行IS-IS,其中R1是DIS.则R2、R3、R4分别和R1建立邻接关系,R2、R3、R4之间不建立邻接关系。 A.正确 B.错误 答案&#xff1a;B 注释&#xff1a; 在广播链路上IS-IS路由器建立邻接关系和OSPF不同&#xff0c;所有IS-IS路由器之间都可以建…

【Web前端笔记11】JavaScript基础与变量

前言 11 JavaScript基础与变量 一、Js简介 1、JavaScript核心部分&#xff1a; 2、有非常广泛的使用领域 3、JavaScript与ECMAScript的关系 4、JavaScript版本 二、JavaScript名词解释 三、变量命名规则 四、变量类型 六大基本数据类型&#xff1a; 1、数字类型 2、…

C语言-指针初学速成

1.指针是什么 C语言指针是一种特殊的变量&#xff0c;用于存储内存地址。它可以指向其他变量或者其他数据结构&#xff0c;通过指针可以直接访问或修改存储在指定地址的值。指针可以帮助我们在程序中动态地分配和释放内存&#xff0c;以及进行复杂的数据操作。在C语言中&#…