当前位置: 首页 > news >正文

redis 分布式方案

文章目录

  • 前言
  • 一、主从复制
    • 1、主从配置
    • 2、建立连接
    • 3、数据同步
      • 3.1、全量同步
      • 3.2、全量同步配置
      • 3.3、 增量同步
      • 3.4、 增量同步配置
  • 二、redis sentinel
    • 1、主要功能
    • 2、sentinel配置
    • 3、高可用
      • 3.1、故障发现
      • 3.2、故障转移
        • 3.2.1、选举sentinel进行故障转移
        • 3.2.2、选举从节点升级成主节点
        • 3.2.3、执行故障转移
    • 4、sentinel引来的问题
      • 4.1、配置小于三个的sentinel
      • 4.2、脑裂问题
  • 二、redis cluster
    • 1、虚拟槽
    • 2、数据对应
      • 2.1、全量key计算
      • 2.2、key统一映射
    • 3、数据迁移
      • 3.1 扩容
        • 3.1.1、启动新节点
        • 3.1.2、将新节点加入集群
        • 3.1.3、重新分配槽(resharding)
        • 3.1.4、迁移数据:
      • 3.2 缩容
        • 3.2.1、触发哈希槽转移:
        • 3.2.2、移动哈希槽到其他节点:
        • 3.2.3、关闭并移除节点:
    • 4、高可用性机制
      • 4.1、主从复制:
      • 4.2、故障检测:
    • 5、主从切换
      • 5.1、选择新的主节点
      • 5.2、将从节点提升为主节点
      • 5.3、恢复数据一致性和同步


前言

Redis 的分布式方案主要依赖于 Redis Cluster 和 Redis Sentinel 来实现。这两种部署方案都旨在解决单点故障问题,确保数据的高可用性和持续服务能力


一、主从复制

Redis 主从复制(Master-Slave Replication)是 Redis 提供的一种数据冗余和容灾保护机制。通过主从复制,可以将主节点的数据同步到一个或多个从节点,从而实现数据的高可用性和负载均衡。

  • 主节点(Master):作为数据的写入点,所有数据变更操作都是在主节点上进行的。
  • 从节点(Slave):从主节点同步数据,从节点通常只提供读操作,数据从主节点复制而来。

1、主从配置

假设我们有以下主节点和从节点:

主节点 IP:192.168.1.100
从节点 IP:192.168.1.101, 192.168.1.102

在主节点(192.168.1.100)配置 redis-master.conf:

port 6379
bind 0.0.0.0
protected-mode no

在从节点(192.168.1.101 和 192.168.1.102)配置 redis-replica.conf:

port 6380
bind 0.0.0.0
protected-mode no
replicaof 192.168.1.100 6379

主节点启动

redis-server redis-master.conf

从节点启动

redis-server redis-replica.conf

2、建立连接

首次成为从节点,执行replicaof ip port命令的时候就会保存服务器的IP与端口,建立心跳机制,保持正常的连接。
通过定时任务定时监听是否变更了主节点,需要重新同步。

3、数据同步

3.1、全量同步

  • master服务器收到slave的命令后(psync),判断slave传给我的master_replid(持久化在磁盘)是否跟我的replid一致,如果不一致或者传的是个空的,那么就需要全量同步。
  • slave首次关联master,从主同步数据,slave肯定是没有主的replid,所以需要进行全量同步
  • 全量同步步骤
    • master开始执行bgsave,生成一个RDB文件,并且把RDB文件和master的replid以及offerset传输给我们的slave
    • slave接收到rdb文件后,清空slave自己内存中的数据,然后用rdb来加载数据。
    • master生成RDB文件是用的bgsave生成,期间,是可以接收新的指令的。那么这些指令,我们需要找一个地方保存,等到slave加载完RDB文件以后要同步给slave。
      • 在master生成rdb文件期间,会接收新的指令,这些新的指令会保存在一个内存区间,这个内存区间就是 replication_buffer。
      • 这个空间不能太小,如果太小,为了数据安全,会关闭跟从库的网络连接。再次连接得重新全量同步,但是问题还在,会循环进行,导致崩溃

3.2、全量同步配置

replication_buffer配置详解
client-output-buffer-limit :

  • client-type:客户端类型(normal、replica 或 pubsub)。
  • hard-limit:绝对上限值,超过此值会立即关闭连接。
  • soft-limit 和 soft-seconds:软限制值和时间窗口,超过软限制在给定时间窗口后关闭连接。
client-output-buffer-limit replica 256mb 64mb 60

示例中,将从节点客户端的输出缓冲区硬限制设置为 256 MB,软限制设置为 64 MB,时间窗口为 60 秒。

3.3、 增量同步

  • 命令传播:在主节点和从节点的连接建立后,主节点会将收到的所有写命令(比如 SET、LPUSH、SADD 等)传播给从节点,从节点则执行这些命令以便与主节点保持一致。
  • 复制积压缓冲区:主节点维护一个固定大小的复制积压缓冲区(replication backlog),这个缓冲区保存了最近的写命令。这是一个环形缓冲区,即缓冲区内容会根据新命令不断覆盖旧命令。当从节点与主节点之间的连接暂时中断后重新连接时,可以使用复制积压缓冲区中保存的命令进行增量同步。
  • 增量同步触发:如果从节点与主节点的连接中断,并在短时间内重新建立连接,主节点会根据复制积压缓冲区找到断开期间的命令,并将这些命令发送给从节点,从节点对这些命令进行重放(replay),从而完成增量同步。
  • 无效的增量同步处理:如果复制积压缓冲区中的命令过期(即缓冲区被新命令覆盖)导致无法完成增量同步,主节点和从节点会重新执行全量同步(full synchronization),具体包括发送主节点当前所有数据快照(RDB 文件)并执行新的写命令。

3.4、 增量同步配置

  • repl-backlog-size:设置主节点复制积压缓冲区的大小。默认大小是 1 MB,可以根据需求适当调整。
repl-backlog-size 1048576  # 1 MB
  • repl-backlog-ttl:设置积压缓冲区在主节点与从节点断开连接后保留的时间(单位:秒)。在这个时间内,如果从节点重新连接主节点,则主节点将尝试进行增量同步。默认值是 3600 秒(即 1 小时)
repl-backlog-ttl 3600

二、redis sentinel

1、主要功能

  • 监控(Monitoring):
    Sentinel 实例会持续监控主节点和从节点,检测它们是否正常运转。
  • 通知(Notification):
    当检测到实例发生故障时,Sentinel 可以通知系统管理员或其他配置了通知功能的应用程序。
  • 自动故障转移(Automatic Failover):
    当主节点被判定为故障时,Sentinel 会自动选举一个从节点提升为新的主节点,并将其他从节点指向新的主节点。
  • 配置服务(Configuration Provider):
    客户端可以连接 Sentinel 来获取当前主节点的地址,以便动态调整连接。

2、sentinel配置

port 26379
bind 0.0.0.0# 监控主节点(mymaster),2 为 quorum:代表最少 2 个 Sentinel 同意主节点不可用,才会进行故障转移。
sentinel monitor mymaster <master_ip> 6379 2# 主节点在 5 秒内无响应则认为它主观下线(SDOWN)
sentinel down-after-milliseconds mymaster 5000# 故障转移超时时间
sentinel failover-timeout mymaster 15000# 同时最多允许多少个从节点与主节点进行同步
sentinel parallel-syncs mymaster 1

3、高可用

3.1、故障发现

  • 主观下线:
    当sentinel 跟master通信时(默认1s发送ping),发现我在一定时间内(down-after-milliseconds) 没有收到master的有效的回复,就会标记成
    SDOWN(Subjectively Down condition )(主观下线),
  • 客观下线:
    主观下线后,不会触发故障转移,而是去询问其他的sentinel,其他的sentinel是否能连上master,
    如果超过Quorum(规定人数)的sentinel都标记SDOWN状态,这个时候,就会将master标为ODOWN(Objectively Down condition 客观下线)

3.2、故障转移

3.2.1、选举sentinel进行故障转移
  • 当状态为ODWON的时候,我们就需要去触发故障转移,如果存在多个sentinel,我们需要选一个sentinel去做故障转移这件事情,然后其他sentinel不能进行故障转移。
  • 多个sentinel,我们需要选举一个sentinel来做这件事情
    • Quorum如果小于等于一半,那么必须超过半数的sentinel授权, 你才能去做故障迁移,比如5台sentinel,你配置的Quorum=2,那么选举的时候必须有3(5台的一半以上)人同意
    • Quorum如果大于一半,那么必须Quorum的sentinel授权,故障迁移才能启动
3.2.2、选举从节点升级成主节点

1)、与master的断开连接时间
如果slave与主服务器断开的连接时间超过主服务器配置的超时时间(down-after-milliseconds)的十倍,被认为不适合成为master。直接去除资格
2)、从节点排序
按照以下优先级排序(优先级逐一比较)

  • 与主节点连接状态良好的从节点
  • 复制偏移量最大(与主节点数据最接近)的从节点
  • 从节点 ID 较小的从节点(保证一致性,避免冲突)
    3)、排序后的第一个从节点将被提升为新的主节点
3.2.3、执行故障转移

Leader Sentinel 自动执行以下步骤,将选定的从节点提升为新的主节点:

  • 转换从节点为主节点:
    通过命令 SLAVEOF NO ONE
  • 重新配置其他从节点:
    通过命令 SLAVEOF <new_master_ip> <new_master_port> 重新配置其他从节点,以让它们同步新的主节点
  • 通知客户端和其他服务:
    更新 Sentinel 配置,通知客户端获取新的主节点信息,以确保所有读写操作指向新的主节点

4、sentinel引来的问题

4.1、配置小于三个的sentinel

  • 如果只有1个sentinel实例,则这个实例挂了就不能保证sentinel的高可用性
  • 如果只有2个sentinel实例,假设ip为127.0.0.1 为 sentinel1 和127.0.0.2 为 sentine2,那 sentinel1 跟 sentinel2 的网络断开,但是他们各自还是能正常运行的。也就是我们发生了分区容错,当quorum=1时
    • sentinel2检测到master不可用,因为127跟128网络断开,这个时候会触发主观下线,同时,sentinel2只能连接到1个sentinel,也满足半数以上原则(只有1个sentinel2)
    • sentinel2开启故障转移,将slave升级为master,就出现了2个master,这个情况也叫作脑裂。并且客户端会连接到2个master。(客户端连的是sentinel集群,sentinel1连到1.sentinel2 连到2)
    • 2个master都会写入数据,当网络恢复后,sentinel1的 master 会变成从,同步sentinel2的master数据,这个时候sentinel1的master数据就会丢失
      在这里插入图片描述

4.2、脑裂问题

配置三个sentinel也会出现脑裂问题,这是分区容错性的特性,例如三个就有可能出现这样的情况
在这里插入图片描述

解决方案

  • 避免双主问题
    • 自动化脚本和监控报警:结合监控系统检测网络分区和双主情况,自动化脚本以便手动恢复和协调主节点。
    • Automatic Fence:在检测到原主节点恢复上线时,通过脚本或其他机制自动将其降级为从节点,避免双主冲突。
  • 在Redis.cfg配置,通过配置这些参数,确保在任何无从节点可用的情况下,主节点停止写入,减少脑裂的可能性。
# 至少有1个从节点同步到我主节点的数据,但是由于是异步同步,所以是最终一致性 不会确保有数据写入
min-replicas-to-write 1 
# 判断上面1个的延迟时间必须小于等于10s
min-replicas-max-lag 10 

二、redis cluster

Redis Cluster 是 Redis 3.0 版本后引入的一种分布式存储架构,它解决了单个 Redis 实例在面对海量数据和高并发写操作时遇到的瓶颈问题。为了实现这一点,Redis Cluster 引入了哈希槽(hash slot)的概念,并且采用了去中心化的集群管理方式,没有使用代理服务。
Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点
如图:
在这里插入图片描述

1、虚拟槽

Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:

HASH_SLOT = CRC16(key) % 16384

每一个节点负责维护一部分槽以及槽所映射的键值数据。
扩容或缩容,需要重新分配槽,也需要重新迁移数据,此过程不需要正常运行的服务下线。
此出采用 一致性hash 的算法。

假如,这里有 3 个节点的集群环境如下:

  • 节点 A 哈希槽范围为 0 ~ 5500;
  • 节点 B 哈希槽范围为 5501 ~ 11000;
  • 节点 C 哈希槽范围为 11001 ~ 16383。
    此时,我们如果要存储数据,按照 Redis Cluster 哈希槽的算法,假设结果是: CRC16(key) % 16384 = 6782。 那么就会把这个 key 的存储分配到 B 节点。此时连接 A、B、C 任何一个节点获取 key,都会这样计算,最终通过 B 节点获取数据。

假如这时我们新增一个节点 D,Redis Cluster 会从各个节点中拿取一部分 Slot 到 D 上,比如会变成这样:

  • 节点 A 哈希槽范围为 1266 ~ 5500;
  • 节点 B 哈希槽范围为 6827 ~ 11000;
  • 节点 C 哈希槽范围为 12288 ~ 16383;
  • 节点 D 哈希槽范围为 0 ~ 1265,5501 ~ 6826,11001 ~ 12287
    这种特性允许在集群中轻松地添加和删除节点。同样的如果我想删除节点 D,只需要将节点 D 的哈希槽移动到其他节点,当节点是空时,便可完全将它从集群中移除。

2、数据对应

2.1、全量key计算

我们会根据key 通过CRC16 取模 16383 得到一个0到16383的值 计算公式:slot = CRC16(key) & 16383,得到的值,就代表这个key在哪个虚拟槽
例如:

set k1 1:
CRC16(k1) & 16383=11901
set k2 1:
CRC16(k2) & 16383=10
set k3 1:
CRC16(k3) & 16383=6666
那么我们k1对应的槽是11901 k2对应的槽是10 k3对应的槽是666

key跟槽的关系是根据key算出来的,后续是不能变动。

2.2、key统一映射

如果想把相关key放入一个虚拟槽,也就是一个实例节点,我们可以采用{},那么就只会根据{}里面的内容计算hash槽。
例如:

set k1{123} 1:
CRC16(123) & 16383=11901
set k2{234} 1:
CRC16(234) & 16383=10
set k3{542} 1:
CRC16(542) & 16383=6666

3、数据迁移

3.1 扩容

扩容(添加新节点)过程中,数据迁移的主要步骤包含以下几个部分:

3.1.1、启动新节点

启动新的 Redis 实例作为集群的节点:

redis-cli --cluster add-node 127.0.0.1:6380 127.0.0.1:6379
3.1.2、将新节点加入集群

使用 redis-cli 命令将新的节点加入现有集群:

redis-cli --cluster add-node 127.0.0.1:6380 127.0.0.1:6379
3.1.3、重新分配槽(resharding)

使用 redis-cli 工具重新分配哈希槽,这会触发槽和数据的迁移:

redis-cli --cluster reshard 127.0.0.1:6379

交互过程中,指定将一定数量的哈希槽从现有节点迁移到新节点。

3.1.4、迁移数据:

redis-cli 自动处理哈希槽的迁移,并在后台进行数据的移动。此迁移是渐进式的,不会中断服务。

3.2 缩容

缩容(移除节点)过程中,数据迁移的主要步骤包含以下几个部分:

3.2.1、触发哈希槽转移:

首先,确定需要移除的节点ID,获取节点信息:

redis-cli --cluster nodes 127.0.0.1:6379
3.2.2、移动哈希槽到其他节点:

使用 redis-cli 工具将指定节点的槽迁移到其他节点:

redis-cli --cluster reshard 127.0.0.1:6379 --slots SLOT_NUMBER --from NODE_ID_TO_REMOVE --to TARGET_NODE_ID
3.2.3、关闭并移除节点:

当所有哈希槽和数据迁移完成后,安全地关闭并移除节点:

redis-cli --cluster del-node 127.0.0.1:6379 NODE_ID_TO_REMOVE

4、高可用性机制

Redis Cluster 通过以下机制确保系统的高可用性:

4.1、主从复制:

  • 在 Redis Cluster 中,每个主节点(master)都有一个或多个从节点(slave)作为其副本。主节点负责处理读写请求,而从节点负责复制主节点的数据。
  • 从节点持续异步地从主节点复制数据,以保证当主节点发生故障时,从节点能够接管其工作。

4.2、故障检测:

  • Redis Cluster 使用 gossip 协议进行节点间的状态通信,定期发送 PING 和 PONG 消息以确认节点是否存活。
  • 如果某节点未能在配置的超时时间(如 5 秒)内响应 PING 消息,那么该节点将被标记为疑似失效(PFAIL)。
  • 若某节点被多个其他节点标记为疑似失效且达到一定数量(如超过半数节点),该节点将被标记为真正失效(FAIL)。

5、主从切换

当主节点失效时,Redis Cluster 自动执行主从切换,以恢复集群的正常运行。主从切换的步骤如下:

5.1、选择新的主节点

  • Redis Cluster 会在原主节点的从节点中选取一个新的主节点。这个选择过程会基于从节点的优先级和副本状态(如复制的偏移量)进行。
  • 优先级高且数据复制进度最接近主节点的从节点将被优先选择。

5.2、将从节点提升为主节点

  • 选定新的主节点后,Redis Cluster 会将这个从节点提升为主节点。这个过程中,从节点需要执行步骤以更新其角色和状态,并接管原主节点负责的哈希槽。
  • 提升过程中,集群状态将在其他节点的帮助下完成同步并宣布新的主节点。

5.3、恢复数据一致性和同步

  • 当新的主节点被确认后,其他从节点将更新其复制源指向新的主节点,并开始从新的主节点重新同步数据。
  • 同时,客户端连接将通过 MOVED 响应被重新路由到新的主节点所在的位置。

相关文章:

redis 分布式方案

文章目录 前言一、主从复制1、主从配置2、建立连接3、数据同步3.1、全量同步3.2、全量同步配置3.3、 增量同步3.4、 增量同步配置 二、redis sentinel1、主要功能2、sentinel配置3、高可用3.1、故障发现3.2、故障转移3.2.1、选举sentinel进行故障转移3.2.2、选举从节点升级成主…...

# [0114] Task01 《数学建模导论》P1 解析几何与方程模型

链接&#xff1a;https://www.datawhale.cn/activity/124 整理的相关代码库 GitHub 页面链接 绪论 姜启源&#xff1a;“数学建模就是建立数学模型解决实际问题” 本质还是解应用题&#xff0c;只是曾经的“小明买糖”变成了如今的“嫦娥探月”。 SEIR 模型&#xff0c;也…...

PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片

目录 PCM5142 简介PCM5142功能框图PCM5142特性 参考原理图 PCM5142 简介 PCM514x 属于单片 CMOS 集成电路系列&#xff0c;由立体声数模转换器 (DAC) 和采用薄型小外形尺寸 (TSSOP) 封装的附加支持电路组成。PCM514x 使用 TI 最新一代高级分段 DAC 架构产品&#xff0c;可实现…...

【HarmonyOS NEXT】碰一碰开发分享

关键词&#xff1a;鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享&#xff0c;支持用户通过手机碰一碰发起跨端分享&#xff0c;可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可&#xff0c;无需对 U…...

pytest+playwright落地实战大纲

前言 很久没有更新博客&#xff0c;是因为在梳理制作Playwright测试框架实战相关的课程内容。现在课程已经完结&#xff0c;开个帖子介绍下这门课程&#xff08;硬广, o(〃&#xff3e;▽&#xff3e;〃)o&#xff09; 课程放在CSDN学习频道&#xff0c; 欢迎关注~ PyTestPl…...

HTML<center>标签

HTML5不支持。 <center>标签在HTML4中用于使文本居中对齐。 用什么来代替呢&#xff1f; 例子 居中对齐文本&#xff08;使用 CSS&#xff09;&#xff1a; <html> <head> <style> h1 {text-align: center;} p {text-align: center;} div {text-a…...

【部署】将项目部署到云服务器

目录 1.获得服务器 2.连接到云服务器 3.配置环境 3.1.Java&#xff08;运行后端所需&#xff09; 3.2.MySQL数据库 3.3.Nginx&#xff08;运行前端所需&#xff09; 3.4. Node.js&#xff08;构建前端所需&#xff09; 4.打包项目 4.1.打包后端项目 4.2.打包前端项目…...

微软宣布Win11 24H2进入新阶段!设备将自动下载更新

快科技1月19日消息&#xff0c;微软于1月16日更新了支持文档&#xff0c;宣布Windows 11 24H2进入新阶段。 24H2更新于2024年10月1日发布&#xff0c;此前为可选升级&#xff0c;如今微软开始在兼容的Windows 11设备上自动下载并安装24H2版本。 微软表示&#xff1a;“运行Wi…...

傅里叶变换在语音识别中的关键作用

在语音识别中&#xff0c;傅里叶变换起着至关重要的作用&#xff0c;主要体现在以下几个方面&#xff1a; 一、时域到频域的转换 语音信号的特点 语音信号是一种时域信号&#xff0c;它随时间变化。例如&#xff0c;当我们说话时&#xff0c;声带的振动产生声波&#xff0c;这…...

面试-业务逻辑2

应用 给定2个数组a、b&#xff0c;若a[i] b[j]&#xff0c;则记(i,j)为一个二元数组&#xff0c;求具体的二元数组及其个数。 实现 a input("请输入数组a的元素个数&#xff1a;") # print(a) a_list list(map(int, input("请输入数组a的元素&#xff0c;…...

【20】Word:小许-质量管理-论文❗

目录 题目​ NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…...

Python数据分析案例70——基于神经网络的时间序列预测(滞后性的效果,预测中存在的问题)

背景 这篇文章可以说是基于 现代的一些神经网络的方法去做时间序列预测的一个介绍科普&#xff0c;也可以说是一个各种模型对比的案例&#xff0c;但也会谈一谈自己做了这么久关于神经网络的时间序列预测的论文&#xff0c;其中一些常见的模式及它们存在的问题以及效果&#x…...

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正

Kotlin Bytedeco OpenCV 图像图像54 透视变换 图像矫正 1 添加依赖2 测试代码3 测试结果 在OpenCV中&#xff0c;仿射变换&#xff08;Affine Transformation&#xff09;和透视变换&#xff08;Perspective Transformation&#xff09;是两种常用的图像几何变换方法。 变换方…...

PyTorch使用教程(11)-cuda的使用方法

1. 基本概念 CUDA&#xff08;Compute Unified Device Architecture&#xff09;是NVIDIA开发的一种并行计算平台和编程模型&#xff0c;专为图形处理器&#xff08;GPU&#xff09;设计&#xff0c;旨在加速科学计算、工程计算和机器学习等领域的高性能计算任务。CUDA允许开发…...

微软开源AI Agent AutoGen 详解

AutoGen是微软发布的一个用于构建AI Agent系统的开源框架,旨在简化事件驱动、分布式、可扩展和弹性Agent应用程序的创建过程。 开源地址: GitHub - microsoft/autogen: A programming framework for agentic AI 🤖 PyPi: autogen-agentchat Discord: https://aka.ms/auto…...

上位机工作感想-2024年工作总结和来年计划

随着工作年限的增增长&#xff0c;发现自己越来越不喜欢在博客里面写一些掺杂自己感想的东西了&#xff0c;或许是逐渐被工作逼得“成熟”了吧。2024年&#xff0c;学到了很多东西&#xff0c;做了很多项目&#xff0c;也帮别人解决了很多问题&#xff0c;唯独没有涨工资。来这…...

js: 区分后端返回数字是否为null、‘-’ 或正常number类型数字。

问&#xff1a; 这是我的代码<CountTo v-if!isNaN(Number(item.num))> <span v-else>{{item.num}}</span> 我希望不是null的时候走countTo&#xff0c;是null的时候直接<span>{{item.num}}</span>显示 回答&#xff1a; 最终结果&#xff1a; …...

C#中字符串方法

字符串属性&#xff1a;Lenght 长度比最大索引大1 string str "frerfgd"; 1.可以通过索引&#xff0c;获取字符串中的某一个字符&#xff0c;下标“0&#xff0c;1.......” Console.WriteLine(str[0]);//f Console.WriteLine(str[1]);//r //Console.WriteLine(s…...

flutter在使用gradle时的加速

当我使用了一些过时的插件的时候&#xff0c;遇到了一些问题 比如什么namespace 问题等&#xff0c;因为有些插件库没有更新了&#xff0c;或者最新版本处于测试阶段 于是我就删除这些旧插件(不符合我要求的插件) 于是根据各论坛的解决方法去做了以下的工作 1:项目中删除了这…...

SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——主目录(持续更新)

随着公司业务的增加&#xff0c;公司需要一个javapython人工智能相互配合架构&#xff0c;正常网站业务用java来做&#xff0c;而ai&#xff0c;例如电价预测等回归任务&#xff0c;以及大模型预测全网负荷&#xff0c;新能源出力等任务&#xff0c;使用python通过fastapi暴露接…...

【GIS操作】使用ArcGIS Pro进行海图的地理配准(附:墨卡托投影对比解析)

文章目录 一、应用场景二、墨卡托投影1、知识点2、Arcgis中的坐标系选择 三、操作步骤1、数据转换2、数据加载3、栅格投影4、地理配准 一、应用场景 地理配准是数字化之前必须进行的一项工作。扫描得到的地图数据通常不包含空间参考信息&#xff0c;需要通过具有较高位置精度的…...

C#,入门教程(03)——Visual Studio 2022编写彩色Hello World与动画效果

C#&#xff0c;入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 C#&#xff0c;入门教程(02)—— Visual Studio 2022开发环境搭建图文教程https://blog.csdn.net/beijinghorn/article/detail…...

使用 ChatGPT 生成和改进你的论文

文章目录 零、前言一、操作引导二、 生成段落或文章片段三、重写段落四、扩展内容五、生成大纲内容六、提高清晰度和精准度七、解决特定的写作挑战八、感受 零、前言 我是虚竹哥&#xff0c;目标是带十万人玩转ChatGPT。 ChatGPT 是一个非常有用的工具&#xff0c;可以帮助你…...

Unity2021.3.13崩溃的一种情况

如果出现如下的报错&#xff0c;可能是软件冲突的原因。自己的原因是使用f.lux这款软件似乎和Unity相互冲突&#xff0c;出现下面报错。 错误信息如上图...

通过ssh连接debian

使用方法 ssh usernameipaddress [inputpasswd]root用户默认无法由ssh连接&#xff0c; 可以通过修改配置 sudo vim /etc/ssh/sshd_config去掉PermitRootLogin前的‘#’,并修改为 PermitRootLogin yes 重启sshd服务 sudo systemctl restart sshd参考 https://linuxconfig.or…...

Transformer 与注意力机制原理说明与面试笔试题

文章大纲 注意力机制不同 种类的注意力机制Encoder Decoder 框架自注意力自注意力机制概述**基本原理****优点与应用****自注意力与多头注意力的关系****总结**多头注意力**多头注意力机制概述****基本原理****计算过程****多头注意力的优势****多头自注意力与多头注意力的区别…...

C语言之装甲车库车辆动态监控辅助记录系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之装甲车库车辆动态监控辅助记录系统 目录 一、前言 1.1 &#xff08;一&#xff09;…...

先进制造aps专题二十七 西门子opcenter aps架构分析

欧美的商业aps&#xff0c;主要就是sap apo,西门子opcenter aps,达索quintiq 从技术的层面&#xff0c;西门子aps是不如sap apo的&#xff0c;但是西门子aps是西门子数字化工厂产品的核心&#xff0c;有很多特色&#xff0c;所以分析 西门子aps主要分计划器和排产器两个部分 计…...

C++/QT环境下图像在窗口下等比例渲染绘制

本文中通过QT获取到opengl上下文环境,通过opengl3.0API将图像等比例渲染到QOpenGLWidget组件上面,相比cpu,渲染能力更强。 有以下四步骤。opengl基本知识点可参照之前文章OPENGL初学习 定义opengl渲染表面属性通过initializeGL接口初始化opengl上下文环境,然后加载并链接着…...

npm ERR! code CERT_HAS_EXPIRED

很不幸看到这个提示。 查了很多网上的解决方案&#xff0c;都提到一个解决方案&#xff1a; npm install -g npmlatest 靠就是执行install报的错&#xff0c;你要我通过install来解决这个问题。可见大多数人都是转发&#xff0c;从不自己试试。 第二个是看系统时间。这个基…...

[系统安全] 六十一.恶意软件分析 (12)LLM赋能Lark工具提取XLM代码的抽象语法树(初探)

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…...

网络Web存储之LocalStorage

文章目录 LocalStorage介绍定义特点兼容性常用方法存值取值删除指定键值对清空所有键值对通过索引获取键名获取所有值判断是否含有某个键&#xff08;key&#xff09;拓展遍历得到key存储和读取复杂类型的数据 应用场景 LocalStorage介绍 定义 LocalStorage 是HTML5提供的一种…...

HTML知识点复习

1.src 和 href 的区别 src&#xff1a;表示对资源的引用&#xff0c; src指向的内容会嵌入到其标签里。 当浏览器解析到该元素时候&#xff0c;会暂停其他资源的下载和处理&#xff0c; 直到将该资源加载、编译、执行完毕&#xff0c;所以js脚本一般会放在页面底部 href&…...

【Leetcode 热题 100】45. 跳跃游戏 II

问题背景 给定一个长度为 n n n 的 0 0 0 索引 整数数组 n u m s nums nums。初始位置为 n u m s [ 0 ] nums[0] nums[0]。 每个元素 n u m s [ i ] nums[i] nums[i] 表示从索引 i i i 向前跳转的最大长度。换句话说&#xff0c;如果你在 n u m s [ i ] nums[i] nums[i…...

《offer 来了:Java 面试核心知识点精讲 -- 原理篇》

在 Java 面试的战场上,只知皮毛可不行,面试官们越来越看重对原理的理解。今天就给大家分享一本能让你在面试中脱颖而出的 “武林秘籍”——《offer 来了:Java 面试核心知识点精讲 -- 原理篇》。 本书详细介绍了Java架构师在BAT和移动互联网公司面试中常被问及的核心知识,内…...

Spring Boot中的自动配置原理是什么

Spring Boot 自动配置原理 Spring Boot 的自动配置机制基于 条件化配置&#xff0c;通过 EnableAutoConfiguration 注解来启用。自动配置的核心原理是 基于类路径和环境条件来推断所需要的配置&#xff0c;Spring Boot 会根据项目中引入的依赖和当前环境来自动装配相关的配置项…...

蓝桥杯3525 公因数匹配 | 枚举+数学

题目传送门 这个题目是一个数学题&#xff0c;由于只需要找到存在大于1的公因数的两数&#xff0c;所以比较方便的做法是统计每一个数的&#xff08;质&#xff09;因数。可以通过筛法统计质因数降低复杂度&#xff0c;但是直接枚举因数也可以满足要求。使用字典记录每个因数出…...

elasticsearch基础

分布式搜索引擎01 1. 初始elasticsearch 1.1. 了解ES 1.1.1. elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在github搜索代码&#xff1a; 在电…...

【JsonViewer】Json格式化

使用 Notepad 对 Json 数据进行格式化处理&#xff0c;使数据在结构上更清晰 1.在线安装 安装之后&#xff0c;重启应用&#xff0c;在插件菜单栏即可看到 JsonViewer 选项&#xff0c;在 Notepad 中放入 Json 数据&#xff0c;点击 Format Json 进行数据格式化 2.离线安装 …...

线性代数概述

矩阵与线性代数的关系 矩阵是线性代数的研究对象之一&#xff1a; 矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集合&#xff0c;是线性代数中的核心概念之一。矩阵的定义和性质构成了线性代数中矩阵理论的基础&#xff0c;而矩阵运算则简洁地表示和…...

计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Linux(DISK:raid5、LVM逻辑卷)

赛题拓扑: 题目: DISK 添加4块大小均为10G的虚拟磁盘,配置raid-5磁盘。创建LVM命名为/dev/vg01/lv01,大小为20G,格式化为ext4,挂在到本地目录/webdata,在分区内建立测试空文件disk.txt。[root@storagesrv ~]# yum install mdadm -y [root@storagesrv ~]# mdadm -C -n …...

RIME-CNN-LSTM-Attention多变量多步时序预测Matlab实现

SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-LSTM-Multihead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-LSTM-Multihead-Attention霜冰算法…...

机器学习中的方差与偏差

文章目录 方差与偏差1.1 数据1.1.1 数据的分布1.1.2 拟合 1.2 方差与偏差1.2.1 泛化误差的拆分1.2.2 理解方差偏差 1.3 方差-偏差trade-off1.3.1 方差-偏差trade-off1.3.2 方差与偏差诊断 1.4 降低策略1.4.1 噪声1.4.2 高偏差1.4.3 高方差 方差与偏差 1.1 数据 1.1.1 数据的分…...

Ubuntu 22.04虚拟机安装配置调整(语言输入法字体共享剪切板等等

2025.01.07安装配置Ubuntu 22.04 记一下 快捷键 截屏 在设置-键盘-快捷键查看 跟搜到的不一样…不过shiftprint感觉也够用 安装 用的是VMware 参考&#xff1a;VMware中安装配置Ubuntu&#xff08;2024最新版 超详细&#xff09; 调教&#xff08;&#xff1f; 语言 改了…...

[创业之路-255]:《华为数字化转型之道》-1-主要章节、核心内容、核心思想

目录 前言&#xff1a;数字化转型对于企业而言&#xff0c;是一种全方位的变革 一、主要章节 1、认知篇&#xff08;第1~2章&#xff09;- Why 2、方法篇&#xff08;第3~5章&#xff09;- How 3、实践篇&#xff08;第6~10章&#xff09;- 实践 4、平台篇&#xff08;第…...

Java 接口安全指南

Java 接口安全指南 概述 在现代 Web 应用中&#xff0c;接口&#xff08;API&#xff09;是前后端交互的核心。然而&#xff0c;接口的安全性常常被忽视&#xff0c;导致数据泄露、未授权访问等安全问题。本文将详细介绍 Java 中如何保障接口安全&#xff0c;涵盖以下内容&am…...

Redis学习笔记1【数据类型和常用命令】

Redis学习笔记 基础语法 1.数据类型 String: 最基本的类型&#xff0c;可以存储任何数据&#xff0c;例如文本或数字。示例值为 hello world。Hash: 用于存储键值对&#xff0c;适合存储对象或结构体。示例值为 {"name": "Jack", "age": 21}。…...

Oracle graph 图数据库体验-安装篇

服务端安装 环境准备 安装数据库 DOCKER 安装23AI FREE &#xff0c;参考&#xff1a; https://container-registry.oracle.com/ords/f?p113:4:111381387896144:::4:P4_REPOSITORY,AI_REPOSITORY,AI_REPOSITORY_NAME,P4_REPOSITORY_NAME,P4_EULA_ID,P4_BUSINESS_AREA_ID:1…...

Android 13 动态显示隐藏 HomeButton,RecentsButton

com.android.launcher3.taskbar.NavbarButtonsViewController.initButtons mEnabledValue状态<T> StatePropertyHolder(T target, IntPredicate enabledCondition,Property<T, Float> property, float enabledValue, float disabledValue) {mEnableCondition = ena…...