1. 节点通信
    1.1 通信流程
    在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障等状态信息,Redis 集群采用 Gossip(流言)协议, Gossip 协议工作原理就是节点彼此不断通信交换信息,一段时间后所有的节点都会知道集群完整的信息,这种方式类似流言传播
1. 集群中的每个节点都会单独开辟一个 TCP 通道,用于节点之间彼此通信,通信端口号在基础端口上加10000。 2. 每个节点在固定周期内通过特定规则选择几个节点发送 ping 消息。
3. 接收到 ping 消息的节点用 pong 消息作为响应。

集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终它们会达到一致的 状态。当节点出故障、新节点加入、主从角色变化、槽信息变更等事件发生时,通过不断的 ping/pong 消息通信,经过一段时间后所有的节点都会知道整个集群 全部节点的最新状态,从而达到集群状态同步的目的。

1.2 Gossip消息
Gossip协议的主要职责就是信息交换。信息交换的载体就是节点彼此发送的Gossip消息,了解这些消息有助于我们理解集群如何完成信息交换。
Gossip消息可分为:ping消息,pong消息,meet消息,fail消息等;

  • meet消息:用于通知新节点加人。消息发送者通知接收者加人到当前集群,meet消息通信正常完成后,接收节点会加人到集群中并进行周期性的ping、pong消自
    交换。
  • ping消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此状态信息。ping消息发送封装了 自身节点和部分其他节点的状态数据。
  • pong消息:当接收到ping、 meet消息时,作为响应消息回复给发送方确认消息正常通信。pong消息内部封装了自身状态数据。节点也可以向集群内广播自身 的pong消息来通知整个集群对自身状态进行更新。
  • fail消息:当节点判定集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点接收到fail消息之后把对应节点更新为下线状态。.
    在这里插入图片描述
    所有门店消息格式划分为:消息头和消息体。消息头包含发送节点自身状态数据,接收节点根据消息头就可以获取到发送节点的相关数据,结构如下: cluster.h
typedef struct {char sig[4]; /* 信号的标识. */uint32_t totlen; /* 信号的长度 */uint16_t ver;/* 版本. */uint16_t port;/* tcp端口 */uint16_t type;/* 消息类型,用于区分meet,ping,pong */uint16_t count;/* 消息体包含的节点数量meet,ping,pong. */uint64_t currentEpoch; /* 当前发送节点的配置纪元. */ uint64_t configEpoch; /* 从节点的主节点配置纪元. */ uint64_t offset; /* 复制偏移量. */char sender[CLUSTER_NAMELEN]; /* 发送节点的nodeId */unsigned char myslots[CLUSTER_SLOTS/8]; /* 发送节点负责的槽信息 */char slaveof[CLUSTER_NAMELEN]; /* 如果发送节点是从节点,记录对应主节点的nodeId */ char myip[NET_IP_STR_LEN]; /* Sender IP, if not all zeroed. */char notused1[34]; /* 34 bytes reserved for future usage. */uint16_t cport; /* Sender TCP cluster bus port */uint16_t flags; /* 发送节点标识,区分主从是否下线 */unsigned char state; /* 发送节点所处的集群状态 */unsigned char mflags[3]; /* Message flags: CLUSTERMSG_FLAG[012]_... */union clusterMsgData data;
} clusterMsg;

集群内所有的消息都采用相同的消息结构clusterMsg,它包含了发送节点关键信息,如节点id、槽映射、节点标识(角色,是否下线);而消息体在Redis内部采用 clusterMsgData结构
cluster.h

union clusterMsgData {/* PING, MEET and PONG */ struct {/* Array of N clusterMsgDataGossip structures */clusterMsgDataGossip gossip[1]; } ping;/* 此处省略代码 */ 
}typedef struct {char nodename[CLUSTER_NAMELEN];uint32_t ping_sent;uint32_t pong_received;char ip[NET_IP_STR_LEN]; /* IP address last time it was seen */uint16_t port; uint16_t cport; uint16_t flags; uint32_t notused1;} clusterMsgDataGossip;

消息体clusterMsgData定义发送消息的数据,其中ping、meet、pong都采用clusterMsgDataGossi作为消息体用于信息的交换
如下为ping、meet消息时,接收节点会解析消息内容并根据自身的识别情况作出相应处理的流程图
在这里插入图片描述
在这里插入图片描述
接收节点收到ping/meet消息时,执行解析消息头和消息体流程:

  • 解析消息头过程:消息头包含了发送节点的信息,如果发送节点是新节点且消息是meet类型,则加入到本地节点列表;如果是已知节点,则尝试更新发送节点 的状态,如槽映射关系,主从角色等状态。
  • 解析消息体过程:如果消息体的clusterMsgDataGossip数组包含的节点是新节点,则尝试发起与新节点的meet握手流程;如果是已知节点,则根据 clusterMsgDataGossip中的flags字段判断该节点是否下线,用于故障转移

消息处理完后回复pong消息,内容同样包含消息头和消息体,发送节点接收到回复的pong消息后,采用类似的流程解析处理消息并更新与接收节点最后通信时 间,完成一次消息通信。

1.3 为什么redis选择槽的个数为16383个
对于客户端请求的key,根据公式HASH_SLOT=CRC16(key) mod 16384,计算出映射到哪个分片上,然后Redis会去相应的节点进行操作!
那大家思考过,为什么有16384个槽么?
ps:CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值。换句话说,值是分布在0~65535之间。那作者在做mod运算的时候,为什么不 mod65536,而选择mod16384?
这个问题,作者是给出了回答的!地址如下:https://github.com/antirez/redis/issues/2576

在这里插入图片描述
回 顾:
我们回忆一下Redis Cluster的工作原理!
这里要先将节点握手讲清楚。我们让两个redis节点之间进行通信的时候,需要在客户端执行下面一个命令

 127.0.0.1:7000>cluster meet 127.0.0.1:7001

如图
在这里插入图片描述
意思很简单,让7000节点和7001节点知道彼此存在!在握手成功后,连个节点之间会定期发送ping/pong消息,交换数据信息,如下图所示。
在这里插入图片描述
cluster.h

 #define CLUSTERMSG_TYPE_COUNT 10 /* 消息的总数量. */ typedef struct {/* ... */uint16_t type; /* 消息类型,用于区分meet,ping,pong */ unsigned char myslots[CLUSTER_SLOTS/8]; /* 发送节点负责的槽信息 */ unsigned char mflags[3]; /* 至少有3个节点信息 *//* ... */
} clusterMsg;

需知: char 1个字 节字节也叫Byte,是计算机数据的基本存储单位。8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB
在消息头中,最占空间的是 myslots[CLUSTER_SLOTS/8]。这块的大小是:16384÷8÷1024=2kb
那在消息体中,会携带一定数量的其他节点信息用于交换。那这个其他节点的信息,到底是几个节点的信息呢?约为集群总节点数量的1/10,至少携带3个节点的信息。
这里的重点是:节点数量越多,消息体内容越大。消息体大小是10个节点的状态信息约1kb

redis集群内节点,每秒都在发ping消息。规律如下

  • 每秒会随机选取5个节点,找出最久没有通信的节点发送ping消息
  • 每100毫秒(1秒10次)都会扫描本地节点列表,如果发现节点最近一次接受pong消息的时间大于cluster-node-timeout/2 则立刻发送ping消息
    在这里插入图片描述
    因此,每秒单节点发出ping消息数量为
    数量=1+10*num(node.pong_received>cluster_node_timeout/2)
    当槽位为65536时,这块的大小是: 65536 ÷ 8 ÷ 1024 = 8kb 因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的 消息头太大了,浪费带宽
  1. 故障转移与恢复
    2.1 代码启动流程
    server.c
void initServer(void) {/* 代码省略 */if (server.cluster_enabled) clusterInit(); 
}

在这个函数中会加载配置并且初始化一些状态指标,监听集群通信端口。除此之外,该函数执行了如下一些回调函数的注册。

  • 集群通信端口建立监听后,注册回调函数clusterAccpeteHandler。当节点之间建立连接时先由该函数进行处理
  • 当节点之间建立连接后,为新建立的连接注册读事件的回调函数clusterReadHandler
  • 当有读时间发生时,当clusterReadHandler读取到一个完整的包体后,调用clusterProcessPacket解析具体的包体。集群之间通信数据包的解析都在改函数内完成

并且有类似哨兵一样的redis时间让我函数serverCron中会调用

int serverCron(){ /* 代码省略 *//* Run the Redis Cluster cron. */run_with_period(100) {if (server.cluster_enabled) clusterCron();}/* Run the Sentinel timer if we are in sentinel mode. */if (server.sentinel_mode) sentinelTimer(); 
}

clusterCron函数执行如下操作。

  • 向其他节点发送meet消息,将其加入集群
  • 每1s会随机选择一个节点发送ping消息
  • 如果一个节点在超时间之内仍然没收到ping包响应,则标记为pfail

还有在每次进入循环之前,会在beforeSleep函数中执行一些操作,如下:

 void beforeSleep(struct aeEventLoop *eventLoop) {if (server.cluster_enabled) clusterBeforeSleep();
}

clusterBeforeSleep()函数会执行如下操作

  • 检查主从切换状态,如果需要,执行主从切换相关操作。
  • 更新集群状态,通过检查是否所有slot都有响应的节点提供服务以及是否大部分主服务都是可用状态,来决定集群处于正常状态还是失败状态
  • 刷新集群状态到配置文件中

故障解释
Redis集群自身实现了高可用。高可用首先需要解决集群部分失败的场景:当集群内少导节点出现故障时通过自动故障转移保证集群可以正常对外提供服务。本节介 绍故障转移的细节,分析故障发现和替换故障节点的过程。
故障发现
当集群内某个节点出现问题时,需要通过一-种健壮的方式保证识别出节点是否发生了故障。Redis 集群内节点通过ping/pong消息实现节点通信,消息不但可以传播节点槽信息,还可以传播其他状态如:主从状态、节点故障等。因此故障发现也是通过消息传播机制实现的,主要环节包括:主观下线(pfail)和客观下线(fail)。

  • 主观下线:指某个节点认为另一一个节点不可用,即下线状态,这个状态并不是最终的故障判定,只能代表一个节 点的意见,可能存在误判情况。
  • 客观下线:指标记-一个节点真正的下线,集群内多个节点都认为该节点不可用,从而达成共识的结果。如果是持有槽的主节点故障,需要为该节点进行故障转移。
  • 主观下线
    集群中每个节点都会定期向其他节点发送ping消息,接收节点回复pong消息作为响应。如果在cluster-node- timeout时间内通信一直失败, 则发送节点会认为接收 节点存在故障,把接收节点标记为主观下线(pfail)状态。流程如图下
    在这里插入图片描述
  • 节点a发送ping消息给节点b,如果通信正常将接收到pong消息,节点a更新最近一次与节点b的通信时间。
  • 如果节点a与节点b通信出现问题则断开连接,下次会进行重连。如果直通信失败,则节点a记录的与节点b最后通信时间将无法更新。
  • 节点a内的定时任务检测到与节点b最后通信时间超高cluster-node-timeout时,更新本地对节点b的状态为主观下线(pfail)。

主观下线简单来讲就是,当cluster-note-timeout时间内某节点无法与另一个节点顺利完成ping消息通信时,则将该节点标记为主观下线状态。每个节点内的 clusterState结构都需要保存其他节点信息,用于从自身视角判断其他节点的状态。结构关键属性

通过伪代码诠释:

 <?php
// 节点 
class node {public public$flags; $ping_sent;
}
// 集群
class cluster {/*** 节点集合 * @var node */public $nodes = [];public function __construct() {// .. 初始化 }
}
class server {/*** @var cluster */protected $cluster;protected $cluster_node_timeout; // 当前为主节点const CLUSTER_NODE_MYSTER = 1; // 主观 下线const CLUSTER_NODE_PFALL = 4;public function __construct() {$this->cluster = new cluster(); }public function clusterCron() {// .. 忽略其他代码foreach ($node as $key => $this->cluster->nodes) {if ($node->flags == self::CLUSTER_NODE_MYSTER) {continue; // 如果是当前自己跳过 }$now = time();// 自身节点最后一次与该ping通信的时间差$delay = $now - $node->ping_sent;// 如果通信时间差超过cluster_node_timeout,将该节点编辑为PFALL(主观下线) if ($delay > $this->cluster_node_timeout) {$node->flags = self::CLUSTER_NODE_PFALL; }}}
}
?>

Redis集群对于节点最终是否故障判断非常严谨,只有一个节点认为主观下线并不能准确判断是否故障。多个节点协作完成故障发现的过程叫做客观下线。

  • 客观下线
    当某个节点判断另一个节点主观下线后,相应的节点状态会跟随消息在集群内传播。ping/pong消息的消息体会携带集群1/10的其他节点状态数据,当接收节点发 现消息体中含有主观下线的节点状态时、会在本地找到故障及诶单clusterNode结构,保存到下线报告连接中 clusterNode fail_reportsx
    通过Gossip消息传播,集群内节点不断收集到故障节点的下线报告。当半数以上持有槽的主节点都标记某个节点是主观下线时。触发客观下线流程。
    假设节点a标记节点b为主观下线,一段时间后节点a通过消息把节点b的状态发送到其他节点,当节点c接受到消息并解析出消息体含有节点b的pfail状态时,会触发
    客观下线流程
  • 当消息体内含有其他节点的pfail状态会判断发送节点的状态,如果发送节点是主节点则对报告的pfail状态处理,从节点则忽略
  • 找到pfail对应的节点结构,更新clusterNode内部下线报告链表
  • 根据更新后的下线报告链接表尝试进行客观下线。

故障恢复
故障节点变为客观下线后,如果下线节点是持有槽的主节点则需要在它的从节点中选出一个替换它,从而保证集群的高可用。下线主节点的所有从节点承担故障恢复的义务,当从节点通过内部定时任务发现自身复制的主节点进入客观下线时,将会触发故障恢复流程。

  • 资格检查
  • 准备选举时间
  • 发起选举
  • 选举投票
  • 替换主节点

资格检查
每个从节点都要检查最后与主节点断线时间,判断是否有资格替换故障的主接地那。如果从节点与主节点断线时间超过 cluster-node-time * cluster-slave-validity-factor,则当前从节点不具备故障转移资格。
准备选举时间
当从节点符合故障资格后,更新触发故障选举的时间,只有到达该时间后才能执行后续流程。
这里之所以采用延迟触发机制,主要是通过对多个从节点使用不同的延迟选举时间来支持优先级问题。复制偏移量越大说明从节点延迟越低,那么它应该具有更高 的优先级来替换故障主节点。
发起选举
配置纪元是一个 只增不减的整数, 每个主节点自身维护一个配置纪元( clusterNode.configEpoch)标示当前主节点的版本,所有主节点的配置纪元都不相等,从节点会复制主节点的配置纪元。整个集群又维护一个全局的配置纪元( clusterState. currentEpoch),用于记录集群内所有主节点配置纪元的最大版本。执行cluster info 命令可以在看配置纪元信息:

[root@localhost ~]# redis-cli -h 192.160.1.200 cluster info 
cluster_current_epoch:7 // 整个集群最大配置纪元
cluster_my_epoch:1 // 当前主节点配置纪元

配置纪元会跟随ping/pong消息在集群内传播,当发送方与接收方都是主节点且配置纪元相等时代表出现了冲突,nodeld 更大的一方会递增全局配置纪元并赋值给当前节点来[分冲突
选举投票
这个过程就类似于哨兵的操作,会根据拥有槽的主节点进行投票,而从节点必须要等到N/2 + 1的票数才可以,此过程从节点不参与投票
替换主节点

  • 取消复制变为主节点
  • 通过redis内置,撤销主节点槽分配,并添加到自己身上
  • 向集群中广播自己的pong消息,其他节点更新配置

未完待续!!!

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

相关文章

  1. jQuery 的设置属性值,和获取属性值,attr()和prop();

    jQuery 的设置属性值&#xff0c;和获取属性值&#xff0c;attr()和prop(); attr(“属性”)&#xff1a;获取属性值attr(“属性”&#xff0c;“属性值”)&#xff1a;设置属性的属性值prop(“属性”)&#xff1a;获取属性值prop(“属性”&#xff0c;“属性值”)&#xff1a;…...

    2024/4/26 14:09:18
  2. python编写自动化脚本使用pytest 如何生成allure报告

    1.检查环境 首先是要安装好jdk的电脑上&#xff0c;运行java、javac这些命令都没有问题&#xff0c;要不安装allure时会报错 2.下载allure allure官网 http://allure.qatools.ru/ allure官方学习文档 https://docs.qameta.io/allure/#_commandline 在官网上下载&#xff0c;…...

    2024/4/7 14:28:40
  3. Statement对象详解

    jdbc中的statement对象用于向数据库发送SQL语句&#xff0c;想完成对数据库的增删改查&#xff0c;只需要通过这个对象向数据库发送增删改查语句即可。 CRUD操作 – create 使用executeUpdate&#xff08;String sql&#xff09;方法完成数据添加操作&#xff0c;示例操作&…...

    2024/4/17 10:55:27
  4. 学习jQuery?这篇文章就够了

    一、jQuery 简介 1、jQuery介绍 jQuery 是一个优秀的 Javascript 框架。jQuery 是轻量级的 JS 库 &#xff0c;它兼容 CSS3&#xff0c;还兼容各种浏览器&#xff08;IE 6.0, FF 1.5, Safari 2.0, Opera 9.0&#xff09;。jQuery 是免费、开源的。jQuery 是一个兼容多浏览器的…...

    2024/5/1 10:16:11
  5. 程序猿理论系列整理:程序的执行过程

    程序的生成 源文件预处理编译汇编链接hello.chello.ihello.shello.ohello.out程序的存储 二进制的形式&#xff0c;存储在机械硬盘上&#xff0c;即一连串01010101&#xff0c;硬盘用凹凸的方式表示01&#xff0c;这样就通过物理的方式表示出程序。 原理看这里&#xff1a;程…...

    2024/5/1 5:58:41
  6. 超级详细教程02:虚拟机中Ubuntu18.04安装JDK1.8

    文章目录1、安装系统版本2、JDK下载3、Ubuntu下载4、详细安装过程5、国内镜像推荐&#xff1a;1、安装系统版本 Ubuntu&#xff1a;18.0.4&#xff1b;JDK&#xff1a;1.8&#xff08;也就是JDK8&#xff09;&#xff1b;安装过程有疑问可以留言哈&#xff0c;为避免出错&…...

    2024/4/24 15:27:10
  7. 二叉搜索树的最近公共祖先 递归和迭代

    #include<bits/stdc.h> //二叉搜索树的最近公共祖先 递归 和迭代版本 using namespace std; struct node {int val;node* right;node* left; };node* fun1(node* root, node* p, node* q){if(p->val < root->val && q->val < root->val){retur…...

    2024/5/1 9:33:57
  8. Kubernetes 探针之Readiness 探测

    Kubernetes三种探针 k8s支持存活livenessProbe和就绪readinessProbe两种探针&#xff0c;两种探针都支持以下三种方式 一、exec 通过执行shell命令的方式&#xff0c;判断退出状态码是否是0&#xff0c;示例&#xff1a; exec:command:- cat- /tmp/healthy二、tcp 通过TCP请…...

    2024/4/27 11:34:59
  9. 【numpy】数组增加一维(升维)小结

    every blog every motto: You can do more than you think. 0. 前言 废话&#xff1a; 慌也没用&#xff0c;能做的就是按部就班。 本文主要对python中数组增加维度进行简单小结 说明&#xff1a; 具体维度位置&#xff0c;可以自己进行调整 1. 正文 原始数据&#xff1a;…...

    2024/4/21 7:48:31
  10. Java-使用for循环对list进行增删操作报错的解决方法

    iterator遍历 在循环的过程中&#xff0c;next()方法会使游标值1&#xff0c;并且返回游标扫过的那个元素&#xff1b;remove()方法则是删除游标 扫过 的那个元素&#xff0c;即next()返回的元素&#xff0c;并且游标值-1 所以我们使用迭代器iterator时不用担心删除list的数据…...

    2024/5/1 7:49:23
  11. 移植SSH到ARM Linux开发板

    步骤&#xff1a; 1.下载源码包&#xff0c;地址如下&#xff1a; openssh http://www.openssh.com/portable.html openssl http://www.openssl.org/source zlib http://www.zlib.net/ 2.交叉编译 创建工作目录&#xff1a; #mkdir /work #cd /work 在/work目下面创…...

    2024/4/24 16:17:14
  12. 监控平台_数据规范性校验(一)

    数据规范性校验查询前一分钟的数据集合如果数据集合为空如果数据集合不为空判断当前时间判断是否在8:10~20:30之间如果在8:10~20:30之间判断Redis中flag的值Flag为nullFlag为1判断数据表中上一分钟的数据条数和维度表&#xff08;我们要监控的数据&#xff09;中的总条数是否相…...

    2024/5/1 6:13:12
  13. ECharts入门——折线图与柱状图

    为第一次使用ECharts的小伙伴提供参考&#xff0c;废话不对说&#xff0c;直接上代码 这里主要对两个官网案例进行讲解&#xff1a; https://echarts.apache.org/examples/en/editor.html?cline-stack https://echarts.apache.org/examples/en/editor.html?cbar-backgroun…...

    2024/4/6 23:04:31
  14. os.path类的方法

    &#xff08;1&#xff09;os.path.dirname&#xff1a;用于返回一个目录的目录名&#xff0c;输入参数为文件的目录。 a os.path.dirname(C:\\Users\\22\\Desktop\\PaddleOCR-develop\\) b os.path.dirname(C:\\Users\\22\\Desktop\\PaddleOCR-develop) print (a) print (b…...

    2024/4/25 20:42:32
  15. Openresty/Nginx 缓存设置 - 缓存设置

    HTTP 缓存设置 Nginx 提供了 expires、etag、if-modified-since 指令来实现浏览器缓存控制。 expires 如果我们使用了 Nginx 作为静态资源服务器&#xff0c;那么可以使用 expires 进行缓存控制。 location ~ ^/images/* {root /Users/xuefeihu/hugege/code-sublime;expire…...

    2024/5/1 10:04:04
  16. 【分布式事务Seata源码解读二】Client端启动流程

    本文从源码的角度分析一下AT模式下Client端启动流程&#xff0c;所谓的Client端&#xff0c;即业务应用方。分布式事务分为三个模块&#xff1a;TC、TM、RM。其中TC位于seata-server端&#xff0c;而TM、RM通过SDK的方式运行在client端。 下图展示了Seata官方Demo的一个分布式…...

    2024/5/1 9:09:21
  17. $refs,$el,$data,$options区别及用法

    1.$refs 作用跟jq的获取dom元素$一样 有三种用法&#xff1a; 1.ref加在普通的元素上&#xff0c;用this.$refs.(ref值)获取到的是dom元素 2.ref加在子组件上&#xff0c;用this.$refs.(ref值)获取到的是组件实例&#xff0c;可以使用组件的所有方法。在使用方法的时候直接thi…...

    2024/5/1 5:55:36
  18. ORAN专题系列-21:5G协议栈功能切分选项与O-RAN白盒化

    白盒化小基站经常提到Option6,7,8&#xff0c; 为啥没有Opiton1-5呢&#xff1f; 从下图就可以看出原因。 选项1-8是5G协议栈的功能切分点。 O-RAN分离式基站&#xff0c;只使用了Option6-8&#xff0c;也就是说&#xff0c;在O-RAN中&#xff0c;最多把High-PHY放到O-RU中实现…...

    2024/4/26 11:01:29
  19. application.yml 增加日志设置

    logging:level:com:csdn: debug...

    2024/4/26 2:12:33
  20. 华三交换机V5和V7版本设置telnet登录配置

    华三交换机V5和V7版本设置telnet登录配置 V5版本命令 telnet server enable user-interface vty 0 4 authentication-mode scheme local-user admin password simple admin123 authorization-attribute level 3 service-type telnet V7版本命令 telnet server enable user-int…...

    2024/4/24 19:06:30

最新文章

  1. vue3步骤条带边框点击切换高亮

    如果是div使用clip-path: polygon(0% 0%, 92% 0%, 100% 50%, 92% 100%, 0% 100%, 8% 50%);进行裁剪加边框没实现成功。目前这个使用svg完成带边框的。 形状可自行更改path 标签里的 :d“[num ! 1 ? ‘M 0 0 L 160 0 L 176 18 L 160 38 L 0 38 L 15.5 18 Z’ : ‘M 0,0 L 160,0…...

    2024/5/1 11:35:27
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 虚拟货币:数字金融时代的新工具

    在数字化时代的到来之后&#xff0c;虚拟货币逐渐成为了一种广为人知的金融工具。虚拟货币是一种数字化的资产&#xff0c;它不像传统货币那样由政府或中央银行发行和监管。相反&#xff0c;虚拟货币通过密码学技术和分布式账本技术来实现去中心化的发行和交易。 虚拟货币的代…...

    2024/4/30 3:42:37
  4. Redis分区

    Redis分区是一种数据分片技术&#xff0c;用于将数据分布到多个Redis实例&#xff08;节点&#xff09;上以提高性能和扩展性。分区使得Redis能够处理比单个实例更大的数据集&#xff0c;并允许并行处理客户端请求。 原理&#xff1a; Redis分区通过一致性哈希算法&#xff08;…...

    2024/4/30 23:21:56
  5. 手机无线投屏到windows11电脑

    1 安装无线投影组件 2 电脑端打开允许其他设备投影的开关 3 手机找到投屏选项 4 手机搜索可用设备连接即可 这里的官方文档给的不太好,给了一些让人眼花撩乱的信息,以下是经过整合的有效信息...

    2024/4/30 2:46:56
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/1 10:25:26
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/30 0:57:52
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/29 18:43:42
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/1 4:07:45
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/30 23:32:22
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/30 23:16:16
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/1 6:35:25
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/1 11:24:00
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/1 4:35:02
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/30 14:53:47
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/30 22:14:26
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/1 6:34:45
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/30 22:57:18
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/30 20:39:53
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/1 4:45:02
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/1 8:32:56
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/29 3:42:58
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/29 19:56:39
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/1 5:23:20
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/30 20:52:33
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57