Redis中的集群(三)

集群

槽指派

记录节点的槽指派信息。

clusterNode结构的slots属性和numslot属性记录了节点负责处理哪些槽:

struct clusterNode {
// ...
unsigned char slots[16384/8];int numslots;
// ...
}

slots属性是一个二进制位数组(bit array),这个数组的长度位16384/8=2048个字节,共包含16384个二进制位。Redis以0为起始索引,16383为终止索引,对slots数组中的16384个二进制位进行编号,并根据索引i上的二进制位的值来判断节点是否负责处理槽i:

  • 1.如果slots数组在索引i上的二进制位的值位1,那么表示节点负责处理槽i
  • 2.如果slots数组在索引i上的二进制位的值为0,那么表示节点不负责处理槽i

因为取出和设置slots数组中的任意一个二进制位的值的复杂度仅为O(1),所以对于一个给定节点的slots数组来说,程序检查节点是否负责处理某个槽,又或者将某个槽指派给节点负责,这两个动作的复杂度都是O(1).
至于numslots属性则记录节点负责处理的槽的数量,也即是slots数组中值位1的二进制位的数量。比如说,例子中的节点处理的槽数量分别为8、6

例子
  • 举个例子。如图展示了一个slots数组的示例:这个数组索引0至索引7上的二进制位的值都为1,其余所有二进制位的值都为0,这表示节点负责处理槽0至槽7在这里插入图片描述
  • 如图展示了另一个slots数组示例:这个数组索引1、3、5、8、9、10上的二进制位的值都为1,而其余所有二进制位的值都为0,这表示节点负责处理1、3、5、8、9、10在这里插入图片描述

传播节点的槽指派信息

一个节点除了会将自己负责处理的槽记录在clusterNode结构的slots属性和numslots属性之外,他还会将自己的slots数组通过消息发送给集群中的其他节点,以此来告知其他节点自己目前负责处理哪些槽.

例子
  • 举个例子,对于前面展示的7000、7001、7002三个节点的集群来说:
    1.节点7000会通过消息向节点7001和节点7002发送自己的slots数组,以此来告知两个节点,自己负责处理槽0至槽5000,如图所示
    在这里插入图片描述

2.节点7001会通过消息向节点7000和节点7002发送自己的slots数组,以此来告知两个节点,自己负责处理槽5001至槽10000,如图所示
在这里插入图片描述

3.节点7002会通过消息向节点7000和节点7001发送自己的slots数组,以此来告知两个节点,自己负责处理槽10001至槽16383,如图所示
在这里插入图片描述

记录集群所有槽的指派消息

clusterState结构中的slots数组记录了集群中所有16384个槽的指派信息:

typedef struct clusterState{
// ...
clusterNode *slots[16384];
// ...
} clusterState;

slots数组包含16384个项,每个数组项都是一个指向clusterNode结构的指针:

  • 1.如果slots[i]指针指向NULL,那么表示槽i尚未指派给任何节点
  • 2.如果slots[i]指针指向一个clusterNode结构,那么表示槽i已经指派给了clusterNode结构所代表的节点

如果只将指派信息保存在各个节点的clusterNode.slots数组里,会出现一些无法高效地解决的问题,而clusterState.slots数组的存在解决了这些问题:

  • 1.如果节点只使用clusterNode.slots数组来记录槽的指派信息,那么为了知道槽i是否已经被指派,或者槽i被指派给了哪个节点,程序需要遍历clusterState.nodes字典中所有的clusterNode结构,检查这些结构的slots数组,直到找到负责处理槽i的节点为止,这个过程的复杂度为O(N),其中N为clusterState.nodes字典保存的clusterNode结构的数量
  • 2.而通过将所有槽的指派信息保存在clusterState.slots数组里面,程序要检查槽i是否已经被指派,又或者取得负责处理槽i的节点,只需要访问clusterState.slots[i]的值即可,这个操作的复杂度仅为O(1)
例子
  • 举个例子,对于7000、7001、7002三个节点来说,它们的clusterState结构的slots数组将会是如图所示的样子:
    1.数组项slots[0]至slots[5000]的指针都指向7000的clusterNode结构,表示槽0至5000都指派给了节点7000
    2.数组项slots[5001]至slots[10000]的指针都指向代表节点7001的clusterNode结构,表示槽5001至槽10000都指派给了节点7001
    3.数组项slots[10001]至slots[16383]的指针都指向代表节点7002的clusterNode结构,表示槽10001至槽16383都指派给了节点7002
    在这里插入图片描述
  • 举个例子,对于上图中的slots数组来说,如果程序需要直到槽10002被指派给了哪个节点,那么只需要访问数组项slots[10002],就可以马上直到槽10002被指派给了节点7002,如图所示在这里插入图片描述
注意

要说明的一点是,虽然slutserState.slots数组记录了集群中素有槽的指派信息,但使用clusterNode结构的slots数组来记录单个节点的槽指派信息仍然是有必要的:

  • 1.因为当程序需要将某个节点的槽指派信息通过消息发送给其他节点时,程序只需要将相应节点的clusterNode.slots数组整个发送出去就可以了
  • 2.另一方面,如果Redis不使用clusterNode.slots数组,而单独使用clusterNode.slots数组的话,那么每次要将节点A的槽指派信息传播给其他节点时,程序必须先遍历整个clusterState.slots数组,记录节点A负责处理哪些槽,然后才能发送节点A的槽指派信息,这比直接发哦是那个clusterNode.slots数组要麻烦和低效得多。clusterState.slots数组记录了集群中所有槽的指派信息,而clusterNode.slots数组只记录了clusterNode结构所代表的节点的槽指派信息,这时两个slots数组的关键区别所在

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

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

相关文章

由近期 RAGFlow 的火爆看 RAG 的现状与未来

4 月 1 日,InfiniFlow (英飞流)的端到端 RAG 解决方案 RAGFlow 正式开源,首日即获得了 github 千星,目前已接近 3000 star。在这之前,InfiniFlow 还开源了专门用于 RAG 场景的 AI 原生数据库 Infinity&…

gpt科普1 GPT与搜索引擎的对比

GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的自然语言处理模型。它通过大规模的无监督学习来预训练模型,在完成这个阶段后,可以用于各种NLP任务,如文本生成、机器翻译、文本分类等。 以下是关…

Flutter之TabBar篇

总结了一下项目中用到的几种TabBar,针对不同的样式,有采用系统提供的,也有三方插件提供的,也有自定义的,效果如下(后续如果遇到新的样式,会不间断地记录更新,避免重复造轮子…&#…

Day:004(4) | Python爬虫:高效数据抓取的编程技术(数据解析)

XPath工具 浏览器-元素-CtrlF 浏览器-控制台- $x(表达式) Xpath helper (安装包需要科学上网) 问题 使用离线安装包 出现 程序包无效 解决方案 使用修改安装包的后缀名为 rar,解压文件到一个文件夹,再用 加载文件夹的方式安装即可 安装 python若使用…

上门服务小程序|上门服务系统|上门服务软件开发流程

在如今快节奏的生活中,上门服务小程序的需求越来越多。它们向用户提供了方便、高效的服务方式,解决了传统服务行业中的很多痛点。如果你也想开发一个上门服务小程序,以下是开发流程和需要注意的事项。 1、确定需求:在开始开发之前…

ChromeDriver / Selenium-server

一、简介 ChromeDriver 是一个 WebDriver 的实现,专门用于自动化控制 Google Chrome 浏览器。以下是关于 ChromeDriver 的详细说明: 定义与作用: ChromeDriver 是一个独立的服务器程序,作为客户端库与 Google Chrome 浏览…

云安全在金融领域的作用是什么?

云安全在金融领域发挥着至关重要的作用,使金融机构能够保护敏感数据、遵守监管要求并推动创新。通过实施强有力的安全措施、利用先进技术并对新出现的威胁保持警惕,金融机构可以保护其数字资产并维持客户的信任。 金融机构面临的挑战 1.缺乏全网数据支撑…

uniapp小程序下载并导出excel

<button click"confirmExport">导出excel</button>confirmExport() {let header {"X-Access-Token": uni.getStorageSync(ACCESS_TOKEN), //自定义请求头信息} let url "http"/......"; // 后端API地址uni.request({url: ur…

20240309web前端_第三周作业_教务系统页面

作业&#xff1a;教务系统页面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

实战要求下,如何做好资产安全信息管理

文章目录 一、资产安全信息管理的重要性二、资产安全信息管理的痛点三、如何做好资产安全信息管理1、提升资产安全信息自动化、集约化管理能力&#xff0c;做到资产全过程管理2、做好资产的安全风险识别3、做好互联网暴露面的测绘与管空4、做好资产安全信息的动态稽核管理 “摸…

强化学习:基础开发

基本就是把看到有用的资料整合在一起了 资料 https://blog.csdn.net/weixin_48878618/article/details/133590646 https://blog.csdn.net/weixin_42769131/article/details/104783188?ops_request_misc%257B%2522request%255Fid%2522%253A%2522166792845916800182132771%25…

【原创】springboot+vue个人财务记账管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

创建个人百度百科需要什么条件?

互联网时代&#xff0c;创建百度百科词条可以给个人带来更多的曝光和展现&#xff0c;相当于一个镀金的网络名片&#xff0c;人人都想上百度百科&#xff0c;但并不是人人都能创建上去的。 个人百度百科词条的创建需要满足一定的条件&#xff0c;今天伯乐网络传媒就来给大家聊聊…

Vitalik Buterin香港主旨演讲:协议过去10年迅速发展,但存在效率、安全两大问题

2024 香港 Web3 嘉年华期间&#xff0c;以太坊联合创始人 Vitalik Buterin 在由DRK Lab主办的“Web3 学者峰会 2024”上发表主旨演讲《Reaching the Limits of Protocol Design》。 他介绍到&#xff0c;2010年代&#xff0c;基于基本密码学的协议是哈希、签名。随后&#xff…

[当人工智能遇上安全] 13.威胁情报实体识别 (3)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型

《当人工智能遇上安全》系列将详细介绍人工智能与安全相关的论文、实践&#xff0c;并分享各种案例&#xff0c;涉及恶意代码检测、恶意请求识别、入侵检测、对抗样本等等。只想更好地帮助初学者&#xff0c;更加成体系的分享新知识。该系列文章会更加聚焦&#xff0c;更加学术…

目标检测——YOLO系列学习(一)YOLOv1

YOLO可以说是单阶段的目标检测方法的集大成之作&#xff0c;必学的经典论文&#xff0c;从准备面试的角度来学习一下yolo系列。 YOLOv1 1.RCNN系列回顾 RCNN系列&#xff0c;无论哪种算法&#xff0c;核心思路都是Region Proposal&#xff08;定位&#xff09; classifier&am…

【蓝桥杯嵌入式】串口通信与RTC时钟

【蓝桥杯嵌入式】串口通信与RTC时钟 串口通信cubemx配置串口通信程序设计 RTC时钟cubemx配置程序设计 串口通信 cubemx配置 打开串口通信&#xff0c;并配置波特率为9600 打开串口中断 重定义串口接收与发送引脚&#xff0c;默认是PC4&#xff0c;PC5&#xff0c;需要改为P…

UVA12538 Version Controlled IDE 题解 crope

Version Controlled IDE 传送门 题面翻译 维护一种数据结构&#xff0c;资磁三种操作。 1.在p位置插入一个字符串s 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 1 ≤ n ≤ 50000 1 \leq n \leq 50000 1≤n≤50000&#xff0c;所…

Jmeter如何录制https的系统性能脚本

在使用jmeter录制性能测试脚本时&#xff0c;会遇到网站为http和https两种情况&#xff0c;略有不同&#xff0c;下面介绍一下&#xff1a; 1.Jmeter录制http 1.测试计划–>添加–>非测试元件–>HTTP(S)测试脚本记录器 【HTTP(S)测试脚本记录器】有的版本叫【HTTP代…

element UI table合并单元格方法

废话不多讲&#xff0c;直接上代码&#xff0c;希望能帮到需要的朋友 // 合并单元格function spanMethod({ row, column, rowIndex, columnIndex }) {//定义需要合并的列字段&#xff0c;有哪些列需要合并&#xff0c;就自定义添加字段即可const fields [declareRegion] // …