Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。

为什么RedisCluster会设计成16384个槽呢?

这个问题有点类似于ThreadLocal中的0x61c88647。

对于这个问题,作者给出了解答。原版回答如下图所示,对应的链接地址为:https://github.com/antirez/redis/issues/2576

1.如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。

在消息头中,最占空间的是 myslots[CLUSTER_SLOTS/8]。当槽位为65536时,这块的大小是: 65536÷8=8kb因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽。

2.redis的集群主节点数量基本不可能超过1000个。

如上所述,集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此redis作者,不建议redis cluster节点数量超过1000个。那么,对于节点数在1000以内的redis cluster集群,16384个槽位够用了。没有必要拓展到65536个。

3.槽位越小,节点少的情况下,压缩率高。

Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中,会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),bitmap的压缩率就很低。如果节点数很少,而哈希槽数量很多的话,bitmap的压缩率就很低。而16384÷8=2kb,怎么样,神奇不!

综上所述,作者决定取16384个槽,不多不少,刚刚好!

为什么RedisCluster会设计成16384个槽?相关推荐

  1. 为什么RedisCluster会设计成16384个槽呢?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! Redis Cluster 是Redis的集群实现,内置数 ...

  2. Spring 为啥默认把 bean 设计成单例的?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:在滴滴和头条干了 2 年后端开发,太真实-个人原创100W+访问量博客:点击前往,查看更多 熟悉Spring开发 ...

  3. String的内存模型,为什么String被设计成不可变的

    String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源 ...

  4. 这样设计是否更好些~仓储接口是否应该设计成基础操作接口和扩展操作接口

    前言 我们进行linq to sql和ef时代后,底层的实现基本使用的是repository模块,即仓储模式,事实上就是把ORM实体的最基本操作进行封闭,对外层不公开操作实现的细节. 面向接口的编程 ...

  5. 为什么ui框架设计成单线程_评估UI设计的备忘单

    为什么ui框架设计成单线程 Whether you're evaluating your design proposals or giving feedback to a colleague duri ...

  6. 支付渠道参数如何设计成路由化配置

    转载自  支付渠道参数如何设计成路由化配置 今天我们来探讨在搭建支付系统时一个比较关键的问题:渠道参数路由化配置如何设计? 在开发支付系统的时候,我们经常会涉及到对接多个支付渠道,除常见的支付宝.微信 ...

  7. java语言特点 字符串不变_面试必问:Java中String类型为什么设计成不可变的?

    这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下. 想要完全了解String,在这里我们需要解决以下 ...

  8. Spring为啥默认把bean设计成单例的

    熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototype.request.session.global session.而且默认情况下是single ...

  9. 为什么jdk中把String类设计成final

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 为什么j ...

最新文章

  1. Web 开发学习笔记(6) --- 前端开发之 HTML5
  2. python脚本例子_python dict 字典 以及 赋值 引用的一些实例(详解)
  3. Windows Phone 7 MVVM模式通讯方式之实现Command
  4. 【Docker】docker bash: sudo: command not found
  5. Ruby module里的self
  6. Postman Request Payload发送请求
  7. 期末考试、考研、学技术
  8. 微信小程序多次跳转后不能点_京东小程序 Taro 开发对比原生开发测评
  9. 数据挖掘导论——综合实验
  10. Windows系统好用的文本编辑器
  11. element ui实现抽屉效果_如何给element添加一个抽屉组件
  12. python中文名字-Python 批量生成中文姓名(百家姓)
  13. 在互联网行业干数据分析师,都需要掌握哪些技能?编程语言?软件工具?
  14. 计算机管理磁盘管理,windows7双磁盘管理图文教程
  15. 这台计算机没有连接到网络怎么办,通过路由器连接电脑连不上网怎么办_台式连接路由器没有网解决方法-系统城...
  16. 学生成绩管理系统(简单版)
  17. Python每日一练——第1天:水仙花数
  18. python项目对接腾讯云发送短信
  19. 蓝牙的基本概念以及发展轨迹 - 蓝牙的前生后世
  20. Linux-生产中常用命令

热门文章

  1. python局部函数
  2. [stl]芬兰木棋 2021RoboCom初赛B
  3. No module named natsort 错误(顺便更新conda)
  4. mysql root设置远程访问
  5. Generic patch v2.6 for TabsStudio and DevArt Entity Developer -屈指可数的更新版
  6. CSDN超级实习生,五步助力高薪offer
  7. 微信抢红包插件 android 8.0,重磅!微信8.0专属红包全量上线!
  8. C#中字典的排序方法
  9. JS常用脚本+html代码大全+对联广告代码效果大全
  10. IO流:输入字节流:InputStream 、 输出字节流:OutputStream 、输入字符流:Reader 、输出字符流:Writer、 BufferedInputStream