Redis Cluster
Redis3.0之后,节点之间通过去中心化的方式提供了完整的sharding(分片)、replication(复制)、failover解决方案,称为 Redis Cluster。

1、所有redis节点(包括主和从)彼此互联(两两通信)。
2、集群中的高可用逻辑,通过主节点的过半选举实现主从替换。
3、客户端与redis-cluster连接,无需再关心分片的计算,客户端不在关心分片的计算逻辑,内部分发分布式数据(内部有分片计算逻辑),客户端将key交给redis节点后,集群内部判断key值的正确存储位置,转发存储;

hash slot(哈希槽)
Redis Cluster在设计中没有使用一致性哈希(Consistency Hashing),而是引入哈希槽(hash slot)来实现;一个 Redis Cluster包含16384(0~16383)个哈希槽,存储在Redis Cluster中的所有key都会被映射到这些slot中,集群中的每个key都属于这16384个哈希槽中的一个,集群使用公式slot=CRC16(key)%16384来计算key属于哪个槽。

Redis群集中的每个节点都负责哈希槽的子集,因此,例如,您可能有一个包含3个节点的群集,其中:
节点A包含从0到5500的哈希槽。
节点B包含从5501到11000的哈希槽。
节点C包含从11001到16383的哈希槽。
这样可以轻松添加和删除集群中的节点。例如,如果我想添加一个新节点D,则需要将一些哈希槽从节点A,B,C移到D。类似地,如果我想从群集中删除节点A,则只需移动A所服务的哈希槽到B和C。当节点A为空时,我可以将其从群集中完全删除。

槽道原理
当连接redis集群中任意一个已知的节点想通过set key value命令来保存数据,或get key来获取数据,首先会根据key值,通过CRC16(key)%16384,算出这个key应该落入的槽道号,接下来就只需要找到是哪个节点管理这个槽道号,就可以在这个节点操作了。
有两种可能,要么当前连接的节点就管理着这个槽道号,在当前节点直接set就可以了。要么这个节点不管理这个槽道号,需要寻找对的节点。如果想判断槽道是否归某个节点管理,就需要使用一个能标记的东西将槽道和节点联系起来,在redis集群中,有两个关键类以及里面的两个关键属性(clusterNode和clusterState的slots属性)。
(1)clusterNode类的slots属性:clusterNode类对应一个节点的信息,类似cluster nodes命令得到的单个节点的信息,包括节点id、ip、端口等信息,它有一个关键属性slots,类型是一个2048位的byte数组(二进制位序列数组),对应就是16384个bit位,通过这个数组bit是1或0,来决定节点是否拥有槽道的管理权,每个节点都有自己的这个数组。

(2)clusterState类的slots属性:clusterState类记录了集群状态的信息,类似cluster info命令得到的集群信息。它有一个关键的属性slots,类型是一个16384位长度的clusterNode数组(索引数组),它记录着整个集群的槽道信息,根据这个数组的下标,可以找到对应的节点。

当前连接的节点根据key计算出来的槽道号,在二进制位序列数组查找该槽道号的值,如果是1,表示当前节点管理了这个槽道,如果是0,则没有管理这个槽道,需要查找索引数组对应的槽道号被哪个节点管理。
————————————————
版权声明:本文为CSDN博主「suxm&」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xianmingsu/article/details/103631376

Redis-槽道原理相关推荐

  1. 金九银十!“68道 Redis+168道 MySQL”精品面试题(带解析),你背废了吗?

    前言 谈起 Redis 和 MySQL,皆是广大 程 序 猿(媛)朋友面试跳槽必踩的两个坑.那么,关于Redis与MySQL,面试官最爱问哪些问题呢?不知道也不用慌,我已整理了这"68道 R ...

  2. “68道 Redis+168道 MySQL”精品面试题(带解析),你背废了吗?

    谈起 Redis 和 MySQL,皆是广大 程 序 猿(媛)朋友面试跳槽必踩的两个坑.那么,关于Redis与MySQL,面试官最爱问哪些问题呢?不知道也不用慌,我已整理了这"68道 Redi ...

  3. “68 道 Redis+168 道 MySQL”精品面试题(带解析),你背废了吗?

    谈起 Redis 和 MySQL,皆是广大 程 序 猿(媛)朋友面试跳槽必踩的两个坑.那么,关于 Redis 与 MySQL,面试官最爱问哪些问题呢?不知道也不用慌,我已整理了这"68 道 ...

  4. 分布式一致性协议 Gossip 和 Redis 集群原理解析

    分布式一致性协议 Gossip 和 Redis 集群原理解析 Redis 是一个开源的.高性能的 Key-Value 数据库.基于 Redis 的分布式缓存已经有很多成功的商业应用,其中就包括阿里 A ...

  5. Redis哨兵模式原理

    Redis哨兵模式原理 一.哨兵模式 二.配置 三.检测异常(主观下线) 四.客观下线 五.故障转移 六.使用 七.缺点 一.哨兵模式 哨兵模式是Redis可用性的解决方案:它由一个或多个 senti ...

  6. redis高并发原理_Java中的42行代码中的URL缩短服务— Java(?!)Spring Boot + Redis...

    redis高并发原理 显然,编写URL缩短服务是新的"世界,您好! "在物联网/微服务/时代的世界中. 一切始于在45行Scala中的URL缩短服务-整洁的Scala,以Spray ...

  7. 如何区分ABS和PVC光纤槽道?

    光纤单独走线槽到每个机柜下线,专业的光纤槽道都是可以组装式的,工程化很高,而且从材料学上来说也确实比国内的一些塑料成品槽道要过关,最重要的一点是机房室内光线因为不是带铠的,都是软,如果一路放在网格桥架 ...

  8. Redis 主从复制的原理及演进

    本文作者:百度基础架构部工程师,王钰 Redis 的主从复制经历了多次演进,本文将从最基本的原理和实现讲起,并层层递进,逐步呈现 Redis 主从复制的演进历史.大家将了解到 Redis 主从复制的原 ...

  9. Redis压缩列表原理与应用分析

    摘要 Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件.它支持字符串.列表.哈希表.集合.有序集合五种数据结构类型,同时每种数据结构类型针对不同的应用场景又支 ...

  10. Redis 压缩列表原理与应用分析

    作者 | 西瓜 来源 | JAVA架构进阶之路 摘要 Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件.它支持字符串.列表.哈希表.集合.有序集合五种数据结构 ...

最新文章

  1. Python中最好用的命令行参数解析工具
  2. python如何判断两个数组完全相等?
  3. 小波图像分解与重构程序存在的问题与解决办法
  4. 【python数据挖掘课程】十四.Scipy调用curve_fit实现曲线拟合
  5. 代理模式——结构型模式(7)
  6. python︱微服务Sanic制作一个简易本地restful API
  7. 条款4:确定对象被使用前已被初始化(Make sure that objects are initialized before they're used)...
  8. 安卓设备安全测试框架DTF
  9. html+css+js的生日祝福网页+更改教程
  10. 路由器手机测试网速的软件,4个实用的无线路由器WiFi检测工具,让你网速又快又稳定...
  11. rapidminer decision tree(决策树)手册
  12. TC软件概要设计文档(手机群控)
  13. 校园网IPv6免流量上网
  14. ggplot2绘制地图
  15. 使用pandas的merge出现Empty DataFrame 和 Index: []
  16. flask Not Found The requested URL 20211207
  17. excel显著性检验_#如何用excel做anova分析#用excel做显著性分析
  18. android 输入法如何启动流程_Android程序打开和关闭输入法
  19. ArcGIS基础实验操作100例--实验13 数字化面图形的技巧
  20. MT6735 刷机时:brom error:s ft download fail 4008

热门文章

  1. ^全^ 获取SQL SERVER2000/2005、MySql、Oracle元数据的SQL语句 [SQL语句来自CodeSmith]
  2. lua 远程调试 【zeroBrane 使用mobdebug】(good转)
  3. [推荐]一个 1kb 的image placeholder的js库
  4. isp mpls专线
  5. AKM项目轶事之GBS同事转入GDC
  6. ios sinaweibo 客户端(二)
  7. 光盘勘误——《Visual C# 2005 程序开发与界面设计秘诀》
  8. 嵌入式工具——lsof
  9. Linux输入子系统学习笔记
  10. linux内核开发常用站点