10、Redis分布式系统之数据分区算法



Redis分布式系统之数据分区算法

1、什么是Redis分布式系统

​ Redis分布式系统,官方称为Redis Cluster, Redis集群(这个集群和前面的主从复制集群不同,这个集群可以理解为是多个主从复制集群所组成的集群),其实是Redis3.0开始推出得分布式解决方案。可以很好地解决不同Redis节点存放不同数据,并将用户亲求方便地路由到不同Redis得问题。(下面讲到的节点本质都是在Redis分布式系统中的一个主从复制集群)

2、数据分区算法

​ 分布式数据库系统会根据不同得数据分区算法,将数据分散储存到不同得数据库服务器节点上,每个节点管理着整个数据集合中得一个子集。
​ 常见得的数据分区规则有俩大类:顺序分区哈希分区

2.1、顺序分区

​ 顺序分区规则可以将数据根据某种顺序平均分配到不同的节点。不同的顺序方式,产生了不同的分区算法。例如,轮询分区算法、时间片论转分区算法、数据块分区算法、业务主题分区算法等等。由于这些算法都比较简单,就不具体介绍了,可以自己百度去了解了解。

2.1.1、轮询分区算法

​ **每产生一个数据,就依次分配到不同的节点。**该算法适合于数据问题不确定的场景。分配结果是,在数据量非常庞大的情况下,**每个节点中的数据是很平均的。**但是数据生产者与数据节点是要一直保持连接的(也就是说,每个数据节点都一直与外界数据生产者保持着连接)。

2.1.2、时间片轮转分区算法

​ **在某个固定长度的时间片内,产生的数据都会很配到一个节点上。**时间片结束,再产生的数据就会被分配到下一个节点。这些节点会被依次轮转分配数据。该算法可能会出现节点数据分配不平均的情况(这个很好理解,因为每个时间片内产生的数可能是不同的)。但是,它有一个明显的优点就是数据生产者与节点间的连接只需要占用当前正在使用的这个,其它连接在使用完毕之后就立即被释放掉了。(也就是说,无论何时,整个Redis分布式系统只有任意一个节点被数据生产者连接)

2.1.3、数据块分区算法

​ 在整体数据总量确定的情况下,根据各个节点的储存能力,可以将连接的某一整块数据分配的某一个节点。

2.1.4、业务主题分区算法

​ 数据可以根据不同的业务主题,分配到不同的节点。

2.2、哈希分区

​ 哈希分区的规则是充分利用数据的哈希值来完成分配,对数据哈希值的不同使用方式产生了不同的哈希分区算法。哈希分区算法相对较复杂,这里详细介绍几种常见的哈希分区算法。

2.2.1、节点取模分区算法

​ 该算法的前提是,每个节点都已经分配好了一个唯一的序号,对于N个节点的分布式系统,其序号范围为【0,N-1】。然后选取数据本身或可以代表数据特征的数据的一部分作为key,计算hash(key)与节点数量N的模,该计算结果即为该数据的存储节点的序号。

​ 该算法最大的优点是简单,但是也存在比较严重的问题。如果分布式系统扩容或者缩容,已经存储过的数据需要根据新的节点数量N进行数据迁移,否则用户根据key无法找到原来的数据。生产中扩容一般采用翻倍扩容方式,以减少扩容时数据迁移的比例。

2.2.2、一致性哈希分区算法

​ 一致性hash算法通过一个叫做一致性hash环的数据结构实现。这个环的起点是0,终点是2的32次方 - 1, 并起点与终点重合。环中间的整数按逆序/顺时针分布,所以这个环的整数分布范围是【0,2的32次方 - 1】。

2.2.3、模拟槽分区算法

​ 该算法首先虚拟出一个固定数量的整数集合,该集合中的每个整数称为一个 slot 槽。这个槽的数量一般是远远大于节点数量的。然后再将所有 slot 槽平均映射到各个节点之上。例如,Redis 分布式系统中共虚拟了 16384 个 slot 槽,其范围为[0, 16383]。假设共有 3 个节点,那么 slot 槽与节点间的映射关系如下图所示:
在这里插入图片描述

​ 数据只与 slot 槽有关系,与节点没有直接关系。数据只通过其 key 的 hash(key)映射到slot 槽:slot = hash(key) % slotNums。这也是该算法的一个优点,解耦了数据与节点,客户端无需维护节点,只需维护与 slot 槽的关系即可。Redis 数据分区采用的就是该算法。其计算槽点的公式为:slot = CRC16(key) % 16384。CRC16()是一种带有校验功能的、具有良好分散功能的、特殊的 hash 算法函数。

​ 其实 Redis中计算槽点的公式不是上面的那个,而是:slot = CRC16(key) &16383。

​ 若要计算 a % b,如果 b 是 2 的整数次幂,那么 a % b = a & (b-1)。

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

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

相关文章

js手写实现迭代器生成器函数包括【ES5】和【ES6】

/*** JS原生的集合类型数据结构,只有Array(数组)和Object(对象);而ES6中,又新增了Map和Set。* 四种数据结构各自有着自己特别的内部实现,但我们仍期待以同样的一套规则去遍历它们&am…

垃圾清理软件大全免费 磁盘空间不足?注册表不敢乱动怎么办?ccleaner官方下载

在日常的工作中,面对重要文件时往往都会备份一份;在下载文件时,有时也会不小心把一份文件下载好多次。这些情况会导致电脑中出现重复的文件,删除这些重复文件,可以节省电脑空间,帮助提高电脑运行速度。那么…

【C语言】人生重开模拟器

前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…

openAI key 与ChatGPTPlus的关系,如何升级ChatGPTPLus

一、前言 先详细介绍一下Plus会员和Open API之间的区别: 实际上,这两者是相互独立的。举例来说,虽然您开通了Plus会员,并不意味着您就可以使用4.0版本的API。尽管这两个账户可以是同一个,但它们是完全独立的平台。 …

C++的一些基础语法

前言: 本篇将结束c的一些基础的语法,方便在以后的博客中出现,后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍;其次,我们需要知道c是建立在c的基础上的,所以c的大部分语法都能用在c上。 目…

Matplotlib中的子图:规划绘图的指南和工具

导 读 我最近从事一个项目,需要在 matplotlib 中进行一些微调的子图和叠加。虽然我对制作基本的可视化感到很舒服,但我很快发现我对子图系统的理解没有达到标准。于是回到基础知识,并花了一些时间阅读文档并在 Stack Overflow 上搜索相关示例…

uniapp—day02

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:给自己一个梦想,给世界一个惊喜。 🎅**学习目标: 坚持每一次的学习打卡 文章目录 WXML 和HTML区…

C语言——简易版扫雷

目录 前言 ​编辑 游戏规则 游戏结构的分析 游戏的设计 使用多文件的好处有以下几点: 游戏代码实现 框架(test.c) game函数(test.c) InitBoard初始化(game.c) Print打印棋盘(g…

掘根宝典之C++迭代器简介

在C中,容器是一种用于存储和管理数据的数据结构。C标准库提供了多种容器,每种容器都有其独特的特点和适用场景。 我们知道啊,我们可以通过下标运算符来对容器内的元素进行访问,但是只有少数几种容器才同时支持下标运算符&#xf…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要:在零售行业的技术进步中,开发商品识别系统扮演着关键角色。本博文详细阐述了如何利用深度学习技术搭建一个高效的商品识别系统,并分享了一套完整的代码实现。系统采用了性能强劲的YOLOv8算法,同时对YOLOv7、YOLOv6、YOLOv5等…

Linux操作系统与Windows文件互传(FTP)

一、开启Ubuntu下的FTP服务 打开Ubuntu的终端窗口,然后执行如下命令来安装 FTP服务。 sudo apt-get install vsftpd等待软件安装完成后,用输入以下命令打开vsftpd.conf文件 sudo vim /etc/vsftpd.conf 找到下图的两个使能语句改成如图即可(记住保存后再…

Beans模块之工厂模块BeanFactoryAware

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

专题二 - 滑动窗口 - leetcode 904. 水果成篮 | 中等难度

leetcode 904. 水果成篮 leetcode 904. 水果成篮 | 中等难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 904. 水果成篮 | 中等难度 1. 题目详情 你正在探访一家农场,农场从左到右种植…

比特币普通地址、隔离见证(兼容)、隔离见证(原生)、Taproot 地址傻傻分不清楚

我们在使用比特币钱包的时候,可以看到各种地址类型:普通地址、隔离见证(兼容)、隔离见证(原生)、Taproot 地址。 看得我们一脸懵逼,为什么会有这么多种类型的地址? 它们之间都有什么…

C语言 指针(4) qsort函数

目录 前言 一、回调函数 二、qsort函数 2.1 使用qsort函数排序整型数据 2.2 使用qsort排序结构数据 三、qsort函数的模拟实现 总结 前言 今天我们主要来学习一下C语言中的qsort排序函数。 一、回调函数 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&a…

spring启动时如何自定义日志实现

一、现象 最近在编写传统的springmvc项目时,遇到了一个问题:虽然在项目的web.xml中指定了log4j的日志启动监听器Log4jServletContextListener,且开启了日志写入文件,但是日志文件中只记录业务代码中我们声明了日志记录器的日志&a…

力扣98、530、501-java刷题笔记

一、98. 验证二叉搜索树 - 力扣(LeetCode) 1.1题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点…

[leetcode~dfs]1261. 在受污染的二叉树中查找元素

给出一个满足下述规则的二叉树: root.val 0 如果 treeNode.val x 且 treeNode.left ! null,那么 treeNode.left.val 2 * x 1 如果 treeNode.val x 且 treeNode.right ! null,那么 treeNode.right.val 2 * x 2 现在这个二叉树受到「污…

C#四部曲(知识补充)

Unity跨平台原理 .Net相关 只要编写的时候遵循.NET的这些规则,就能在.NET平台下通用 各种源码→根据.NET规范编写→(虚拟机)生成CIL中间码(保存在程序集中)→转成操作系统原代码 跨语言← 跨平台↓ Unity跨平台原理(Mono) c#脚本→MonoC#编…

MySQL 事务的原理以及长事务的预防和处置

transaction_isolation 隔离级别 读未提交 读提交 视图是在每个 SQL 语句开始执行的时候创建的 可重复读 视图是在事务启动时创建的,整个事务存在期间都用这个视图 串行化…