大厂面试官问我:Redis为什么使用哈希槽的方式进行数据分片?为什么不适用一致性哈希的方式?【后端八股文十三:Redis 集群哈希八股文合集(1)】

  本文为【Redis 集群哈希 八股文合集(1)】初版,后续还会进行优化更新,欢迎大家关注交流~

hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
19d95742d45b4220ad0ae0359ffcba93.png

💥个人主页:绝命Coding-CSDN博客
💥 所属专栏:后端技术分享
这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖

    往期内容(篇幅过多,不一一列出,感兴趣的小伙伴可以查看专栏):

大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】-CSDN博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】-CSDN博客

redis做集群时如何高效快速找到对应的节点 / Redis Cluster 如何分配命令在哪个节点上执行

哈希槽

原因:

  1. 简单高效:哈希槽是一个 0-16383 的整数范围,通过对 key 进行 CRC16 计算后对 16384 取模就可以确定该 key 属于哪个槽。这种方式计算简单高效,且容易管理和维护。
  2. 负载均衡:Redis 集群会尽量将 16384 个槽均匀地分配到各个节点上,从而达到良好的负载均衡效果。当集群节点数发生变化时,只需要在节点间进行槽的迁移,不需要重新计算每个 key 的路由。
  3. 扩展性:当集群需要扩展时,可以将部分槽迁移到新加入的节点上,无需对所有 key 进行rehash。这种方式可以平滑地扩展集群规模。

Redis为什么使用哈希槽的方式进行数据分片?为什么不适用一致性哈希的方式?/ redis的hash slot算法,与哈希环算法区别

Redis 选择使用哈希槽(hash slot)是因为它更加简单高效:

  • 哈希槽是一个 0-16383 的整数范围,通过对 key 进行 CRC16 计算后对 16384 取模就可以确定该 key 属于哪个槽。这种方式计算简单高效。
  • 相比之下,一致性哈希需要维护复杂的哈希环拓扑,扩展时需要重新计算所有 key 的路由,不够灵活。
  • 哈希槽可以将 16384 个槽均匀地分配到各个节点上,从而达到良好的负载均衡效果。当集群节点数发生变化时,只需要在节点间进行槽的迁移,不需要重新计算每个 key 的路由。

了解redis的哈希环吗?如何做到哈希一致性?

哈希环(Consistent Hashing):
Redis使用哈希环(Consistent Hashing)算法来实现哈希一致性。这个算法的核心思想是:

  • 将所有的节点和key都映射到同一个哈希空间(如0-2^32-1)的圆环上。
  • 增加或删除节点时,只影响相邻的节点,其他节点基本不受影响。
  • 这样可以很好地解决增加/删除节点时数据迁移的问题,提高了系统的伸缩性。

什么是哈希环

如上图

  1. 我们有一个虚拟的哈希环,将节点 (Node 1、Node 2、Node 3) 和数据项 (Key 1) 都映射到这个环上。
  2. 当我们需要存储一个数据项时,我们会根据该数据项的 hash 值将其定位到哈希环上的某个位置,并将其存储到顺时针方向第一个遇到的节点上
  3. 比如 Key 1 被定位到 Node3 上
  4. 当我们新增或删除节点时,只需要调整少量数据项的存储位置,而不需要大规模的数据迁移。
  5. 比如如果我们新增了 Node 4,那么 Key 3 可能会被重新分配到 Node 4 上,但其他 Key 的存储位置不会受到影响。

具体新增:

比如:

  1. 有三个节点:

    • Node 1 位于左上方,占据了大约1/4的环空间。
    • Node 2 位于右上方,占据了大约1/4的环空间。
    • Node 3 位于中心,占据了剩余的1/2环空间。
  2. 有两个数据项:

    • Key 1 位于左上方,接近Node 1。
    • Key 2 位于右下方,接近Node 2。

  1. 有两个节点 Node 1 和 Node 2,分别存储了 Key 1 和 Key 2。(根据一致性哈希算法:Key 1 被存储在顺时针方向第一个遇到的节点Node 1上,key 2 被存储在顺时针方向第一个遇到的节点Node 2上)
  2. 现在我们新增了一个节点 Node 3。
  3. 为了将 Node 3 加入到哈希环中,我们需要重新计算哈希环上的数据分布。
  4. 按照一致性哈希算法的规则,Key 1 仍然存储在 Node 1 上,因为它距离 Node 1 最近。
  5. 但 Key 2 原本存储在 Node 2 上,现在需要被重新分配。根据一致性哈希算法,Key 2 应该被存储在顺时针方向第一个遇到的节点 Node 3 上。
  6. 所以经过这次节点变更,只有 Key 2 需要被迁移到新的节点 Node 3 上,而 Key 1 的存储位置保持不变。这就大大减少了数据重分布的开销。

Redis 哈希槽的概念?

Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念, Redis 集群有16384 个哈希槽,每个key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。

哈希槽是如何映射到 Redis 实例上的?/ 哈希槽在redis中是如何存储的

节点取余分区。使用特定的数据,如Redis的键或用户ID,对节点数量N取余:hash(key)%N计算出哈希值,用来决定数据映射到哪一个节点上。

虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。**Redis Cluser采用虚拟槽分区算法。

redis哈希槽为什么16384

16384 这个数字是经过权衡后选择的:

  • 16384 是 2^14,是一个比较大的素数,可以较为均匀地分配给集群节点。
  • 16384 个槽够用于大多数应用场景,既不会过于浪费内存,也不会造成过多的槽迁移开销。
  • 使用 16 位 CRC16 哈希函数可以快速计算出 key 所属的槽号,计算效率高。

Redis一致性哈希是如何用的?怎么判断slot是属于哪个节点。初始化的时候怎么分配的slot的?

一致性哈希的使用:

  • Redis 使用一致性哈希算法将所有节点和 key 映射到同一个哈希环上。
  • 当客户端需要查找某个 key 时,会通过哈希函数将该 key 映射到哈希环上的一个点。
  • 然后顺时针查找最近的节点,即可找到负责该 key 的节点。

如何判断 slot 属于哪个节点:

  • Redis 将哈希空间分成 16384 个固定大小的槽位(slot)。
  • 每个 key 根据其 key 值经过 CRC16 哈希函数计算,得到一个 0-16383 之间的整数值,这个值就是该 key 所在的槽位。
  • 每个 Redis 节点负责管理一部分连续的槽位。通过维护一个槽位与节点的映射关系,就可以确定某个槽位属于哪个节点。

初始化时的槽位分配:

  • 在 Redis 集群初始化时,会将 16384 个槽位平均分配给集群中的所有节点。
  • 例如,如果集群有 3 个节点,那么每个节点会被分配 0-5460、5461-10920 和 10921-16383 三个槽位区间。
  • 当添加或删除节点时,Redis 会根据新的节点数重新计算每个节点应该负责的槽位区间,并自动进行槽位的迁移。

redis集群新增一个节点和删除一个节点后如何解决雪崩现象?

环哈希


为什么使用一致性哈希?

  • 传统哈希算法(如取模)在节点变更时,会导致大量 key 的重新分布,引发大量的数据迁移和客户端路由更新,容易造成雪崩效应。
  • 而一致性哈希算法通过将节点和 key 都映射到一个虚拟的哈希环上,在节点变更时只需要调整少量 key 的映射关系,减少了数据迁移和客户端路由的开销。

cluster 在服务器扩容时如何 rehash,哈希槽如何计算

当增加或减少 Redis 集群的节点时,需要对哈希槽进行重新分配,这个过程称为 rehash。

rehash 的具体步骤是:

计算新的哈希槽分配方案

迁移数据到新的槽位

更新客户端路由信息

哈希槽的计算公式是: slot = crc16(key) & 16383

crc16 是一种常用的哈希算法

结果被 16383 取模,得到 0-16383 之间的槽位号

多个主库如何实现

在 Redis 中,一般不会存在多个主库的情况,因为这样会导致数据一致性问题。

如果确实有这种需求,可以考虑使用 Redis 集群模式,通过哈希槽的方式将数据分散在多个主节点上。

     后期新的八股文合集文章会继续分享,感兴趣的小伙伴可以点个关注~

 更多精彩内容以及免费资料请关注公众号:绝命Coding

914cbb12b2c3492aaa31232a11aa9c64.png

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

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

相关文章

百日筑基第二十三天-23种设计模式-创建型总汇

百日筑基第二十三天-23种设计模式-创建型总汇 前言 设计模式可以说是对于七大设计原则的实现。 总体来说设计模式分为三大类: 创建型模式,共五种:单例模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式。结构型模式,共…

防洪墙的安全内容检测+http请求头

1、华为的IAE引擎:内部工作过程 IAE引擎主要是针对2-7层进行一个数据内容的检测 --1、深度检测技术 (DPI和DPF是所有内容检测都必须要用到的技术) ---1、DPI--深度包检测,针对完整的数据包,进行内容的识别和检测 1、基于特征子的检…

数据分析01——系统认识数据分析

1.数据分析的全貌 1.1观测 1.1.1 观察 (1)采集数据 a.采集数据:解析系统日志 当你在看视频的时候———就会产生日志———解析日志———得到数据 b.采集数据:埋点获取新数据(自定义记录新的信息) 日志…

【Vue】Vue3 安装 Tailwind CSS 入门

初始化 Vue 3 项目 npm install -g vue/cli vue create my-project安装 Tailwind CSS 进入你的项目目录,然后安装 Tailwind CSS 和其依赖项: npm install -D tailwindcss postcss autoprefixer配置 PostCSS Tailwind CSS 需要通过 PostCSS 进行处理。…

Python酷库之旅-第三方库Pandas(029)

目录 一、用法精讲 74、pandas.api.interchange.from_dataframe函数 74-1、语法 74-2、参数 74-3、功能 74-4、返回值 74-5、说明 74-6、用法 74-6-1、数据准备 74-6-2、代码示例 74-6-3、结果输出 75、pandas.Series类 75-1、语法 75-2、参数 75-3、功能 75-4…

牛客 7.13 月赛(留 C逆元 Ddp)

B-最少剩几个?_牛客小白月赛98 (nowcoder.com) 思路 奇数偶数 奇数;奇数*偶数 奇数 所以在既有奇数又有偶数时,两者结合可以同时删除 先分别统计奇数,偶数个数 若偶个数大于奇个数,答案是偶个数-奇个数 若奇个数…

六边形动态特效404单页HTML源码

源码介绍 动态悬浮的六边形,旁边404文字以及跳转按钮,整体看着像科技二次元画风,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head…

PyCharm查看文件或代码变更记录

背景&#xff1a; Mac笔记本上有一个截图的定时任务在运行&#xff0c;本地Python使用的是PyCharm IDE&#xff0c;负责的同事休假&#xff0c;然后定时任务运行的结果不符合预期&#xff0c;一下子不知道问题出现在哪里。 定位思路&#xff1a; 1、先确认网络、账号等基本的…

Qt 快速保存配置的方法

Qt 快速保存配置的方法 一、概述二、代码1. QFileHelper.cpp2. QSettingHelper.cpp 三、使用 一、概述 这里分享一下&#xff0c;Qt界面开发时&#xff0c;快速保存界面上一些参数配置的方法。 因为我在做实验的时候&#xff0c;界面上可能涉及到很多参数的配置&#xff0c;我…

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址&#xff1a;https://download.vulnhub.com/monitoring/Monitoring.o…

django学习入门系列之第四点《BootStrap依赖》

文章目录 往期回顾 BootStrap依赖于JavaScript的类库&#xff0c;JQuery下载 下载JQuery&#xff0c;在界面上应用JQuery 在页面上应用BootStrap和avaScript的类库【JQuery是avaScript的类库】 JQuery的官网&#xff1a; jQuery 如果要应用JQuery 则要在body里面导入文件…

MySQL(7)内外连接+索引

目录 1.内外连接; 2. 索引; 1.内外连接: 1.1内连接: 语法: select 字段 from 表名 inner join 表名 on 字段限制; 1.2 外连接: 分为左右外连接; (1)左外连接: 语法: select * from 表名 left join 表名 on 字段限制. &#x1f330;查询所有学生的成绩&#xff0c;如果这个学生…

什么才是好用的大模型?

随着大模型在千行百业的逐步落地&#xff0c;中国基础大模型正直面来自用户端的诸多拷问。 近日&#xff0c;随着OpenAI宣布禁止中国用户使用其API&#xff0c;更多的国产大模型都在提供替代方案和优惠措施&#xff0c;来吸引和支持开发者进行用户迁移。 这既是一次挑战&…

多多OJ评测系统 前端项目环境初始化 安装Vue脚手架 引入Arco Design组件

目录 确定环境 命令行输入 装一下脚手架 监测一下是否安装成功 创建一个项目 选择一系列的配置后 我们打开webStorm 配置脚手架后我们先运行 我们这边能获取到网址 其实我们脚手架已经帮我们做到了 接下来要引入相关的组件 选择用npm进行安装 我们建议的是完整引入…

UDP客户端、服务端及简易聊天室实现 —— Java

UDP 协议&#xff08;用户数据包协议&#xff09; UDP 是无连接通信协议&#xff0c;即在数据传输时&#xff0c;数据的发送端和接收端不建立逻辑连接&#xff0c;简单来说&#xff0c;当客户端向接收端发送数据时&#xff0c;客户端不会确认接收端是否存在&#xff0c;就会发出…

windows镜像下载网站

一个专注于提供精校、完整、极致的Windows系统下载服务的仓储站&#xff0c;网站托管于Github。 网站&#xff1a;https://hellowindows.cn/ 下载方式&#xff1a;ED2k&#xff0c;BT&#xff0c;百度网盘 MSDN - 山己几子木&#xff0c;提供Windows 11、Windows 10等不同版本…

单例模式Singleton

设计模式 23种设计模式 Singleton 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 饿汉式 public class BankTest {public static void main(…

Qt模型/视图架构——委托(delegate)

一、为什么需要委托 模型&#xff08;model&#xff09;用来数据存储&#xff0c;视图&#xff08;view&#xff09;用来展示数据。因此&#xff0c;模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示&#xff1a; 由图可知&#xff0c;模型向视图提供数…

3D问界—MAYA制作铁丝栅栏(透明贴图法)

当然&#xff0c;如果想通过建立模型法来实现铁丝栅栏的效果&#xff0c;也不是不行&#xff0c;可以找一下栅栏建模教程。本篇文章主要是记录一下如何使用透明贴图来实现创建铁丝栅栏&#xff0c;主要应用于场景建模&#xff0c;比如游戏场景、建筑场景等大环境&#xff0c;不…

PGCCC|【PostgreSQL】PG考证对工作上有什么好处# PG证书

认证 PostgreSQL 考证&#xff08;PostgreSQL Certification&#xff09;在工作上有以下几个好处&#xff1a; 增强专业能力&#xff1a;通过考证&#xff0c;可以系统地学习和掌握 PostgreSQL 数据库的知识和技能&#xff0c;提高自己的专业水平。 提升职业竞争力&#xff1…