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

【Redis】哨兵机制和集群

    🔥个人主页: 中草药

🔥专栏:【中间件】企业级中间件剖析


一、哨兵机制

        Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工的进行主从切换,同时需要大量的客户端需要被通知切换到了新的主节点之上,不适用于大规模的应用,因此这里用到了哨兵机制

基本概念

        Redis的哨兵(Sentinel)机制是一种高可用性解决方案,旨在自动管理 主从复制 架构中的故障恢复。

名词逻辑结构物理结构
主节点Redis 主服务一个独立的 redis-server 进程
从节点Redis 从服务一个独立的 redis-server 进程
Redis 数据节点主从节点主节点和从节点的进程
哨兵节点监控 Redis 数据节点的节点一个独立的 redis-sentinel 进程
哨兵节点集合若干哨兵节点的抽象组合若干 redis-sentinel 进程
Redis 哨兵(Sentinel)Redis 提供的高可用方案哨兵节点集合 和 Redis 主从节点
应用方泛指一个多多个客户端一个或多个连接 Redis 的进程

哨兵模式的配置文件

sentinel.conf

sentinel monitor 主节点名 主节点ip 主节点端口 法定票数
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000

法定票数涉及到后续的主观下线到客观下线 

核心流程

监控

        哨兵节点会以一定的频率向 Redis 集群中的所有主节点和从节点发送 PING 命令(心跳包),通过节点的响应来判断节点是否正常运行。每个哨兵节点都会维护一个关于主节点和从节点的状态信息列表,记录节点的存活状态、角色、连接信息等。

        例如,当一个哨兵节点向主节点发送 PING 命令后,如果在规定的时间内(通常称为 down-after-milliseconds)没有收到响应,哨兵节点就会将该主节点标记为 “主观下线”(Subjectively Down,简称 SDOWN),即认为该节点可能出现了故障。

主观下线和客观下线

        “主观下线” 只是单个哨兵节点的判断,为了避免误判,哨兵机制引入了 “客观下线”(Objectively Down,简称 ODOWN)的概念。当一个哨兵节点将主节点标记为 SDOWN 后,它会向其他哨兵节点发送 SENTINEL is-master-down-by-addr 命令,告知其他哨兵自己对该主节点的判断。当有足够数量(超过配置的 quorum 值)的哨兵节点都认为该主节点处于 SDOWN 状态时,这个主节点就会被标记为 ODOWN,即被认为是真正的故障。​

        例如,假设集群中有 5 个哨兵节点,quorum 设置为 3。当其中一个哨兵节点发现主节点无响应并标记其为 SDOWN 后,它会向其他 4 个哨兵节点发送通知。如果有另外 2 个哨兵节点也认为该主节点 SDOWN,此时满足 quorum 条件,主节点就会被判定为 ODOWN,进入故障转移流程。

故障转移和通知

一旦主节点被判定为 ODOWN,哨兵机制就会触发故障转移流程。具体步骤如下:​

*1)选举领头哨兵:在所有哨兵节点中,通过 Raft 算法选举出一个领头哨兵(Leader Sentinel),由它来负责执行故障转移操作。选举过程中,每个哨兵节点都会向其他节点发送投票请求,获得超过半数投票的哨兵节点将成为领头哨兵。​

*2)选择新主节点:领头哨兵从当前存活的从节点列表中,按照一定的规则选择一个从节点作为新的主节点。选择规则通常基于从节点的优先级(slave-priority 配置项,数值越小优先级越高)、复制偏移量(优先选择复制偏移量最大,即数据最完整的从节点)以及运行 ID(随机选择)。​

3)提升新主节点:领头哨兵向选中的从节点发送 SLAVEOF no one 命令,将其提升为新的主节点。此时,新主节点开始接受客户端的写入请求。​

4)重新配置其他从节点:领头哨兵向其他从节点发送 SLAVEOF 命令,让它们指向新的主节点,开始从新主节点进行数据复制。​

5)通知客户端:领头哨兵通过发布与订阅机制,向所有连接到 Redis 集群的客户端发送新主节点的地址信息,以便客户端能够重新连接到新的主节点。


注意

1)哨兵节点数量不能为单一,避免其故障影响系统可用性。

2)哨兵节点宜为奇数个,利于选举 leader 。

3)哨兵节点不承担数据存储任务,由 Redis 主从节点负责存储。

4)哨兵 + 主从复制可提高系统可用性,但无法解决极端情况下数据写丢失问题 。

5)哨兵 + 主从复制不能提升数据存储容量,面对接近或超 机器物理内存的数据量时存在局限。

二、集群Cluster

这里的集群指的是实现的是拓展内存空间

        Redis Cluster 是 Redis 官方提供的分布式解决方案,旨在解决单机 Redis 的性能瓶颈、数据容量限制和高可用性问题,他通过引入多组的Master/Slave,每一组的Master/Slave存储数据全量的一部分,从而构成一个更大的整体,称为Redis集群(Cluster).

  每一个红框部分被称为是一个分片(Sharding)

数据分片算法

1、哈希求余算法

        也叫除法取余哈希 ,是一种简单的哈希算法。将输入数据Key(比如使用Md5算法)通过除法运算后取余数,得到特定范围内的哈希值。比如对于整数,用整数除以N取余,余数就是哈希值。

MD5算法是广泛使用的哈希算法,他的主要特点有:

1、计算的结果是定长的

可处理任意长度数据,输出始终是 128 位二进制数(转换为十六进制是 32 个字符 )。

2、计算结果是发散的

两个字符串即使只有细小差别,计算出的结果差别也是很大

2、计算结果不可逆

        在一些哈希表实现中,先计算键值的 hashCode 值,再对数组长度取余(有时用位运算实现 ),得到的余数作为存储下标 。例如有数据 [10, 20, 30] ,设定除数为 7 ,则 10 % 7 = 3 、20 % 7 = 6 、30 % 7 = 2 ,362 就是对应哈希值。

优点:简单高效,数据分配均匀

缺点:一旦需要扩容,N改变了,原有的映射规则改变,需要让节点之间的数据相互传输,重新排列,满足新的映射规则,此时需要搬运的数据量是比较大的,开销较大

如上图一共有21个key,仅仅只有3个key是没有经过搬运的


2、一致性哈希算法

        构建一个逻辑上的环形结构,是 0 到 2^32-1(或其他取值范围 )的哈希值空间,数据按照顺时针方向增长。每个节点(物理节点或虚拟节点 )通过哈希算法映射到环上某个位置 。

        数据经哈希算法映射到环上位置,存储在顺时针方向第一个遇到的节点上 。比如有服务器节点 A、B、C 映射在环上,数据 D 经哈希后落在环上某点,按顺时针找,第一个遇到节点 B,D 就存储在 B 。

优点:大大降低了扩容时数据搬运的规模,提高了扩容操作的效率

缺点:会出现数据分配不均匀,即数据倾斜

3、哈希槽分区算法(Redis使用)

        集群通过哈希槽(Hash Slot)实现数据分片,共 16384 个哈希槽。键经 CRC16 算法计算哈希值并对 16384 取模,确定所属哈希槽,哈希槽分配到不同主节点 ,每个主节点管理部分哈希槽及对应数据。

hash_slot = crc16(key) % 16384

其中 crc16 也是一种hash算法

16384实际上就是16*1024 也就是 2^14

该算法的本质相当于是哈希求余和一致性哈希的一种结合,解决了数据倾斜和数据搬运成本高的问题

这里的分片规则是很灵活的.每个分片持有的槽位也不一定连续.。

每个分片的节点使用 位图 来表示自己持有哪些槽位.对于16384个槽位来说,需要2048个字节(2KB)大小的内存空间表示.

 常见问题

1、Redis集群最多有16384个分片吗

如果一个分片一个槽位的话反而会出现数据分布不均匀的情况,实际上Redis作者建议集群分布数不应该超过1000

2、为什么是16384个槽位

官方回答:github.com

翻译过来大概意思是:

节点之间通过心跳包通信。心跳包中包含了该节点持有哪些 slots. 这个是使用位图这样的数据结构表示的。表示 16384 (16k) 个 slots, 需要的位图大小是 2KB. 如果给定的 slots 数更多了,比如 65536 个了,此时就需要消耗更多的空间,8 KB 位图表示了.。8 KB, 对于内存来说不算什么,但是在频繁的网络心跳包中,还是一个不小的开销.

另一方面,Redis 集群一般不建议超过 1000 个分片。所以 16k 对于最大 1000 个分片来说是足够用的,同时也会使对应的槽位配置位图体积不至于很大.

故障处理

主节点宕机

我们可以在docker中模拟建造一个集群关系

在上述的集群关系之中挑一个随便停掉

docker stop redis1

连上redis2 

可以看到ip地址101的节点已经提示fail,然后原本是从节点的105成了新的主节点

此时重新启动redis1

docker start redis1

再进行观察

此时的101重新加入到集群之中但是是作为从节点

可以登陆到101客户端执行cluster failover进行集群恢复,也就是把101重新设为master


处理流程

故障判定

集群中的所有节点,都会周期性的使用心跳包进行通信.

1)节点 A 给节点 B 发送 ping 包,B 就会给 A 返回一个 pong 包. ping 和 pong 除了 message type 属性之外,其他部分都是一样的。这里包含了集群的配置信息 (该节点的 id, 该节点从属于哪个分片,是主节点还是从节点,从属于谁,持有哪些 slots 的位图...).

2)每个节点,每秒钟,都会给一些随机的节点发起 ping 包,而不是全发一遍。这样设定是为了避免在节点很多的时候,心跳包也非常多 (比如有 9 个节点,如果全发,就是 9 * 8 有 72 组心跳了,而且这是按照 N^2 这样的级别增长的).

3)当节点 A 给节点 B 发起 ping 包,B 不能如期回应的时候,此时 A 就会尝试重置和 B 的 tcp 连接,看能否连接成功。如果仍然连接失败,A 就会把 B 设为 PFAIL 状态 (相当于主观下线).

4)A 判定 B 为 PFAIL 之后,会通过 redis 内置的 Gossip 协议,和其他节点进行沟通,向其他节点确认 B 的状态. (每个节点都会维护一个自己的 "下线列表", 由于视角不同,每个节点的下线列表也不一定相同).

5)此时 A 发现其他很多节点,也认为 B 为 PFAIL, 并且数目超过总集群个数的一半,那么 A 就会把 B 标记成 FAIL (相当于客观下线), 并且把这个消息同步给其他节点 (其他节点收到之后,也会把 B 标记成 FAIL).

至此,B 就彻底被判定为故障节点了.

某个或者某些节点宕机,有的时候会引起整个集群都宕机 (称为 fail 状态).
以下三种情况会出现集群宕机:

  • 某个分片,所有的主节点和从节点都挂了,该分片无法提供服务
  • 某个分片,主节点挂了,但是没有从节点.
  • 超过半数的 master 节点都挂了.

核心原则是保证每个slots都能够正常工作

故障迁移

上述例子中,B 故障,并且 A 把 B FAIL 的消息告知集群中的其他节点.

  • 如果 B 是从节点,那么不需要进行故障迁移.
  • 如果 B 是主节点,那么就会由 B 的从节点 (比如 C 和 D) 触发故障迁移了.

所谓故障迁移,就是指把从节点提拔成主节点,继续给整个 redis 集群提供支持.
具体流程如下:

1)从节点判定自己是否具有参选资格。如果从节点和主节点已经太久没通信 (此时认为从节点的数据和主节点差异太大了), 时间超过阈值,就失去竞选资格.

2)具有资格的节点,比如 C 和 D, 就会先休眠一定时间。休眠时间 = 500ms 基础时间 + [0,500ms] 随机时间 + 排名 * 1000ms.offset 的值越大,则排名越靠前 (越小).

3)比如 C 的休眠时间到了,C 就会给其他所有集群中的节点,进行拉票操作。但是只有主节点才有投票资格.

4)主节点就会把自己的票投给 C (每个主节点只有 1 票). 当 C 收到的票数超过主节点数目的一半,C 就会晋升成主节点.(C 自己负责执行 slaveof no one, 并且让 D 执行 slaveof C).

5)同时,C 还会把自己成为主节点的消息,同步给其他集群的节点。大家也都会更新自己保存的集群结构


集群扩容

集群扩容本身是一件风险较高,成本比较大的操作

1)把新的主节点加入到集群

redis-cli --cluster add-node 172.30.0.110:6379 172.30.0.101:6379

前一个ip是被新增的节点,后一个ip表示集群上的任意一个节点

此时可以注意到该节点已被加入到集群但是还未分配slots

2)重新分配slots

redis-cli --cluster reshard 172.30.0.101:6379

reshard 后的地址是集群中的任意节点地址.
另外,注意单词拼写,是 reshard (重新切分), 不是 reshared (重新分享), 不要多写个 e

此时会询问多少个slots要进行shard

那些节点来接受这些slots,此处应该是我们新加入的节点

这些节点从哪里搬过来

all, 表示从其他每个持有 slots 的 master 都拿过来点.

手动指定,从某一个或者某几个节点来移动 slots (以 done 为结尾)

之后会先给出搬运的计划,并未实施真正的搬运操作,当输入yes之后,才会开始真正的搬运过程,不仅仅是slots的重新分配,也是数据的搬移,因此是一个比较重量的操作

3)为该主节点添加新的从节点

redis-cli --cluster add-node 172.30.0.111:6379 172.30.0.101:6379 --cluster-slave --cluster-master-id [172.30.1.110 节点的 nodeId]

 此时集群扩容才算是真正完成

在搬运slots/数据的时候,客户端能否正常访问集群?

        大部分未搬运的 key 对应的业务可以正常访问。例如客户端访问某 key,经集群分片算法判定该 key 所在分片未进行相关数据搬运,就能正常重定向到对应节点并操作 。

        而针对需要进行搬运的key会存在访问错误的情况,若客户端访问的 key 正好处于搬运过程中,比如已从原节点搬走但还未完全在新节点就绪,此时访问会失败 。例如客户端请求某 key,集群按算法重定向到对应节点,却发现该 key 已被迁移走,就无法正常响应 。

因此,针对生产环境的扩容,可以在流量小的情况下进行,把损失降到最低。
很明显,要想追求更高的可用性,让扩容对于用户影响更小,就需要搞一组新的机器,重新搭建集群,并且把数据导入过来,使用新集群代替旧日集群.(成本最高的)。


自信与骄傲有异:信者常沉着,而骄傲者常浮扬。                                                ——梁启超

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸 

相关文章:

【Redis】哨兵机制和集群

🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、哨兵机制 Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工的进行主从切换,同时需要大量的客户端需要被通知切换到…...

uni-app 引入vconsole web端正常,安卓端报错 Cannot read property ‘sendBeacon‘ of undefined

reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property sendBeacon of undefined vconsole 只支持 web 端,…...

数据管道的解耦艺术:Dagster I/O管理器实现存储与逻辑分离

在现代数据工程中,高效管理数据的读写逻辑是构建可维护管道的关键。Dagster的**I/O管理器(I/O Managers)**通过分离数据处理与数据存储逻辑,显著提升了代码的可复用性和灵活性。本文将深入解析其核心概念、应用场景及实战示例。 一…...

shell脚本--2

1、实时监控cpu、内存的shell脚本 #!/bin/bash# 获取当前时间 DATE$(date "%Y-%m-%d %H:%M:%S")# 获取CPU使用情况 CPU_USAGE$(top -b -n1 | grep "Cpu(s)" | awk {print $2 $4})# 获取内存使用情况 MEMORY_USAGE$(free | grep Mem | awk {print $3/$2 *…...

jenkins配置多nexus仓库多maven版本

jenkins多环境多nexus仓库,多maven版本 使用优化,jenkins多环境多nexus仓库,多maven版本 1、多settings.xml设置构建 背景:jenkins本地安装一个maven版本,默认只有一个settings.xml文件指定本地和远端nexus仓库&#x…...

Linux理解文件fd

先来段代码回顾C文件接口 myfile.c写文件 #include <stdio.h>int main() {FILE *fp fopen("log.txt","a");if(NULL fp){perror("fopen");return 1;}fprintf(fp,"helloWorld,%d,%s,%lf\n",10,"lsf",3.14);fclose(fp)…...

【Python】os模块

os 模块是 Python 标准库中用于与操作系统交互的核心模块&#xff0c;提供了许多操作文件和目 录的函数。 1. 基本介绍 os 模块提供了以下主要功能&#xff1a; 文件和目录操作路径操作进程管理环境变量访问 import os2. 常用功能分类 2.1 文件和目录操作 函数/方法描述o…...

2025 Mac常用软件安装配置

1、homebrew 2、jdk 使用brew安装jdk&#xff1a; 配置环境变量&#xff1a; 3、maven 使用brew安装maven&#xff1a; 配置环境变量&#xff1a; 4、光标平滑移动 5、鼠标滚轮调整 mos 6、常用的终端工具 tabby 7、软件卸载 腾讯柠檬&#xff1a;https://lemon.qq.com/ 8、…...

PyQt5 实现自定义滑块,效果还不错

最近,黄老师闲来无事,需要做一个 播放器的滑块,但是Qt官方的长这个样子,不太好看 于是我自己写了一个,效果还不错,请看下面的效果图: 功能可以点击,可以拖拽改变进度,和播放器的进度条一样 源码如下: 需要的自取 import sys from PyQt5.QtWidgets import QApplicat…...

如何在ENVI Classic 和 ENVI中进行波段合成

示例使用Landsat的三个波段进行合成为示例&#xff0c;合成后展示为假彩色。 对应关系为&#xff1a; Red -- b4&#xff08;近红外 near-infrared&#xff09;NIR Green -- b3 &#xff08;红光 Red&#xff09; Blue -- b2 &#xff08;绿光 Green&#xff09; 一、ENVI…...

协方差与皮尔逊相关系数:从定义到应用的全面解析

目录 一、协方差与皮尔逊相关系数的定义1.1 协方差&#xff08;Covariance&#xff09;1.2 皮尔逊相关系数&#xff08;Pearson Correlation Coefficient&#xff09; 二、协方差的定义与推导逻辑2.1 核心目标&#xff1a;衡量变量的“协同变化”2.2 数学表达的直观性2.3 从线性…...

ICML 2025录取率公布,spotlight posters仅占2.6%

近日&#xff0c;ICML 2025公布了论文录用结果。本次大会共收到 12,107篇有效论文投稿&#xff0c;比去年增加了28%&#xff0c;今年录取论文3,260篇&#xff0c;录取率为 26.9%。其中仅有313篇被列为“焦点海报”&#xff08;即所有投稿中排名前2.6%的论文&#xff09;&#x…...

kotlin一个函数返回多个值

一、主要实现方式 1. Pair/Triple 元组 用途&#xff1a;临时快速返回 2 或 3 个简单值&#xff0c;适用于简单场景语法&#xff1a; fun getStatus(): Pair<Int, String> {return Pair(200, "Success") // 等价于 200 to "Success" }// 解构接收 …...

Clojure 学习笔记

Clojure哲学 1.又一种Lisp&#xff1f; 优美、灵活、代码即数据。 实现一门程序设计语言&#xff0c;代码同数据一般对待&#xff0c;这需要语言本身具有非常强的可塑性。当语言就是以这种本质的数据结构表现时&#xff0c;语言本身就可以操作自己的结构和行为了。 2.函数式编…...

5.7 react 路由

react 状态管理库 14:20 react 路由&#xff08;补充&#xff09; 数据路由 路由hooks 路由跳转 &#xff08;方法 标签/内置方法&#xff09; 获取路由地址栏信息 动态路由实现&#xff08;多角色权限路由&#xff09; redux redux-toolkit 状态管理 antd 组件使用 1.…...

8. HTML 表单基础

表单是网页开发中与用户交互的核心组件&#xff0c;用于收集、验证和提交用户输入的数据。本文将基于提供的代码素材&#xff0c;系统讲解 HTML 表单的核心概念、常用控件及最佳实践。 一、表单的基本结构 一个完整的 HTML 表单由以下部分组成&#xff1a; <form action&q…...

遥感数据处理、机器学习建模与空间预测的全流程指南——涵盖R语言(随机森林、XGBoost、SVM等)、特征提取、模型优化及生态学案例分析

随机森林是一种强大的集成学习方法&#xff0c;特别适用于复杂的遥感数据分析。它通过构建多棵决策树并引入随机性&#xff0c;有效降低模型的方差和过拟合风险。在训练过程中&#xff0c;随机森林利用Bootstrap抽样生成多样化的训练集&#xff0c;并在节点分裂时随机选择特征子…...

Android 数据持久化之数据库存储 Room 框架

一、简介 Room 是 Google 推出的 Android 持久层框架&#xff0c;建立在 SQLite 之上&#xff0c;提供了一个抽象层&#xff0c;简化了数据库操作。它通过注解和编译时检查来确保数据操作的正确性。 Room 主要由以下三个组件组成&#xff1a; Entity&#xff08;实体&#x…...

空间数据分析新趋势:AI 与 ArcGIS Pro 的协同创新

技术点目录 AI&#xff08;DeepSeek、ChatGPT&#xff09;大模型介绍及应用AI&#xff08;DeepSeek、ChatGPT&#xff09;支持下空间数据处理及分析功能基础AI&#xff08;DeepSeek、ChatGPT&#xff09;支持下空间数据选择及读取AI&#xff08;DeepSeek、ChatGPT&#xff09;支…...

Oracle OCP认证考试考点详解083系列10

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 46. 第46题&#xff1a; 题目 解析及答案&#xff1a; 查看以下配置&#xff1a; CDB1 和 CDB2 是两个容器数据库。 PDB1 是 CDB1 中的一…...

【linux常用指令】du命令

今天收到通知需要将服务器上的容量大的文件移动到大容量数据盘中。 du -sh */ | sort -h如果你想按大小排序显示文件夹&#xff0c;可以结合 sort 命令。这会按大小从小到大排序显示文件夹。如果想按大小从大到小排序&#xff0c;可以加上 -r 选项。 du -sh */ | sort -h -r...

统一返回JsonResult踩坑

定义了一个统一返回类&#xff0c;但是没有给Data 导致没有get/set方法&#xff0c;请求一直报错 public class JsonResult<T> {private int code;private String message;private T data;public JsonResult() {}public JsonResult(int code, String message, T data) {…...

MCP Client适配DeepSeek

本文是通过MCP官方的client例子进行修改&#xff0c;适配DeepSeek API. MCP client 先解析一下什么是MCP client。 MCP Client 是 Model Context Protocol&#xff08;模型上下文协议&#xff09;架构中的客户端组件&#xff0c;主要负责与 MCP 服务器建立和管理连接。它是一…...

物业设备管理的“多系统协同”模式:ERP、IoT与工单系统如何联动?

在智慧物业快速发展的今天&#xff0c;设备管理已从“被动维修”转向“主动预防”&#xff0c;但许多企业仍面临系统割裂、数据孤岛的困境。ERP系统记录设备台账却难实时监控&#xff0c;IoT设备采集数据却无法联动响应&#xff0c;工单系统处理流程却依赖人工流转——这些痛点…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】6.4 时间序列分析(窗口函数处理时间数据)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL时间序列分析&#xff1a;窗口函数处理时间数据实战一、时间序列分析核心场景与窗口函数优势1.1 业务场景需求1.2 窗口函数核心优势 二、窗口函数基础&#xff1a…...

数据可视化:艺术与科学的交汇点,如何让数据“开口说话”?

数据可视化&#xff1a;艺术与科学的交汇点&#xff0c;如何让数据“开口说话”&#xff1f; 数据可视化&#xff0c;是科技与艺术的结合&#xff0c;是让冰冷的数字变得生动有趣的桥梁。它既是科学——讲究准确性、逻辑性、数据处理的严谨性&#xff1b;又是艺术——强调美感…...

​IP 风险画像如何实现对恶意 IP 的有效拦截?

IP 风险画像作为一种强大的技术手段&#xff0c;在识别和拦截恶意 IP 方面发挥着至关重要的作用。 IP风险画像技术简介 IP 风险画像技术通过收集和分析 IP 地址的多维度信息&#xff0c;为每个 IP 构建详细的风险评估模型。 这些维度包括但不限于 IP 的地理位置、历史访问行…...

B树如何用于磁盘 ,B+树为如何用于数据库

B树 M阶B树&#xff1a;每个节点最多M个子节点&#xff0c;每个节点最多存M-1个Key-Value值&#xff0c;key以升序排序。 构建五阶B树。 那么value是干什么的呢。 先让我们介绍一下cpu 内存 磁盘的关系 我们知道了页的概念。B树用于磁盘的读取。Key是对文件进行编号&#xff…...

image-classifier开源程序Elixir是使用电脑学习对图像进行分类并从中提取数据或描述其内容,非常不错的图片整理工具

​一、软件介绍 文末提供程序和源码下载 Elixir 机器学习功能构建一个应用程序&#xff0c;该应用程序执行图像字幕和语义搜索&#xff0c;以使用您的语音查找上传的图像&#xff01; 二、为什么做这个程序 在构建我们的应用程序时&#xff0c;我们认为 images 这是一种必不…...

HarmonyOS 鸿蒙操作物联网设备蓝牙模块、扫描蓝牙、连接蓝牙和蓝牙通信

01【HarmonyOS 蓝牙】 物联网无线传输方案、HarmonyOS蓝牙数据通信之前的准备工作 02【HarmonyOS 蓝牙】配置蓝牙权限 检测 打开 关闭蓝牙 扫描蓝牙 显示蓝牙设备 03【HarmonyOS 蓝牙】连接蓝牙 发现服务 获取特征值 读取信息 写入信息 和蓝牙模块交互 04【物联网 Wifi模块…...

STM32开发GPIO

1、什么是GPIO General Purpose lnput Output&#xff0c;即通用输入输出端口&#xff0c;简称GPIO 作用:负责采集外部器件的信息或者控制外部器件工作&#xff0c;即输入输出 2、GPIO特点 1&#xff0c;不同芯片型号&#xff0c;IO口数量可能不一样&#xff0c;可通过选型…...

【机器学习】Logistic 回归

Logistic 回归虽然名字中带有“回归”&#xff0c;但它实际上是一种广泛应用于 二分类问题 的线性分类算法。 Logistic 回归的核心任务是预测一个样本属于正类的概率&#xff0c;而概率必须在 [ 0 , 1 ] 范围内。 Logistic回归 通过将输入特征的线性组合映射到概率空间&…...

ClimateCatcher专用CDS配置教程

文章目录 API获取官网账号注册CDSAPI本地化配置 API获取官网 首先需要访问CDS官方网站&#xff0c;点我蓝色字直接到官网how-to-api点我蓝色字直接到官网 目前API的网页是这样的 账号注册 如果有账号的小伙伴可以直接登录自己的账号并跳转到CDSAPI本地化配置&#xff0c;如…...

拆解 Prompt 工程:五大场景驱动 DeepSeek 超越 ChatGPT

同样的模型、不一样的答案&#xff0c;差距往往发生在一行 Prompt 里。本文围绕五大高频实战场景&#xff0c;给出可直接复制的 DeepSeek 提问框架&#xff0c;并穿插《DeepSeek 行业应用大全》中 64 个行业模板精华&#xff0c;帮助读者迅速跑赢 ChatGPT。&#x1f31f; 剧透…...

【解决方案】CloudFront VPC Origins 实践流程深入解析 —— 安全高效架构的实战之道

目录 引言一、VPC Origins 的核心价值&#xff08;一&#xff09;安全性提升&#xff08;二&#xff09;运维效率优化&#xff08;三&#xff09;成本节约&#xff08;四&#xff09;全球分发能力的保留 二、VPC Origins 的架构解析&#xff08;一&#xff09;流量路径设计&…...

软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试(2)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点 —— 黑盒测试与白盒测试&#xff08;1&#xff09; 本文内容参考&#xff1a; 黑盒测试和白盒测试详解-CSDN博客 软件测试中的各种覆盖&#xff08;Coverage&#xff09;详解-CSDN博客 特此致谢&#xff01; 二、白…...

【背包dp----01背包】例题三------(标准的01背包+变种01背包1【恰好装满背包体积 产生的 最大价值】)

【模板】01背包 题目链接 题目描述 : 输入描述: 输出描述: 示例1 输入 3 5 2 10 4 5 1 4输出 14 9说明 装第一个和第三个物品时总价值最大&#xff0c;但是装第二个和第三个物品可以使得背包恰好装满且总价值最大。 示例2 输入 3 8 12 6 11 8 6 8输出 8 0说明 装第三个物…...

设计模式之状态模式

在日常开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象在不同时刻有不同的状态&#xff0c;不同状态下它的行为也会发生变化。此时&#xff0c;使用大量if...else或switch语句会让代码变得混乱而难以维护。为了更优雅地应对这种问题&#xff0c;状态模式(Stat…...

arXiv论文 MALOnt: An Ontology for Malware Threat Intelligence

文章讲恶意软件威胁情报本体。 作者信息 作者是老美的&#xff0c;单位是伦斯勒理工学院&#xff0c;文章是2020年的预印本&#xff0c;不知道后来发表在哪里&#xff08;没搜到&#xff0c;或许作者懒得投稿&#xff0c;也可能是改了标题&#xff09;。 中心思想 介绍开源…...

Spark处理过程-转换算子和行动算子

计算时机 转换算子 转换算子是惰性执行的&#xff0c;这意味着在调用转换算子时&#xff0c;系统不会立即进行数据处理。这种惰性计算的方式可以让 Spark 对操作进行优化&#xff0c;例如合并多个转换操作&#xff0c;减少数据的传输和处理量。行动算子 行动算子是立即执行的。…...

使用 pgrep 杀掉所有指定进程

使用 pgrep 杀掉所有指定进程 pgrep 是一个查找进程 ID 的工具&#xff0c;结合 pkill 或 kill 命令可以方便地终止指定进程。以下是几种方法&#xff1a; 方法1&#xff1a;使用 pkill&#xff08;最简单&#xff09; pkill 进程名例如杀掉所有名为 “firefox” 的进程&…...

Android学习总结之MMKV(代替SharedPreferences)

Q1&#xff1a;SharedPreferences 为什么会导致 ANR&#xff1f;MMKV 如何从根本上解决&#xff1f; 高频考察点&#xff1a;Android 主线程阻塞原理、SP 同步 / 异步机制缺陷、MMKV 内存映射技术 SP 导致 ANR 的三大元凶&#xff1a; 同步提交&#xff08;commit ()&#xf…...

SWiRL:数据合成、多步推理与工具使用

SWiRL&#xff1a;数据合成、多步推理与工具使用 在大语言模型&#xff08;LLMs&#xff09;蓬勃发展的今天&#xff0c;其在复杂推理和工具使用任务上却常遇瓶颈。本文提出的Step-Wise Reinforcement Learning&#xff08;SWiRL&#xff09;技术&#xff0c;为解决这些难题带…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】7.2 PostgreSQL与Python数据交互(psycopg2库使用)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL与Python数据交互&#xff1a;psycopg2库实战指南一、引言&#xff1a;数据交互的桥梁1.1 psycopg2核心优势 二、环境准备与基础连接2.1 安装配置2.1.1 安装psyco…...

【Prompt工程—文生图】案例大全

目录 一、人物绘图 二、卡通头像 三、风景图 四、logo设计图 五、动物形象图 六、室内设计图 七、动漫风格 八、二次元图 九、日常场景图 十、古风神化图 十一、游戏场景图 十二、电影大片质感 本文主要介绍了12种不同类型的文生图技巧&#xff0c;通过加入不同的图像…...

NVM完全指南:安装、配置与最佳实践

发布于 2025年5月7日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…...

成都养老机器人“上岗”,机器人养老未来已至还是前路漫漫?

近日&#xff0c;成都养老机器人“上岗”引发关注&#xff0c;赛博养老这一概念再次成为人们讨论的焦点&#xff0c;究竟赛博养老未来已来&#xff0c;还是仍需漫长等待&#xff0c;引发诸多思考。 成都研发的养老机器人“上岗”确实标志着智慧养老领域的又一进步&#xff0c;…...

数据中心 第十五次CCF-CSP计算机软件能力认证

总结一下图树算法比如krusal 迪杰斯特拉 prim算法喜欢改变距离定义 或者求别的东西 而拓扑排序喜欢大模拟 本题使用kerusal算法求出最后一条边就可以。 ac代码&#xff1a; #include <iostream> #include <vector> #include <algorithm>using namespac…...

【面试 · 一】vue大集合

目录 vue2 基础属性 组件通信 全局状态管理 vueX 路由 路由守卫 vue3 基础属性 组件通信 全局状态管理 Pinia 路由 路由守卫 vue2、vue3生命周期 setup vue2 基础属性 data&#xff1a;用于定义组件的初始数据&#xff0c;必须是一个函数&#xff0c;返回一个对…...

Java 常用的 ORM框架(对象关系映射)

Java 常用的 ORM&#xff08;对象关系映射&#xff09;框架有以下几种&#xff0c;每种都有其特点和使用场景&#xff1a; Hibernate ● 特点&#xff1a; ○ 完整的 ORM 框架&#xff0c;功能强大。 ○ 支持缓存机制&#xff08;一级缓存、二级缓存&#xff09;。 ○ 支持多种…...