当前位置: 首页 > article >正文

【redis】分片方案

Redis分片(Sharding)是解决单机性能瓶颈的核心技术,其本质是将数据分散存储到多个Redis节点(实例)中,每个实例将只是所有键的一个子集,通过水平扩展提升系统容量和性能。

分片的核心价值

  • 性能提升
    存储扩展:突破单机内存限制,支持TB级数据存储。
    计算并行化:多节点同时处理请求,提高吞吐量(如电商大促场景下,分片集群可承载百万级QPS)。

  • 高可用性
    故障隔离:单节点故障仅影响其管理的槽,其他节点正常服务。
    主从复制:每个主节点可配置从节点,主节点宕机时从节点自动接管槽。

  • 资源优化
    冷热数据分离:高频访问数据可分配至SSD节点,低频数据存机械硬盘,降低成本。
    负载均衡:哈希槽机制确保数据均匀分布,避免“热点”问题。

分片的实现方式

按照分片的计算逻辑由谁来执行,可以分为以下几种实现方式:

  1. 客户端分片:由客户端直接计算键的槽编号,并连接对应节点。例如,使用一致性哈希算法或直接取模分配节点。

    • 优点:实现简单,无需中间代理。
    • 缺点:节点变更时需手动调整客户端逻辑,运维复杂度高。
  2. 代理分片:通过中间代理(如Twemproxy)转发请求,客户端不感知节点信息。代理根据分片规则将请求路由到目标节点。

    • 优点:客户端无需关心分片细节。
    • 缺点:代理层可能成为性能瓶颈。
  3. 服务端分片(Redis Cluster):Redis官方集群模式,节点间通过Gossip协议同步槽分配信息。客户端可连接任意节点,若请求的键不属于当前节点,服务端会返回重定向指令。

    • 特点:支持自动故障转移、数据迁移,是生产环境首选方案。

查询路由:可发送你的查询到一个随机实例,该实例会保证转发你的查询到正确节点。

Redis集群在客户端的帮助下,实现了查询路由的一种混合形式,请求不是直接从Redis实例转发到另一个,而是客户端收到重定向到正确的节点。

分片的算法

范围分区

范围分区也叫顺序分区,最简单的分区方式。通过映射对象的范围到指定的Redis实例来完成分片。

假设用户ID的范围为1100,从133进入实例Redis1,3466进入Redis2,67100进入Redis3。

范围分区增加一个节点需要迁移大部分数据:

优点

  • 支持高效的范围查询:同一范围分区内的范围查询不需要跨节点,提升查询速度。
  • 支持批量操作:支持同一范围分区内的批量操作如事务、pipeline、lua脚本等
  • 实现简单直观:分区规则逻辑清晰,开发人员易于理解和维护。

缺点

  • 数据分散度易倾斜:若分区键范围设计不合理,可能导致部分分区数据量过大
  • 分区键选择受限:范围分区要求分区键为数值型或可排序字段(如时间、ID)
  • 维护范围映射表:需额外存储和管理分区范围与节点的映射关系,增加系统复杂性
  • 数据迁移成本:调整分区范围时,需迁移大部分数据

哈希取余分区

哈希取余分区是分布式缓存中常用的数据分片策略,其核心原理是通过哈希函数和取模运算将数据均匀分布到多个节点。

对每个键(Key)使用哈希函数(如CRC16、MD5)计算哈希值,再对Redis节点总数取余,公式为:

目标节点 = hash(key) % 节点数量  

例如,3个节点的集群中,键user:100的哈希值为93024922,则93024922 % 3 = 1,该键会被分配到第2个节点(编号从 0开始)。

添加一个节点:

翻倍扩容

优点

  • 实现简单高效:仅需哈希函数和取模运算即可完成数据分布,适合快速搭建小型分布式系统。
  • 负载均衡:数据均匀分布到所有节点,每个节点处理固定比例的请求,避免单点过载。

缺点:扩容/缩容成本高,节点数量变化时,取模分母改变,导致所有数据需重新计算映射关系并迁移,引发全量数据洗牌。从 3节点扩容至4节点时,hash(key) % 3变为hash(key) % 4,75%的数据需迁移。虽然翻倍扩容可以相对减少迁移量,但是翻倍所需的成本太大。

一致性哈希分区

一致性哈希分区是一种用于分布式系统的数据分片技术,旨在解决节点动态变化时数据迁移开销大的问题。

设计如下:

  1. 设计哈希函数Hash(key),要求取值范围为[0, 2^32-1],将这个取值范围的数字头尾相连,想象成一个闭合环形,各哈希值在Hash环上的分布:时钟12点位置为0,按顺时针方向递增,临近12点的左侧位置为2^32-1。

  2. 将Redis节点映射至哈希环,如图哈希环上的绿球所示,三个节点Redis0、Redis1、Redis2,可以通过其IP地址或机器名,经过同一个Hash函数计算的结果,映射到哈希环上。

  3. 将key映射于哈希环,如图哈希环上的黄球所示,三个keyuser:100user:120user:150经过同一个Hash()计算的结果,映射到哈希环上。

  4. 将key映射至Redis节点,在对象和节点都映射至同一个哈希环之后,要确定某个对象映射至哪个节点,只需从该对象开始,沿着哈希环顺时针方向查找,找到的第一个节点,即是。

增加节点:服务器扩容时增加节点,比如要在Redis1和Redis2之间增加节点Redis3,只会影响欲新增节点Redis3与上一个(顺时针为前进方向)节点Redis1之间的对象,也就是user:300,这些对象的映射关系,按照上面的规则,调整映射至新增的节点Redis3,其他对象的映射关系,都无需调整。

优点

  • 动态扩展友好:增减节点仅影响相邻节点,迁移量减少至约1/N(N为节点数)。

缺点

  • 数据倾斜风险:节点较少时分布不均。
  • 数据丢失风险:欲新增节点与上一个节点之间的数据不可命中,丢失

虚拟一致性哈希分区

对于前面的方案,节点数越少,越容易出现节点在哈希环上的分布不均匀,导致各节点映射的对象数量严重不均衡(数据倾斜);相反,节点数越多越密集,数据在哈希环上的分布就越均匀。

但实际部署的物理节点有限,我们可以用有限的物理节点,虚拟出足够多的虚拟节点(Virtual Node),最终达到数据在哈希环上均匀分布的效果,如下图,实际只部署了3个节点Redis0、Redis1、Redis2,把每个节点都复制成2倍,结果看上去是部署了6个节点。

虚拟一致性哈希分区增加一个节点:

可以想象,当虚拟节点个数达到2^32时,就达到绝对的均匀,通常可取复制倍数为32或更高。

优点

  • 负载均衡优化:虚拟节点分散物理节点压力,减少数据倾斜。
  • 异构节点适配:根据节点性能差异分配不同数量的虚拟节点。

缺点

  • 管理复杂度高:需维护虚拟节点与物理节点的映射关系。
  • 迁移成本上升:节点变动需调整多个虚拟节点,操作复杂。

虚拟槽分区(Redis Cluster方案)

虚拟槽分区(Virtual Slot Partitioning)是Redis Cluster设计的核心分片机制,旨在解决分布式系统中数据分片、负载均衡和高可用性问题。其核心思想是将整个数据空间划分为固定数量的逻辑槽(Slot),通过动态分配槽到物理节点的方式实现数据分布。

虚拟槽分区是对一致性哈希分区进行的改造,虚拟槽中的槽就是大量的虚拟节点的抽象化,将原来的虚拟节点变成一个槽,槽的范围是0~16383,redis内置是有16384个槽也就是有16384个虚拟节点。

虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有数据映射到一个固定范围的整数集合中,这个整数定义为槽(slot),这个范围一般远远大于节点数。

假设当前集群有3个节点,每个节点平均大约负责5461个槽,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot = CRC16(key)& 16383。每一个节点负责维护一部分槽以及槽所映射的键值数据,如下图所示:

slot = CRC16(key)& 16383其实就是slot = CRC16(key)% 16384,一个数跟2^N取模的结果等于它与2^N-1按位与的结果。

在虚拟槽分区中扩展一个节点(扩容)时,需通过槽迁移将部分槽从现有节点转移到新节点,实现数据重新分布和负载均衡。

优点

  • 动态扩缩容平滑:仅迁移受影响槽的数据,迁移量可控(如删除节点时仅重分配其槽)。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了,当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。
  • 解耦数据与节点之间的直接关系:槽作为中间层,支持灵活调整节点与槽的映射关系。一致性hash分片需要映射key和节点的关系, 但是使用hash槽计算方式是CRC16(key) % 槽的个数, 所以就解耦了数据和节点的关系
  • 节点自身维护槽的映射关系, 不需要客户端和代理服务器进行维护处理

缺点

  • 实现复杂:需集群协议维护槽与节点状态,客户端需支持重定向逻辑。
  • 功能限制:跨槽事务、多键操作受限。

相关文章:

【redis】分片方案

Redis分片(Sharding)是解决单机性能瓶颈的核心技术,其本质是将数据分散存储到多个Redis节点(实例)中,每个实例将只是所有键的一个子集,通过水平扩展提升系统容量和性能。 分片的核心价值 性能提…...

springboot+mysql+element-plus+vue完整实现汽车租赁系统

目录 一、项目介绍 二、项目截图 1.项目结构图 三、系统详细介绍 管理后台 1.登陆页 2.管理后台主页 3.汽车地点管理 4.汽车类别 5.汽车品牌 6.汽车信息 7.用户管理 8.举报管理 9.订单管理 10.轮播图管理 11.交互界面 12.图表管理 汽车租赁商城 1.首页 2.汽…...

Linux第四节:进程控制

一、进程创建 1.1 fork函数 1. fork函数有两个返回值问题 返回的本质就是写入!所以,谁先返回,谁就先写入id,因为进程具有独立性,会发生写时拷贝,父进程和子进程各自指向return语句。 2. fork返回后&#x…...

Qt 编译 sqldrivers之psql

编译postgres pgsql驱动 下载驱动源码修改配置文件编译 下载驱动源码 // 源代码下载 https://download.qt.io/archive/qt/5.15/5.15.2/submodules/驱动目录:qtbase-everywhere-src-5.15.2\src\plugins\sqldrivers 修改配置文件 打开pro文件 右键点击添加库 此处的为debu…...

382_C++_在用户会话结束时,检查是否有其他会话仍然来自同一个客户端 IP 地址,没有连接状态设置为断开,否则为连接

之前出现的问题:重启管理机,工作机上面热备连接状态显示未连接 (此时是有一个工作机连接管理机的),所以正常应该是连接状态解决:根因分析: 重启管理机后,管理机给过来的cookie是空的,导致工作机同时存在两个管理机的session,在其中一个超时后,调用回调函数通知会话断开…...

RViz(机器人可视化工具)的配置文件(moveitcpp)

1. Panels(面板设置) 面板是RViz界面中的各个功能区域,用于显示和操作不同的数据。 Displays(显示面板) Class: rviz_common/Displays 指定面板的类型,这里是显示面板。 Help Height: 78 帮助区域的高度…...

Redis中6种缓存更新策略

Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案。然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性。缓存更新策略直接影响系统的性能、可靠性和数据一致性,选择合适的策略至关重要。 本文将介绍Redis中6种缓…...

如何使用极狐GitLab 软件包仓库功能托管 terraform?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Terraform 模块库 (BASIC ALL) 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.1…...

观测云:安全、可信赖的监控观测云服务

引言 近日,“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案,再次引发行业内对数据合规等话题的热议。据了解,仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下,企业在数据隐私保护方面所面临…...

【python】使用Python和BERT进行文本摘要:从数据预处理到模型训练与生成

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息爆炸时代的到来,海量文本数据的高效处理与理解成为亟待解决的问题。文本摘要作为自然语言处理(NLP)中的关键任务,旨在自动生成…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 5.3 相关性分析(PEARSON/SPEARMAN相关系数)5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数( Pearson Corr…...

Redis面试 实战贴 后面持续更新链接

redis是使用C语言写的。 面试问题列表: Redis支持哪些数据类型?各适用于什么场景? Redis为什么采用单线程模型?优势与瓶颈是什么? RDB和AOF持久化的区别?如何选择?混合持久化如何实现&#x…...

小程序滚动条隐藏(uniapp版本)

单独指定页面隐藏&#xff08;找到对应的scroll-view&#xff09; <style> /* 全局隐藏滚动条样式 */ ::-webkit-scrollbar { display: none; width: 0; height: 0; color: transparent; background: transparent; } /* 确保scroll-view组件也隐藏滚动条 */ …...

python基础:序列和索引-->Python的特殊属性

一.序列和索引 1.1 用索引检索字符串中的元素 # 正向递增 shelloworld for i in range (0,len(s)):# i是索引print(i,s[i],end\t\t) print(\n--------------------------) # 反向递减 for i in range (-10,0):print(i,s[i],end\t\t)print(\n--------------------------) print(…...

java反射(2)

package 反射;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays;public class demo {public static void main(String[] args) throws Exception {// 通过类的全限定名获取对应的 Class 对象…...

C++核心概念全解析:从析构函数到运算符重载的深度指南

目录 前言一、构析函数1.1 概念1.2 语法格式 1.3 核心特性1.4 调用时机1.5 构造函数 vs 析构函数1.6 代码示例 二、this关键字2.1 基本概念2.2 核心特性2.3 使用场景2.3.1 区分成员与局部变量2.3.2 返回对象自身&#xff08;链式调用&#xff09;2.3.3 成员函数间传递当前对象2…...

如何巧妙解决 Too many connections 报错?

1. 背景 在日常的 MySQL 运维中&#xff0c;难免会出现参数设置不合理&#xff0c;导致 MySQL 在使用过程中出现各种各样的问题。 今天&#xff0c;我们就来讲解一下 MySQL 运维中一种常见的问题&#xff1a;最大连接数设置不合理&#xff0c;一旦到了业务高峰期就会出现连接…...

自由学习记录(58)

Why you were able to complete the SpringBoot MyBatisPlus task smoothly: Clear logic flow: Database → Entity → Service → Controller → API → JSON response. Errors are explicit, results are verifiable — you know what’s broken and what’s fixed. Sta…...

ES6 知识点整理

一、变量声明&#xff1a;var、let、const 的区别 作用域 var&#xff1a;函数作用域&#xff08;函数内有效&#xff09;。let/const&#xff1a;块级作用域&#xff08;{} 内有效&#xff0c;如 if、for&#xff09;。 变量提升 var 会提升变量到作用域顶部&#xff08;值为…...

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营&#xff1a;从入门到工业级应用》高阶挑战篇-5G通信速成&#xff1a;MATLAB毫米波信道建模仿真指南 &#x1f680;&#x1f4e1; 大家好&#xff01;今天我将带大家进入5G通信的奇妙世界&#xff0c;我们一起探索5G通信中最激动人心的部分之一——毫米波信…...

工程师 - 汽车分类

欧洲和中国按字母对汽车分类&#xff1a; **轴距**&#xff1a;简单来说&#xff0c;就是前轮中心点到后轮中心点之间的距离&#xff0c;也就是前轮轴和后轮轴之间的长度。根据轴距的大小&#xff0c;国际上通常把轿车分为以下几类&#xff08;德国大众汽车习惯用A\B\C\D分类&a…...

57.[前端开发-前端工程化]Day04-webpack插件模式-搭建本地服务器

Webpack常见的插件和模式 1 认识插件Plugin 认识Plugin 2 CleanWebpackPlugin CleanWebpackPlugin 3 HtmlWebpackPlugin HtmlWebpackPlugin 生成index.html分析 自定义HTML模板 自定义模板数据填充 4 DefinePlugin DefinePlugin的介绍 DefinePlugin的使用 5 mode模式配置…...

K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析

一、金丝雀发布概述 1.1 什么是金丝雀发布&#xff1f; 金丝雀发布&#xff08;Canary Release&#xff09;是一种渐进式部署策略&#xff0c;通过逐步将生产流量从旧版本迁移至新版本&#xff0c;结合实时指标验证&#xff0c;在最小化风险的前提下完成版本迭代。其核心逻辑…...

Qt中数据结构使用自定义类————附带详细示例

文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较&#xff…...

数据可视化与分析

数据可视化的目的是为了数据分析&#xff0c;而非仅仅是数据的图形化展示。 项目介绍 项目案例为电商双11美妆数据分析&#xff0c;分析品牌销售量、性价比等。 数据集包括更新日期、ID、title、品牌名、克数容量、价格、销售数量、评论数量、店名等信息。 1、数据初步了解…...

基于大模型预测的产钳助产分娩全方位研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 二、产钳助产分娩概述 2.1 产钳助产定义与历史 2.2 适用情况与临床意义 三、大模型预测原理与数据基础 3.1 大模型技术原理 3.2 数据收集与处理 3.3 模型训练与验证 四、术前预测与准备 4.1 大模型术前风险预…...

通过混合机器学习和 TOPSIS 实现智能手机身份验证的稳健行为生物识别框架

1. 简介 随着日常工作、个人生活和金融操作对智能手机的依赖性不断增强,对弹性安全身份验证系统的需求也日益增长。尽管 PIN 码、密码和静态生物识别等传统身份验证方法仍可为系统提供一定的安全级别,但事实证明,它们容易受到多种威胁,包括敏感数据泄露、网络钓鱼、盗窃和…...

旅游设备生产企业的痛点 质检系统在旅游设备生产企业的应用

在旅游设备制造行业&#xff0c;产品质量直接关系到用户体验与企业口碑。从景区缆车、观光车到水上娱乐设施&#xff0c;每一件设备的安全性与可靠性都需经过严苛检测。然而&#xff0c;传统质检模式常面临数据分散、流程不透明、合规风险高等痛点&#xff0c;难以满足旅游设备…...

使用ESPHome烧录固件到ESP32-C3并接入HomeAssistant

文章目录 一、安装ESPHome二、配置ESP32-C3控制灯1.主配置文件esp32c3-luat.yaml2.基础通用配置base.yaml3.密码文件secret.yaml4.围栏灯four_light.yaml5.彩灯rgb_light.yaml6.左右柱灯left_right_light.yaml 三、安装固件四、HomeAssistant配置ESPHome1.直接访问2.配置ESPHom…...

【漫话机器学习系列】237. TSS总平方和

深度理解 TSS&#xff08;总平方和&#xff09;&#xff1a;公式、意义与应用 在机器学习与统计建模领域&#xff0c;评价模型好坏的重要指标之一就是方差与误差分析。其中&#xff0c;TSS&#xff08;Total Sum of Squares&#xff0c;总平方和&#xff09;扮演着非常关键的角…...