Redis 主从集群 —— 超详细操作演示!

news2024/11/29 22:46:26

五、Redis 主从集群

    • 五、Redis 主从集群
      • 5.1 主从集群搭建
          • 5.1.1、伪集群搭建与配置
          • 5.1.2、分级管理
          • 5.1.3、容灾冷处理
      • 5.2 主从复制原理
          • 5.2.1、主从复制原理
          • 5.2.2、数据同步演变过程
      • 5.3 哨兵机制实现
          • 5.3.1 简介
          • 5.3.2 Redis高可用集群搭建
          • 5.3.3 Redis高可用集群的启动
          • 5.3.4 Sentinel 优化配置
      • 5.4 哨兵机制原理
          • 5.4.1 三个定时任务
          • 5.4.2 Redis 节点下线判断
          • 5.4.3 Sentinel Leader 选举
          • 5.4.4 master 选择算法
          • 5.4.5 故障转移过程
          • 5.4.6 节点上线
      • 5.5 CAP 定理
          • 5.5.1 概念
          • 5.5.2 定理
          • 5.5.3 BASE理论
          • 5.5.4 CAP的应用
      • 5.6 Raft 算法
          • 5.6.1 基础
          • 5.6.2 角色、任期及角色转变
          • 5.6.3 leader 选举
          • 5.6.4 数据同步
          • 5.6.5 脑裂
          • 5.6.6 Leader 宕机处理
          • 5.6.7 Raft 算法动画演示
    • 六、Redis 分布式系统
    • 七、Redis 缓存
    • 八、Lua脚本详解
    • 九、分布式锁

数据库系列文章:

关系型数据库:

  • MySQL —— 基础语法大全
  • MySQL —— 进阶


非关系型数据库:

  • Redis 的安装与配置
  • Redis 基本命令(上)
  • Redis 基本命令(下)
  • Redis 持久化

五、Redis 主从集群

    为了避免 Redis 的 单点故障 问题, 我们可以搭建一个 Redis 集群,将数据备份到集群中的其它节点上。若一个 Redis 节点宕机,则由集群中的其它节点顶上。

5.1 主从集群搭建

    Redis的 主从集群 是一个“ 一主多从 ”的 读写分离 集群。 集群中 的 Master 节点负责处理客户端的读写请求,而 Slave 节点仅能处理客户端的读请求。只所以要将集群搭建为 读写分离 模式,主要原因是,对于数据库集群,写操作压力一般都较小,压力大多数来自于读操作请求所以,只有一个节点负责处理写操作请求即可

5.1.1、伪集群搭建与配置

    在采用 单线程 IO 模型 时,为了提高处理器的利用率,一般会在一个主机中安装多台 Redis,构建一个 Redis 主从伪集群 。当然,搭建伪集群的另一个场景是,在学习 Redis ,而学习用主机内存不足以创建多个虚拟机。

    下面要搭建的读写分离伪集群包含一个 Master 与两个 Slave 。 它们的端口号分别是: 638063816382

⭐️(1)复制 redis.conf

    在redis 安装目录中 mkdir 一个目录,名称随意。这里命名为 cluster 。然后将 redis.conf 文件复制到 cluster 目录中。该文件后面会被其它配置文件包含,所以该文件中需要设置每个 Redis 节点相同的公共的属性

在这里插入图片描述

⭐️(2)修改 redis.conf

    在 redis.conf 中做如下几项修改:

A、 masterauth

在这里插入图片描述

    因为我们要搭建 主从集群,且每个主机都有可能会是 Master ,所以最好 不要设置密码验证 属性 requirepass 。如果真需要设置,一定要每个主机的密码都 设置为相同 的。此时每个配置文件中都要设置两个完全相同的属性: requirepassmasterauth

  • 其中 requirepass 用于指定当前主机的访问密码;
  • masterauth 用于指定当前 slave 访问 master 时向 master 提交的访问密码,用于让 master 验证自己身份是否合法

在这里插入图片描述

B、 repl-disable-tcp-nodelay

在这里插入图片描述

    该属性用于设置 是否禁用 TCP 特性 tcp-nodelay 。设置为 yes禁用 tcp-nodelay ,此时 masterslave 间的通信会产生延迟,但使用的 TCP 包数量会较少,占用的网络带宽会较小。相反,如果设置为 no ,则网络延迟会变小,但使用的 TCP 包数量会较多,相应占用的网络带宽会大

tcp-nodelay: 为了充分复用网络带宽, TCP 总是希望发送尽可能大的数据块。为了达到该目的, TCP 中使用了一个名为 Nagle 的算法。

  • Nagle 算法的工作原理是,网络在接收到要发送的数据后,并不直接发送,而是等待着数据量足够大(由 TCP 网络特性决定)时再一次性发送出去。这样,网络上传输的有效数据比例就得到了大大提升,无效数据传递量极大减少,于是就节省了网络带宽,缓解了网络压力。

tcp-nodelay 则是 TCP 协议中 Nagle 算法的开头

⭐️(3)新建 redis6380.conf

在这里插入图片描述

    新建一个redis 配置文件 redis6380.conf ,该配置文件中的 Redis 端口号为 6380

⭐️(4)再复制出两个 conf 文件

    再使用 redis6380.conf 复制出两个 conf 文件: redis6381.confredis6382.conf 。然后修改其中的内容。

在这里插入图片描述
    修改 redis6381.conf 的内容如下:

在这里插入图片描述

    修改 redis6382.conf 的内容如下:

在这里插入图片描述

⭐️(5)启动三台 redis

    分别使用 redis6380.confredis6381.confredis6382.conf 三个配置文件启动三台 Redis。

在这里插入图片描述

⭐️(6)设置主从关系

    再打开三个会话框,分别使用客户端连接三台
Redis 。 然后通过 slaveof 命令,指定 6380 的 Redis 为 Master

在这里插入图片描述

⭐️(7)查看状态信息

    通过 info replication 命令可查看当前连接的 Redis 的状态信息。

在这里插入图片描述

5.1.2、分级管理

    若 Redis 主从集群 中的 Slave 较多时,它们的数据同步过程会对 Master 形成较大的性能压力。此时可以对这些 Slave 进行分级管理

在这里插入图片描述
    设置方式很简单,只需要让低级别 Slave 指定其 slaveof 的主机为其上一级 Slave 即可。不过,上一级 Slave 的状态仍为 Slave ,只不过,其是更上一级的 Slave

    例如,指定 6382 主机为 6381 主机的 Slave ,而 6381 主机仍为真正的 MasterSlave

在这里插入图片描述

  • 此时会发现, MasterSlave 只有 6381 一个主机。
5.1.3、容灾冷处理

    在 Master/Slave 的 Redis 集群中,若 Master 出现宕机怎么办呢?有两种处理方式:

  • 一种是通过 手工 角色调整,使 Slave 晋升为 Master冷处理
  • 一种是使用哨兵模式,实现 Redis集群的高可用 HA ,即热处理

    无论 Master 是否宕机, Slave 都可通过 slaveof no one 将自己由 Slave 晋升为 Master 。如果其原本就有下一级的 Slave ,那么,其就直接变为了这些 Slave 的真正的 Master 了。而原来的 Master 也会失去这个原来的 Slave

在这里插入图片描述

5.2 主从复制原理

5.2.1、主从复制原理

    当一个 Redis 节点 (slave 节点) 接收到 类似 slaveof 127.0.0.1 6380 的指令后直至其可以从 master 持续复制数据,大体经历了如下几个过程:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
⭐️(1) 保存master 地址

    当 slave 接收到 slaveof 指令后,slave 会立即将新的 master地址保存下来

⭐️(2) 建立连接

     slave 中维护着一个定时任务,该定时任务会尝试着与该 master 建立 socket 连接。如果连接无法建立,则其会不断定时重试直到 连接成功接收到 slaveof no one 指令

⭐️(3) slave 发送 ping 命令

    连接建立成功后,slave 会发送 ping 命令进行首次通信。如果 slave 没有收到 master 的回复,则 slave主动断开连接下次的定时任务会重新尝试连接

⭐️(4) 对 slave 身份验证

    如果 master 收到了 slaveping 命令,并不会立即对其进行回复,而是会先进行身份验证。如果验证失败,则会发送消息拒绝连接;如果验证成功,则向 slave 发送连接成功响应

⭐️(5) master 持久化

    首次通信成功后,slave 会向 master 发送数据同步请求。当 master 接收到请求后,会 fork 出一个子进程,让子进程以 异步方式 立即进行持久化

⭐️(6) 数据发送

    持久化完毕后 master 会再 fork 出一个子进程,让该子进程以 异步方式 将数据发送给 slaveslave 会将接收到的数据 不断写入到本地的持久化文件中
    在 slave 数据同步过程中,master主进程仍在不断地接受着客户端的写操作,且不仅将新的数据写入到了master 内存,同时也写入到了 同步缓存 。当 master 的持久化文件中的数据发送完毕后,master 会再将 同步缓存中新的数据 发送给 slave,由 slave 将其写入到本地持久化文件中。数据同步完成。

⭐️(7) slave 恢复内存数据

    当 slavemaster数据同步完成后, slave 就会读取本地的持久化文件,将其恢复到本地内存,然后就可以对外提供读服务了。

⭐️(8) 持续增量复制

    在 slave 对外提供服务过程中, master 会持续不断的将新的数据增量方式 发送给 slave 以保证主从数据的一致性。

5.2.2、数据同步演变过程

⭐️(1) sync 同步

    Redis 2.8 版本之前,首次通信成功后, slave 会向 master 发送 sync 数据同步请求。然后 master 就会将其所有数据全部发送给 slave ,由 slave 保存到其本地的持久化文件中。这个过程称为 全量复制

    但这里 存在一个问题:在 全量复制 过程中可能会出现由于网络抖动而导致复制过程中断。当网络恢复后, slavemaster 重新连接成功,此时 slave 会重新发送 sync 请求,然后会 从头开始 全量复制

    由于全量复制过程非常耗时,所以期间出现网络抖动的概率很高。而中断后的从头开始不仅需要消耗大量的系统资源网络带宽,而且可能会出现长时间无法完成全量复制的情况

⭐️(2) psync 同步

    Redis 2.8 版本之后,全量复制 采用了 psyncPartial Sync不完全同步同步策略。 当全量复制过程出现由于网络抖动而导致复制过程中断时,当重新连接成功后,复制过程可以 “断点续传" 。即从断开位置开始继续复制 ,而不用从头再来。这就大大提升了性能。

    为了实现 psync ,整个系统做了 三个大的变化

A、 复制偏移量

    系统为每个要传送数据进行了编号,该编号从 0 开始,每个字节一个编号。该编号称为复制偏移量。参与复制的主从节点都会维护该复制偏移量。

    master 每发送过一个字节数据后就会进行累计。统计信息通过 info replication 的 master_repl_offset 可查看到。同时, slave 会定时向 master 上报其自身已完成的 复制偏移量master ,所以 master 也会保存 slave 的复制偏移量 offset

    slave 在接收到 master 的数据后,也会累计接收到的偏移量。统计信息通过 info replicationslave_repl_offset 可查看到。

B、 主节点复制 ID

    当 master 启动后就会动态生成一个长度为 40 位的 16 进制字符串作为当前 master复制 ID ,该 ID 是在进行数据同步slave 识别 master 使用的。通过 info replicationmaster_replid 属性可查看到该 ID 。

C、 复制积压缓冲区

    当 master 有连接的 slave 时,在 master 中就会创建并维护一个队列 backlog ,默认大小为 1MB ,该队列称为 复制积压缓冲区master 接收到了 写操作数据 不仅会写入到 master 主存,写入到 master 中为每个 slave 配置的发送缓存,而且还会写入到 复制积压缓冲区。其作用就是用于保存最近操作的数据,以备“ 断点续传 ”时做 数据补偿,防止数据丢失

D、 psync 同步过程
在这里插入图片描述

    psync 是一个由 slave 提交的命令,其格式为 psync <master_replid> <repl_offset> ,表示当前 slave 要从指定的 master 中的 repl_offset+1开始复制repl_offset 表示当前 slave 已经完成复制的数据的 offset 。该命令保证了 “ 断点续传 ”的实现。

    在第一次开始复制时, slave 并不知道 master 的动态 ID ,并且一定是从头开始复制,所以其提交的 psync 命令为 PSYNC ? -1 。即 master_replid 为问号( ?),repl_offset-1

    如果复制过程中断后 slavemaster 成功连接,则 slave 再次提交 psyn 命令。此时的 psyn 命令的 repl_offset 参数为其前面已经完成复制的数据的偏移量。

    其实,并不是 slave 提交了 psyn 命令后就可以立即从 master 处开始复制,而是需要 master 给出响应结果后,根据响应结果来执行。 master 根据 slave 提交的请求及 master 自身情况会 给出不同的响应结果。响应结果有三种可能:

  • FULLRESYNC <master_replid> <repl_offset>:告知 slave 当前 master 的动态 ID 及可以开始全量复制了,这里的 repl_offset 一般为 0
  • CONTINUE :告知 slave 可以按照你提交的 repl_offset 后面位置开始“续传”了
  • ERR :告知 slave ,当前 master 的版本低于 Redis 2.8 ,不支持 psyn ,你可以开始全量复制了

E、 psync 存在的问题

  • psync 数据同步过程中,若 slave 重启,在 slave 内存中保存的 master动态 ID 与续传 offset 都会消失,“断点续传” 将无法进行,从而只能进行全量复制导致资源浪费
  • psync 数据同步过程中, master 宕机slave 会发生“易主”,从而导致 slave 需要从新 master 进行全量复制形成资源浪费

⭐️(3) psync 同步的改进

    Redis 4.0 对 psync 进行了改进,提出了“同源增量同步”策略。

A、 解决 slave 重启问题

    针对“ slave 重启master 动态 ID 丢失问题”,改进后的 psyncmaster动态 ID 直接写入到了 slave持久化文件中。

    slave重启后直接从本地持久化文件中读取 master动态 ID ,然后向 master 提交 获取复制偏移量的请求master 会根据提交请求的 slave 地址,查找到保存在 master 中的复制偏移量,然后向 slave 回复 FULLRE SYNC <master_replid> <repl_offset>,以告知 slave 其马上要开始发送的位置。然后 master 开始“断点续传”。

B、 解决 slave 易主问题

    slave 易主后需要和新 master 进行全量复制,本质原因是 master 不认识 slave 提交的 psync 请求中“原 master动态 ID ”。如果 slave 发送 PSYNC < 原 master_replid> <repl_offset> 命令, master 能够识别出该 slave 要从 master 复制数据,而自己的数据也都是从该 master 复制来的。那么 master 就会明白,其与该 slave师出同门”,应该接收其“断点续传”同步请求。

    而 master 中恰好保存的有“ master 的动态 ID ”。由于改进后的 psync 中每个 slave 都在本地保存了当前 master动态 ID ,所以当 slave 晋升为新的 master 后,其本地仍保存有之前 master 的动态 ID 。而这一点也恰恰为解决“ slave 易主”问题提供了条件。通过 masterinfo replicaton 中的 master_replid2 可查看到。如果尚未发生过易主,则该值为 40 个 0 。

(4) 无盘操作

    Redis 6.0 对同步过程又进行了改进,提出了“无盘全量同步”与“无盘加载”策略,避免了耗时的 IO 操作

  • 无盘全量同步master 的主进程 fork 出的子进程直接将内存中的数据发送给 slave ,无需经过磁盘。
  • 无盘加载slave 在接收到 master 发送来的数据后不需要将其写入到磁盘文件,而是直接写入到内存,这样 slave 就可快速完成数据恢复。

(5) 共享复制积压缓冲区

    Redis 7.0 版本对 复制积压缓冲区 进行了改进,让各个 slave 的发送缓冲区 共享复制积压缓冲区。这使得复制积压缓冲区的作用,除了可以保障数据的安全性外,还作为所有 slave 的发送缓冲区,充分利用了复制积压缓冲区

5.3 哨兵机制实现

5.3.1 简介

    对于 Master 宕机后的冷处理方式是无法实现高可用的。 Redis 从 2.6 版本开始提供了高可用的解决方案 Sentinel 哨兵机制。在集群中再引入一个节点,该节点充当 Sentinel 哨兵,用于监视 Master 的运行状态,并在 Master 宕机后自动指定一个 Slave 作为新的 Master 。整个过程无需人工参与,完全由哨兵自动完成。

    不过,此时的 Sentinel 哨兵又成为了一个单点故障点:若哨兵发生宕机,整个集群将瘫痪。所以为了解决 Sentinel 的单点问题,又要为 Sentinel 创建一个集群,即 Sentinel 哨兵集群。一个哨兵的宕机,将不会影响到 Redis 集群的运行。

    那么这些 Sentinel 哨兵是如何工作的呢? Sentinel 是如何知道其监视的 Master 状态的呢?

  • 每个 Sentinel 都会定时会向 Master 发送心跳, 如果 Master 在有效时间内向它们都进行了响应 ,则说明 Master 是“ 活着的”。
  • 如果 Sentinel 中有 quorum 个哨兵没有收到响应, 那么就认为 Master 已经宕机,然后 会有 一个SentinelFailover 故障转移。即将原来的某一个 Slave 晋升为 Master 。
5.3.2 Redis高可用集群搭建
5.3.3 Redis高可用集群的启动
5.3.4 Sentinel 优化配置

5.4 哨兵机制原理

5.4.1 三个定时任务
5.4.2 Redis 节点下线判断
5.4.3 Sentinel Leader 选举
5.4.4 master 选择算法
5.4.5 故障转移过程
5.4.6 节点上线

5.5 CAP 定理

5.5.1 概念
5.5.2 定理
5.5.3 BASE理论
5.5.4 CAP的应用

5.6 Raft 算法

5.6.1 基础
5.6.2 角色、任期及角色转变
5.6.3 leader 选举
5.6.4 数据同步
5.6.5 脑裂
5.6.6 Leader 宕机处理
5.6.7 Raft 算法动画演示

六、Redis 分布式系统

七、Redis 缓存

八、Lua脚本详解

九、分布式锁

🚀🚀🚀 Redis 快速食用:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------->


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

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

相关文章

ubuntu创建apt-mirror本地仓库

首先创建apt-mirror的服务端&#xff0c;也就是存储所有apt-get下载的文件和依赖。大约需要300G&#xff0c;预留400G左右空间就可以开始了。 安装ubuntu省略&#xff0c;用的是ubuntu202204 ubuntu挂载硬盘&#xff08;不需要的可以跳过&#xff09;: #下载挂载工具 sudo apt…

Java并发(十九)----Monitor原理及Synchronized原理

1、Java 对象头 以 32 位虚拟机为例 普通对象 |--------------------------------------------------------------| | Object Header (64 bits) | |------------------------------------|-------------------------| | Mark W…

序列生成模型(一):序列概率模型

文章目录 前言1. 序列数据2. 序列数据的潜在规律3. 序列概率模型的两个基本问题 一、序列概率模型1. 理论基础序列的概率分解自回归生成模型 2. 序列生成 前言 深度学习在处理序列数据方面取得了巨大的成功&#xff0c;尤其是在自然语言处理领域。序列数据可以是文本、声音、视…

pytorch和pytorchvision安装

参考https://blog.csdn.net/2301_76863102/article/details/129369549 https://blog.csdn.net/weixin_43798572/article/details/123122477 查看我的版本 右键&#xff0c;nvivdia控制面板&#xff0c;帮助&#xff0c;系统信息 驱动程序版本号为528.49 更新很快的 CUDA版本…

stm32F4——BEEP与按键的实例使用

stm32F4——BEEP与按键的实例使用 蜂鸣器和按键的实质都是GPIO的使用&#xff0c;所以基本原理就不介绍啦&#xff0c;基本寄存器其实都是GPIO的高低电平的赋值&#xff0c;可以参考stm32——LEDGPIO的详细介绍 文章目录 stm32F4——BEEP与按键的实例使用一、BEEP二、 KEY三、通…

MySQL数据库 DML

目录 DML概述 添加数据 修改数据 删除数据 DML概述 DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据(工NSERT)修改数据(UPDATE)删除数据(DELETE) 添加数据 (1)给指定字段添加数据 INSERT …

Epic 安装失败,错误代码SUPQR1612,必要的先决条件安装失败,弹窗CD-ROM

错误记录 并且弹出来这个窗口the feature you are trying to use is on a CD-ROM or other removable disk that is not available. 让我寻找这个msi文件 正在想办法解决 如果有人能解决 麻烦告知评论区&#xff01;

网络安全事件分级指南

文章目录 一、特别重大网络安全事件符合下列情形之一的&#xff0c;为特别重大网络安全事件&#xff1a;通常情况下&#xff0c;满足下列条件之一的&#xff0c;可判别为特别重大网络安全事件&#xff1a; 二、重大网络安全事件符合下列情形之一且未达到特别重大网络安全事件的…

C++软件调试与异常排查技术从入门到精通学习路线分享

目录 1、概述 2、全面了解引发C软件异常的常见原因 3、熟练掌握排查C软件异常的常见手段与方法 3.1、IDE调试 3.2、添加打印日志 3.3、分块注释代码 3.4、数据断点 3.5、历史版本比对法 3.6、Windbg静态分析与动态调试 3.7、使用IDA查看汇编代码 3.8、使用常用工具分…

【Linux】cp问题,生产者消费者问题代码实现

文章目录 前言一、 BlockQueue.hpp&#xff08;阻塞队列&#xff09;二、main.cpp 前言 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用…

将博客搬至微信公众号了

一、博客搬家通知 各位码友们好&#xff0c;大家是不是基本很少看 CSDN 了呢&#xff1f;平时开发是不都依靠着 chatGPT 来解决工作中的技术问题了&#xff0c;不过我觉得在工作中的使用场景各式各样的&#xff0c;具体问题还得自己具体去梳理逻辑&#xff0c;再考虑用什么样的…

【Vue第6-7章】vue-router与Vue UI组件库_Vue2

目录 第6章 vue-router 6.1 相关理解 6.1.1 vue-router的理解 6.1.2 对SPA应用的理解 6.1.3 路由的理解 6.2 基本路由 6.2.1 效果 6.2.2 总结&#xff1a;编写使用路由的3步 6.2.3 笔记与代码 6.2.3.1 笔记 6.2.3.2 30_src_路由的基本使用 6.3 嵌套&#xff08;多级…

股票价格预测 | Python实现基于ARIMA和LSTM的股票预测模型(含XGBoost特征重要性衡量)

文章目录 效果一览文章概述模型描述源码设计效果一览 文章概述 Python实现基于ARIMA和LSTM的股票预测模型(Stock-Prediction) Data ExtractionFormatting data for time seriesFeature engineering(Feature Importance using X

MX6ULL学习笔记(十二)Linux 自带的 LED 灯

前言 前面我们都是自己编写 LED 灯驱动&#xff0c;其实像 LED 灯这样非常基础的设备驱动&#xff0c;Linux 内 核已经集成了。Linux 内核的 LED 灯驱动采用 platform 框架&#xff0c;因此我们只需要按照要求在设备 树文件中添加相应的 LED 节点即可&#xff0c;本章我们就来学…

vue-cli创建一个vue3项目

通过命令创建VUE脚手架&#xff1a; npm install -g vue/cli 创建VUE项目&#xff1a; vue create npg***b 剩下的就是一路回车 npm install element-plus --save 入口文件main.ts import { createApp } from vue import App from ./App.vue import router from ./router…

【第3期】Springboot集成SpringSecurity+RSA+ECS免密登录

本期简介 RSA是非常安全的非对称加解密算法&#xff0c;单纯的RSA的原理和使用网络资料较多&#xff0c;本期不细讲RSA的原理&#xff0c;主要讲解实战&#xff0c;如何与SpringbootSpringSecurity集成起来&#xff0c;做到在安全框架基础上&#xff0c;对用户的密码进行加密存…

(2)Linux 操作系统||基本创建与操作

本章将浅谈一下 "操作系统是什么" 的问题&#xff0c;随后通过讲解一些 Linux 下的基本指令&#xff0c;显示目录内容、跳转操作和文件的创建与删除。在讲解的同时我会穿插一些知识点&#xff0c;比如 Linux 隐藏文件、路径等基础知识。 了解操作系统 什么是操作系统…

电子学会C/C++编程等级考试2021年09月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:双端队列 定义一个双端队列,进队操作与普通队列一样,从队尾进入。出队操作既可以从队头,也可以从队尾。编程实现这个数据结构。 时间限制:1000 内存限制:65535输入 第一行输入一个整数t,代表测试数据的组数。 每组数据的…

桌面概率长按键盘无法连续输入问题

问题描述&#xff1a;概率性长按键盘无法连续输入文本 问题定位&#xff1a; 系统按键流程分析 图一 系统按键流程 按键是由X Server接收的&#xff0c;这一点只要明白了X Window的工作机制就不难理解了。X Server在接收到按键后&#xff0c;会转发到相应程序的窗口中。在窗…

海洋可视化大屏,Photoshop源文件

数据大屏通过实时的数据展示&#xff0c;可及时发现数据的变化和异常&#xff0c;以便及时采取措施。现分享海洋动力大数据监控、海洋数据监控系统、科技感海洋监控系统大屏模版的UI源文件&#xff0c;供UI设计师们快速获取PSD源文件完成工作 若需更多 大屏组件&#xff0c;请…