Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,

这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。

这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。

使用哈希槽的好处就在于可以方便的添加或移除节点。

当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;

当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;

在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

"用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?"
Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。

"为了动态增删节点的时候,不至于丢失数据么?"
节点增删时不丢失数据和hash算法没什么关系,不丢失数据要求的是一份数据有多个副本。

“还有集群总共有2的14次方,16384个哈希槽,那么每一个哈希槽中存的key 和 value是什么?”
当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。

最新文章

  1. linux ssh key配置方法
  2. ABAP BDC
  3. xampp连接Admin界面报错
  4. java内存模型与线程(转) good
  5. 使用Json让Java和C#沟通的方法
  6. CKPlayer从Cookie里读取上次播放记录的一个demo
  7. Angularjs学习---ubuntu12.04中karma安装配置
  8. yii migrate 设计博客
  9. 三、Redis基础操作
  10. 【转】Cowboy 开源 WebSocket 网络库
  11. Angular2入门:TypeScript的类型 - 类型、null、undefined
  12. 神奇的操作——线段树合并(例题: BZOJ2212)
  13. java项目运用server运行(eclipse、myeclipse通用)
  14. ios成长之每日一遍(day 2)
  15. linux系统如何操作隐藏文件
  16. Asp.net 后台调用js方法
  17. 创建template模板
  18. Gitlab+Jenkins学习之路(五)之git merge和git rebase的区别
  19. centos6.6-6.8的cobbler的kickstarts文件
  20. POJ - 3585 树上最大流 换根法

热门文章

  1. HttpClient 处理中文乱码
  2. 网络采集软件核心技术剖析系列(2)---如何使用C#语言获得任意站点博文的正文及标题
  3. 转载:win10 下安装32位的Oracle 11g 客户端(问题:环境不满足最低要求)
  4. Setting an appropriate geodatabase spatial domain
  5. Android 多线程之IntentService 完全详解
  6. nobr 不换行标签
  7. DICOM中几个判断图像方向的tag
  8. 从C转到JAVA学习路之基本知识对比(转)
  9. [Spring boot] Application properties and configurations
  10. 利用Bootstrap制作一个流行的网页