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.mzph.cn/news/740941.shtml

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

相关文章

C# RAM Stable Diffusion 提示词反推 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 C# RAM Stable Diffusion 提示词反推 Onnx Demo 介绍 github地址:GitHub - xinyu1205/recognize-anything: Open-source and strong foundation image recognition models. Open-source and strong foundation ima…

基于Redis实现分布式锁、限流操作(基于SpringBoot)的实现

基于Redis实现分布式锁、限流操作——基于SpringBoot实现 本文总结了一种利用Redis实现分布式锁、限流的较优雅的实现方式本文原理介绍较为通俗,希望能帮到有需要的人本文的demo地址:https://gitee.com/rederxu/lock_distributed.git 一、本文基本实现…

《MySQL数据库》day2--连接查询、子查询、union、limit、DML语句

文章目录 1.把查询结果去除重复记录 -》distinct2.连接查询2.1什么是连接查询?2.2连接查询的分类2.3笛卡尔积现象2.4内连接2.4.1内连接之等值连接。2.4.2内连接之非等值连接2.4.3内连接之自连接 2.5外连接2.6三张表,四张表怎么连接? 3.子查询…

SA3D:基于 NeRF 的三维场景分割方法

Paper: Cen J, Zhou Z, Fang J, et al. Segment anything in 3d with nerfs[J]. Advances in Neural Information Processing Systems, 2024, 36. Introduction: https://jumpat.github.io/SA3D/ Code: https://github.com/Jumpat/SegmentAnythingin3D SA3D 是一种用于 NeRF 表…

Java项目:48 ssm008医院门诊挂号系统+jsp(含文档)

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本选题则旨在通过标签分类管理等方式实现 管理员;个人中心、药房管理、护士管理、医生管理、病人信息管理、科室信息管理、挂号管…

【每日一题】2864. 最大二进制奇数-2024.3.13

题目: 2864. 最大二进制奇数 给你一个 二进制 字符串 s ,其中至少包含一个 1 。 你必须按某种方式 重新排列 字符串中的位,使得到的二进制数字是可以由该组合生成的 最大二进制奇数 。 以字符串形式,表示并返回可以由给定组合…

基于GIS技术的智慧农业大数据平台解决方案

1.建设背景 国务院促进大数据发展纲要 纲要提出大力推动政府信息系统和公共数据互联开放共享,加快政府信息平台整合,推动数据资源整合,提升治理水平。按照“五个统一”建设“大平台“,融合“大数据”,构建“大系统”落…

Leetcode-热题100-持续更新

时间不够,只能背诵哎,没办法,难题不写,简单题和中等题。 def majorityElement(nums):# 使用字典 count 来记录每个元素的出现次数count {}for num in nums:if num in count:count[num] 1else:count[num] 1length len(nums)#…

喜报!聚铭网络实力入选2024年度扬州市网络安全技术支撑服务机构

近日,中共扬州市委网络安全和信息化委员会办公室正式公布了“2024年度扬州市网络安全技术支撑服务机构”名单,聚铭网络凭借其卓越的技术实力与优质的安服能力,在众多竞争者中脱颖而出,光荣上榜! 为了健全扬州市网络安…

zabbix 7.0编译部署教程

zabbix 7.0编译部署教程 2024-03-08 16:50乐维社区 zabbix7.0 alpha版本、beta版本已经陆续发布,Zabbix7.0 LTS版本发布时间也越来越近。据了解,新的版本在性能提升、架构优化等新功能方面有非常亮眼的表现,不少小伙伴对此也已经跃跃欲试。心…

JavaWeb实验 AJAX技术基本应用

实验目的 认识Ajax的作用;能在JSP中应用Ajax与Servlet进行交互。 实验内容 创建一个Java Web应用,综合利用JSP、Ajax和Servlet技术实现中英文互译功能: 在输入框输入英文单词时,在后面即时显示翻译为中文的结果;在输…

下载文件,无法获取header中的Content-Disposition

问题:axios跨域请求时,无法获取header中的Content-Disposition,并且network中已显示Content-Disposition 在使用CORS方式跨域时,浏览器只会返回默认的头部Header 解决: 后端在返回时,需要设置公开的响应…

【项目】C++ 基于多设计模式下的同步异步日志系统

前言 一般而言,业务的服务都是周而复始的运行,当程序出现某些问题时,程序员要能够进行快速的修复,而修复的前提是要能够先定位问题。 因此为了能够更快的定位问题,我们可以在程序运行过程中记录一些日志,通…

选股就用河北源达“财源滚滚”选股软件

在股市投资的道路上,选股无疑是至关重要的一环。然而,面对海量的个股信息和复杂的市场环境,如何科学、准确地选股,成为了投资者必须面对的难题。河北源达信息技术股份有限公司推出的“财源滚滚”选股软件,以其独特的优…

11 vector的实现

注意 实现仿cplus官网的的string类&#xff0c;对部分主要功能实现 实现 文件 #pragma once #include <string> #include <assert.h>namespace myvector {template <class T>class vector{public://iteratortypedef T* iterator;typedef const T* const_…

【AI绘画】AI绘画免费网站推荐

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是指一种模拟人类智能的技术。它是通过计算机系统来模拟人的认知、学习和推理能力&#xff0c;以实现类似于人类智能的行为和决策。人工智能技术包含多个方面&#xff0c;包括机器学习、深度学习、自…

第42期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

【C++11】来感受lambda表达式的魅力~

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

redis题库详解

1 什么是Redis Redis(Remote Dictionary Server) 是一个使用 C 语言编写的&#xff0c;开源的&#xff08;BSD许可&#xff09;高性能非关系型&#xff08;NoSQL&#xff09;的键值对数据库。 Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串&#xff0c;…

《OWASP TOP10漏洞》

0x01 弱口令 产生原因 与个人习惯和安全意识相关&#xff0c;为了避免忘记密码&#xff0c;使用一个非常容易记住 的密码&#xff0c;或者是直接采用系统的默认密码等。 危害 通过弱口令&#xff0c;攻击者可以进入后台修改资料&#xff0c;进入金融系统盗取钱财&#xff0…