Redis中数据分片与分片策略
概述
数据分片是一种将数据分割并存储在多个节点上的技术,可以有效提高系统的扩展性和性能。在Redis中,数据分片主要用于解决单个实例存储容量和性能瓶颈的问题。通过将数据分散存储到多个Redis节点中,可以将负载均衡到不同的服务器上,提高系统的吞吐量和响应速度。
数据分片的原理与实现方式
数据分片是一种将大规模数据分割并存储在多个节点上的技术,旨在提高系统的容量和性能。在Redis中,数据分片的实现方式和原理主要有两种:客户端分片和服务端分片。
客户端分片
客户端分片是指由客户端应用程序负责将数据分割并分配到不同的Redis节点上。具体步骤如下:
-
分片规则定义: 客户端根据一定的规则将数据进行分片,通常使用哈希函数或范围规则来确定数据应该存储在哪个节点上。
-
分片映射表维护: 客户端维护一个分片映射表,记录每个数据项对应的Redis节点信息,以便于后续的数据读写操作。
-
数据路由: 客户端根据分片规则选择合适的Redis节点进行数据操作,确保数据存储和读取的正确性和一致性。
客户端分片的优点是实现简单、灵活性高,但缺点是需要客户端维护分片映射表,并且可能会出现数据倾斜的情况。
服务端分片
服务端分片是指由Redis集群负责将数据分割并存储在多个节点上,客户端无需关心数据的具体分片情况,只需将请求发送到任意一个Redis节点即可。具体步骤如下:
-
分片规则定义: Redis集群定义了一套分片规则,用于确定数据应该存储在哪个节点上,通常使用哈希函数或一致性哈希算法来实现。
-
数据路由: 客户端将数据请求发送到任意一个Redis节点,集群会根据分片规则将请求路由到正确的节点上进行处理。
-
数据分发: Redis集群负责将数据按照分片规则分发到各个节点上进行存储和管理。
服务端分片的优点是实现简单、透明度高,客户端无需关心数据的具体分片情况,但缺点是集群规模的扩展和缩减可能会引起数据的迁移和重新分片,影响系统的稳定性和性能。
选择分片方式的考虑因素
在选择数据分片的方式时,需要考虑以下因素:
-
系统复杂度: 客户端分片相对较为简单,适用于小规模系统;而服务端分片适用于大规模系统,但实现和维护的复杂度较高。
-
数据一致性: 服务端分片能够保证数据的一致性和完整性,而客户端分片可能会出现数据不一致的情况。
-
扩展性和灵活性: 客户端分片具有较高的灵活性,可以根据业务需求定制分片规则,但集群规模的扩展和缩减可能会受到限制;而服务端分片具有较好的扩展性和灵活性,但受制于集群规模的限制。
根据实际业务需求和系统规模,选择合适的数据分片方式是确保系统高效运行和稳定性的关键。
数据分片策略
数据分片是将大规模数据分割成多个部分,并分布存储在不同的节点上,以提高系统的容量和性能。在Redis中,实现数据分片的策略通常包括以下几种:
哈希分片
哈希分片是将数据的键通过哈希函数计算得到哈希值,然后根据哈希值的范围将数据分配到不同的节点上。常见的哈希函数有MD5、SHA1等,可以将数据均匀地分散到不同的节点上。哈希分片的特点是简单高效,但可能会出现数据倾斜的情况,即部分节点存储的数据量过大,而另一部分节点存储的数据量较小。
一致性哈希分片
一致性哈希分片是一种基于一致性哈希算法的数据分片策略,它将数据的键通过哈希函数计算得到哈希值,并将哈希值映射到一个环形的哈希空间中。每个节点在哈希空间中占据一个区域,数据的键根据其哈希值顺时针寻找下一个节点,直到找到一个节点为止。这样可以保证数据在节点之间均匀分布,且节点的增加和删除对数据的影响较小。
范围分片
范围分片是将数据的键按照一定的范围进行划分,并将不同范围的数据存储到不同的节点上。例如,可以根据数据的键的字母顺序或数字大小来划分范围,然后将相应范围内的数据存储到对应的节点上。范围分片的优点是可以根据业务需求灵活划分数据的范围,但可能会出现数据不均匀分布的情况。
混合分片
混合分片是将多种分片策略结合起来使用,以充分利用各种分片策略的优点,提高数据的均匀分布和系统的容错能力。例如,可以先使用一致性哈希分片将数据分配到不同的虚拟节点上,然后再使用范围分片将虚拟节点分配到不同的物理节点上,以实现数据的均匀分布和节点的负载均衡。
数据分片策略的选择
在选择数据分片策略时,需要考虑以下因素:
-
数据均衡性: 数据分片策略应确保数据在各个节点上均匀分布,避免出现数据倾斜的情况。
-
节点扩缩容: 数据分片策略应具备良好的扩缩容性能,当节点数量发生变化时,能够尽量减少数据迁移的成本。
-
系统复杂度: 数据分片策略应尽量简单易实现,降低系统的复杂度和维护成本。
-
数据一致性: 数据分片策略应保证数据的一致性和完整性,避免数据丢失或损坏的情况。
根据实际业务需求和系统规模,选择合适的数据分片策略是确保系统高效运行和稳定性的关键。
一致性哈希算法
-
首先求出服务器(节点)的哈希值,并将其配置到0~2^32的圆(continuum)上。
-
然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
-
然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到服务器,就会保存到第一台服务器上。
Redis集群分片机制
Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。
Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,每个key通过CRC16校验后对16384取模来决定放置哪个槽(Slot),每一个节点负责维护一部分槽以及槽所映射的键值数据。在Redis Cluster中,只有Master才拥有槽的所有权,如果是某个Master的slave,这个slave只负责槽的使用,但是没有所有权。计算公式:slot = CRC16(key) % 16383。
(1)假设主节点的数量为3,将16384个槽位按照用户自己的规则手动去分配这3个节点,16384除以3,那么每个节点大约得到5460个槽。(用户自定义分配的原因在于有些机器的配置高,有些机器的配置低,配置高的可以分配多一点槽位,配置低的可以分配少一点槽位)
图中定义的规则是平均分配槽位:
-
节点1的槽位区间范围为0-5460,
-
节点2的槽位区间范围为5461-10922
-
节点3的槽位区间范围为10923-16383
(2)存储数据时,对要存储的键进行crc16哈希运算,得到一个值,并取模16384,判断这个值在哪个节点的范围区间。
假设crc16(“test_key”)%16384=3345,
因为3345在区间0-5460之间,
所以test_key数据写入到节点1里面。
(3)查询数据时,对要查询的键进行crc16哈希运算,得到一个值,并取模16384,判断这个值在哪个节点的范围区间。
假设crc16(“test_key”)%16384=3345,
因为3345在区间0-5460之间,
所以test_key数据应该从节点1里面获取。
以上就是redis集群采用的虚拟哈希槽的原理和计算规则说明,是不是没有想象的那么复杂。
这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。使用哈希槽的好处就在于可以方便的添加或移除节点。
-
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了。
-
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就可以了。
相关文章:

Redis中数据分片与分片策略
概述 数据分片是一种将数据分割并存储在多个节点上的技术,可以有效提高系统的扩展性和性能。在Redis中,数据分片主要用于解决单个实例存储容量和性能瓶颈的问题。通过将数据分散存储到多个Redis节点中,可以将负载均衡到不同的服务器上&#…...
leetcode_169. 多数元素
leetcode_169. 多数元素 问题描述 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums …...

STM32 GPIO的工作原理
STM32的GPIO管脚有下面8种可能的配置:(4输入 2 输出 2 复用输出) (1)浮空输入_IN_FLOATING 在上图上,阴影的部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。黄色的高亮部分显示…...

板级调试小助手(2)ZYNQ自定义IP核构建属于自己的DDS外设
一、前言 在上期文章中讲述了小助手的系统结构和原理。在PYNQ的框架开发中,我们一般可以将PL端当做PS端的一个外设,通过读写寄存器的方式来操作外设的功能,就类似于在开发ARM和DSP中操作外设一样,不同时的是,我们可以通…...
vim+cscope+ctags
一、简单安装 1.安装cscope # apt install cscope 2.安装ctags # apt install ctags 3.taglist安装 下载Vim source code browser plugin - Browse /vim-taglist at SourceForge.net,解压和复制文件 # unzip taglist_46.zip# cp doc/taglist.txt /usr/share/…...

Java 8的变革:函数式编程和Lambda表达式探索
文章目录 一、函数接口二、Lambda表达式简介三、Lambda表达式外部参数四、Lambda范例五、Runnable Lambda表达式 一、函数接口 函数接口是一个具有单个抽象方法的接口,接口设计主要是为了支持 Lambda 表达式和方法引用,使得 Java 能更方便地实现函数式编…...
Java集合框架的内部揭秘:List、Set与Map的深潜之旅
Java集合框架是一套强大的工具,为开发者提供了灵活的数据管理方式。本文将深入剖析List、Set和Map的内部机制,通过详细的示例和扩展讨论,带你领略这些数据容器的真谛。 一、List:有序序列的深度剖析 List接口是一个可以包含重复…...

爬虫(二)——爬虫的伪装
前言 本文是爬虫系列的第二篇文章,主要讲解关于爬虫的简单伪装,以及如何爬取B站的视频。建议先看完上一篇文章,再来看这一篇文章。要注意的是,本文介绍的方法只能爬取免费视频,会员视频是无法爬取的哦。 爬虫的伪装 …...

空安全编程的典范:Java 8中的安全应用指南
文章目录 一、Base64 编码解码1.1 基本的编码和解码1.2 URL 和文件名安全的编码解码器1.3 MIME Base64编码和解码 二、Optional类三、Nashorn JavaScript 一、Base64 编码解码 1.1 基本的编码和解码 Base64 编码: 使用 Base64.getEncoder().encodeToString(origin…...
Docker Machine 深入解析
Docker Machine 深入解析 引言 Docker Machine 是 Docker 生态系统中的一个重要工具,它简化了 Docker 容器环境的配置和管理过程。本文将深入探讨 Docker Machine 的概念、功能、使用场景以及如何在实际环境中高效利用它。 什么是 Docker Machine? Docker Machine 是一个…...

20.x86游戏实战-远线程注入的实现
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

06MFC之对话框--重绘元文件
文章目录 实现示例展示需要绘制的窗口/位置控件位置更新下一次示例粗细滑动部分更新重绘元文件(窗口变化内容消失)方法一:使用元文件方法二:兼容设备方法三:使用自定义类存储绘图数据除画笔外功能处理画笔功能处理保存前面画的线及色彩实现示例展示 需要绘制的窗口/位置 …...

鼠标的发明和鼠标“变形记”
注:机翻,未校对。 Who Invented the Computer Mouse? 谁发明了电脑鼠标? It was technology visionary and inventor Douglas Engelbart (January 30, 1925 – July 2, 2013) who revolutionized the way computers worked, turning it fr…...

快捷:通过胶水语言实现工作中测试流程并行、加速
通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景(背景)问题抽象(挑战)如何做(行动)获得了什么(结果)后记相关资源 通过胶水语言实现工…...

MySQL 和 PostgreSQL,我到底选择哪个?
MySQL 和 PostgreSQL 是两个广泛使用的关系型数据库管理系统(RDBMS)。它们都具有强大的功能和广泛的社区支持,但在某些方面存在一些差异。本文将详细比较 MySQL 和 PostgreSQL,包括它们的特点、性能、扩展性、安全性以及适用场景等…...
Java —— 内部类
Java内部类 1.什么是内部类? 将一个类A定义在另一个类B里面,里面的类A就称为内部类(InnerClass),类B则称为外部类(OuterClass)。 2.为什么需要内部类? 具体来说,当一…...

高职院校人工智能人才培养成果导向系统构建、实施要点与评量方法
一、引言 近年来,人工智能技术在全球范围内迅速发展,对各行各业产生了深远的影响。高职院校作为培养高技能人才的重要基地,肩负着培养人工智能领域专业人才的重任。为了适应社会对人工智能人才的需求,高职院校需要构建一套科学、…...
ffmpeg中的超时控制
在FFmpeg库中,很多函数没有直接的参数可以设置超时。 那么有哪些函数可以通过设置 AVFormatContext 的 interrupt_callback 来实现超时控制? avformat_open_input: 打开输入文件或流。这个函数会阻塞,尤其是在网络流的情况下&…...

搜维尔科技:【研究】触觉技术将在5年内以8种方式改变人们的世界
触觉技术在过去几年中发展迅猛,大大提高了反馈的精确度和真实度。其应用产生了真正的影响,数百家公司和企业都集成了触觉技术来增强培训和研究模拟。 虽然触觉技术主要用于 B2B 层面,但触觉技术可能会彻底改变我们的生活,尤其是通…...

项目收获总结--MyBatis的知识收获
MyBatis的知识收获 一、概述二、获取自动生成的(主)键值三、将sql执行结果封装为目标返回对象的方式和原理四、延迟加载实现原理五、批量插入六、自带分页与分页插件原理七、Mapper(Dao)接口与XML映射文件关系八、模糊查询like语句九、#{}和${}的区别十、二级缓存案例实战 一、…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...