Redis设计与实现第17章 -- 集群 总结2(执行命令 重新分片)
17.3 在集群中执行命令
接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己:
-
如果是的话,直接执行这个命令
-
否则,节点向客户端返回一个MOVED错误,指引客户端转向redirect至正确的节点,并再次发送之前想要执行的命令
17.3.1 计算键属于哪个槽
节点使用CRC16(key&16383)来计算键key属于哪个槽,其中CRC16语句用于计算键key的CRC-16校验和,而&16383语句则用于计算出一个介于0~16383之间的整数作为键key的槽号
使用CLUSTER KEYSLOT <key>可以查看一个给定键属于哪个槽
17.3.2 判断槽是否由当前节点负责处理
当节点计算出键所属的槽i之后,节点就会检查自己在clusterState.slots数组的项i,判断键所在的槽是否由自己负责:
-
如果
clusterState.slots[i] = clusterState.myself,说明槽i由当前节点负责 -
否则,节点会根据
clusterState.slots[i]指向的clusterNode结构所记录的节点IP和端口号,向客户端返回MOVED错误,指引客户端转向正确节点。
17.3.3 MOVED错误
MOVED错误的格式为MOVED <slot> <ip>:<port>,其中slot为键所在的槽,而ip/port则是负责处理槽slot的节点的IP地址和端口号。客户端会根据MOVED错误中提供的IP地址和端口号,转向至负责处理槽slot的节点,并向该节点重新发送之前想要执行的命令
一个集群客户端通常会与集群的多个节点创建套接字连接,而所谓的节点转向实际上是换一个套接字来发送命令。如果客户端未与想要转向的节点创建套接字连接,客户端会先根据MOVED错误提供的IP地址和端口号来连接节点,然后再进行转向。
要注意,集群模式的客户端收到MOVED错误后,是根据MOVED错误自动进行节点转向的,并打印出转向信息。但是如果是单机stand alone模式的客户端,MOVED错误就会被客户端打印出来。
17.3.4 节点数据库的实现
节点只能使用0号数据库,而且除了将键值对保存在数据库里面之外,还会用clusterState结构里的slots_to_keys跳跃表来保存槽和键之间的关系,跳跃表里每个节点的分值score都是一个槽号,而每个节点的成员member都是一个数据库键
通过跳跃表,节点可以很方便的对属于某个或某些槽的所有数据库键进行批量操作,例如CLUSTER GETKEYSINSLOT <slot> <count>命令可以返回最多count个属于槽slot的数据库键,就是通过遍历跳跃表实现的
17.4 重新分片
Redis集群的重新分片操作可以将任意数量已经指派给某个节点(源节点)的槽改为指派给另一个节点(目标节点),并且相关槽所属的键值对也会从源节点被移动到目标节点。
重新分片操作可以在线进行,而且源节点和目标节点都可以继续处理命令请求。
是由Redis的集群管理软件redis-trib负责执行的,Redis提供了进行重新分片所需的所有命令,redis-trib则通过向源节点和目标节点发送命令来进行重新分片操作,具体步骤如下:
-
对目标节点发送
CLUSTER SETSLOT <slot> IMPORTING <source_id>命令,让目标节点准备好从源节点导入import属于槽slot的键值对 -
对源节点发送
CLUSTER SETSLOT <slot> MIGRATE <target_id>命令,让源节点准备好将属于槽slot的键值对迁移migrate到目标节点 -
向源节点发送
CLUSTER GETKEYSINSLOT <slot> <count>命令,获得最多count个属于槽slot的键值对的键名key name -
对于步骤3获得的每个键名,redis-trib都向源节点发送一个
MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>命令,将被选中的键原子性地从源节点迁移到目标节点 -
重复执行步骤3和4,直到源节点保存的所有属于槽slot的键值对都被迁移到目标节点。
-
redis-trib向集群的任意一个节点发送
CLUSTER SETSLOT <slot> NODE <target>命令,将槽slot指派给目标节点,会通过消息发送到整个集群
相关文章:
Redis设计与实现第17章 -- 集群 总结2(执行命令 重新分片)
17.3 在集群中执行命令 接收命令的节点会计算出命令要处理的数据库键属于哪个槽,并检查这个槽是否指派给了自己: 如果是的话,直接执行这个命令 否则,节点向客户端返回一个MOVED错误,指引客户端转向redirect至正确的节…...
微服务搭建----springboot接入Nacos2.x
springboot接入Nacos2.x nacos之前用的版本是1.0的,现在重新搭建一个2.0版本的,学如逆水行舟,不进则退,废话不多说,开搞 1、 nacos2.x搭建 1,首先第一步查询下项目之间的版本对照,不然后期会…...
3.建立本地仓库及常用命令
1.建立本地仓库 要使用Git对我们的代码进行版本控制,首先需要获得本地仓库 1)在电脑的任意位置创建一个空目录,作为我们的本地Git仓库 2)进入这个目录,右键点击Git Bash 窗口 3)执行命令git init 4) 如果创…...
linux arm下获取屏幕事件(rk3588)
1、找到屏幕设备名称 cat /proc/bus/input/devices我的屏幕设备是ILITEK ILITEK-TP,它的设备名称是event1. 2、读取屏幕事件。 方法1: cat /dev/input/event1 | hexdump方法2: 3、c代码实现 #include <stdio.h> #include <unis…...
【机器学习】人工智能与气候变化:利用深度学习与机器学习算法预测和缓解环境影响
📝个人主页:哈__ 期待您的关注 目录 🔥引言 1.1 背景介绍 1.2 人工智能与机器学习的崛起 1.3 本文内容概述 🔨气候变化的挑战 2.1 现今气候变化带来的影响和挑战 2.2 引发关注的气候变化趋势和数据 🤖人工智能…...
物联网射频识别和RFID开发(二):RFID原理及硬件组成
一、RFID无线识别的原理 (一)读写器与标签之间的无线电波交互方式 1、电感耦合 2、电磁反向散射耦合 (二)标签是如何将数据反馈给读写器的 1、电感耦合中的负载调试 2、电磁反向散射耦合中的负载调制 二、RFID无线通信中的调制…...
LeetCode763. 划分字母区间(2024冬季每日一题 23)
给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 示例 1&a…...
python调用GPT-4o实时音频 Azure OpenAI GPT-4o Audio and /realtime
发现这块网上信息很少,记录一下 微软azure入口 https://learn.microsoft.com/zh-cn/azure/ai-services/openai/realtime-audio-quickstart?pivotsprogramming-language-ai-studio sdk文档 https://github.com/azure-samples/aoai-realtime-audio-sdk?tabread…...
Hadoop生态圈框架部署 伪集群版(四)- Zookeeper单机部署
文章目录 前言一、Zookeeper单机部署(手动部署)1. 下载Zookeeper安装包到Linux2. 解压zookeeper安装包3. 配置zookeeper配置文件4. 配置Zookeeper系统环境变量5. 启动Zookeeper6. 停止Zookeeper在这里插入图片描述 注意 前言 本文将详细介绍Zookeeper的…...
LuaJava
一、什么是LuaJava LuaJava是一个Java脚本工具。该工具的目标是允许用Lua编写的脚本操纵用 Java开发的组件。LuaJava允许使用与访问Lua的本机对象相同的语法从Lua访问Java组件,而不需要任何声明或任何类型的预处理。 LuaJava还允许在Lua中实现任何Java接口&#x…...
Maven下载安装、环境配置(超详细)(包括Java环境配置(Windows)、在IDEA中配置Maven)
目录 一、引言 二、下载和安装 Maven (1)首先保证 Java 的环境是正常的。 1、电脑桌面上右击 " 此电脑 ",点击属性。 2、点击高级系统设置。 3、点击环境变量。 4、找到系统变量中的 Path。 5、点击新建,然后把想要配置…...
Python中的实例方法、静态方法和类方法三者区别?
1、实例方法 不用classmethod和staticmethod修饰的方法为实例方法。在类中定义的方法默认都是实例方法。实例方法最大的特点是它至少要包含一个self参数,用于绑定调用此方法的实例对象,实例方法通常可以用类对象直接调用。 2、类方法 采用classmethod…...
【学习Go编程】
了解Go语言的基本概念: 学习Go的基本语法、数据类型、控制结构等。可以参考官方文档或基础教程来入门。 安装Go环境: 访问Go语言的官方网站,下载并安装适合你操作系统的Go编程环境。配置好环境变量,确保可以在命令行中使用go命令…...
Linux系统:网络
目录 一、网络协议 1.网络协议概念 2.协议分层 3.OSI七层模型和TCP/IP五层(或四层)模型 4.为什么要有网络协议? 5.网络通信协议的原理 二、网络传输的基本流程 1.局域网的网络传输流程 1.MAC地址 2.局域网通信原理(以太网…...
shodan2-批量查找CVE-2019-0708漏洞
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
面向对象(二)——类和对象(上)
1 类的定义 做了关于对象的很多介绍,终于进入代码编写阶段。 本节中重点介绍类和对象的基本定义,属性和方法的基本使用方式。 【示例】类的定义方式 // 每一个源文件必须有且只有一个public class,并且类名和文件名保持一致! …...
Redis3——线程模型与数据结构
Redis3——线程模型与数据结构 本文讲述了redis的单线程模型和IO多线程工作原理,以及几个主要数据结构的实现。 1. Redis的单线程模型 redis6.0之前,一个redis进程只有一个io线程,通过reactor模式可以连接大量客户端;redis6.0为了…...
linux 获取公网流量 tcpdump + python + C++
前言 需求为,统计linux上得上下行公网流量,常规得命令如iftop 、sar、ifstat、nload等只能获取流量得大小,不能区分公私网,所以需要通过抓取网络包并排除私网段才能拿到公网流量。下面提供了一些有效得解决思路,提供了…...
C++知识整理day3类与对象(下)——赋值运算符重载、取地址重载、列表初始化、友元、匿名对象、static
文章目录 1.赋值运算符重载1.1 运算符重载1.2 赋值运算符重载 2.取地址重载2.1 const成员函数2.2 取地址运算符重载 3.类与对象的补充3.1 再探构造函数---初始化列表3.2 类型转换3.3 static成员3.4 友元3.5 内部类3.6 匿名对象3.7 对象拷贝时的编译器优化 1.赋值运算符重载 赋…...
pytest(二)excel数据驱动
一、excel数据驱动 excel文件内容 excel数据驱动使用方法 import openpyxl import pytestdef get_excel():excel_obj openpyxl.load_workbook("../pytest结合数据驱动-excel/data.xlsx")sheet_obj excel_obj["Sheet1"]values sheet_obj.valuescase_li…...
FlashAttention 为什么对序列长度这么“敏感”?
FlashAttention 为什么对序列长度这么“敏感”? 很多朋友在昇腾 NPU 上测 FlashAttention 性能时,都会遇到一个让人挠头的现象:为什么 seq_len512 时,FlashAttention 比标准 Attention 还慢?非要等到 seq_len2048 才开…...
5分钟掌握跨平台音乐格式转换:Unlock-Music浏览器端音频解密终极指南
5分钟掌握跨平台音乐格式转换:Unlock-Music浏览器端音频解密终极指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项…...
如何高效解决Windows游戏控制器兼容性问题:ViGEmBus驱动完整指南
如何高效解决Windows游戏控制器兼容性问题:ViGEmBus驱动完整指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款专业的Windows内…...
深度神经网络非线性行为的分段几何诊断法
1. 这不是又一篇“调库跑通”的深度学习教程——它直指模型失效的根源你有没有遇到过这样的情况:数据质量没问题,网络结构参考了SOTA论文,超参也做了网格搜索,但模型在验证集上就是卡在某个精度上再也上不去?损失曲线看…...
LangChain Memory 完全指南:InMemorySaver、SQLite、Redis Stack 实战与避坑
LangChain Memory 完全指南:从内存到 Redis,让你的 AI 真正"记住"对话 📋 文章概览 解决什么问题: AI 对话没记忆?每次重启服务就失忆? 为什么值得读: 从踩坑到源码,3 种方…...
Richard Socher创业公司获6.5亿美元融资,欲让AI自动化研发引领底层范式转移
Richard Socher创业公司获巨额融资一家创业公司获得了GV(Alphabet旗下VC)和Greycroft共同领投的6.5亿美元早期融资,NVIDIA和AMD也参与本轮融资,它的估值达到了46.5亿美元。这家公司的创始人是Richard Socher,他是AI领域…...
ABAQUS结果导出太麻烦?试试这个隐藏技巧,5分钟搞定截面节点应力数据到Excel
ABAQUS结果导出效率革命:5分钟精准捕获截面节点数据的全流程指南 在结构仿真分析领域,数据后处理往往消耗工程师40%以上的工作时间。当我第一次面对ABAQUS中复杂的应力云图,试图提取某个螺栓连接面的节点应力数据时,整整浪费了两天…...
从BJT到CMOS:运放偏置电流的前世今生,以及它对高阻抗传感器电路设计的实际影响
从BJT到CMOS:运放偏置电流的前世今生,以及它对高阻抗传感器电路设计的实际影响 在精密测量领域,运算放大器的偏置电流就像一位隐形的"电流小偷",悄无声息地影响着测量精度。想象一下,当你试图测量一个微弱的…...
深度学习 标注 训练一体化解决方案 | 深度学习AI平台
标注 & 训练一体化解决方案 | 深度学习AI平台|自研【核心功能】1、训练任务:支持目标检测、语义分割、图像分类、旋转目标、实例分割五类任务 2、可视化训练 一键开启模型训练实时查看训练进度和效果过漏检数据自动保存实时查看模型在测试图像上的可…...
WarcraftHelper终极教程:5分钟搞定魔兽争霸3现代化优化
WarcraftHelper终极教程:5分钟搞定魔兽争霸3现代化优化 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》这款经典游戏在…...
