点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

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个槽,不多不少,刚刚好!

热门内容:
  • 徒手撸了一个API网关,理解更透彻了,代码已上传github,自取~

  • 写了个牛逼的日志切面,甩锅更方便了!

  • 绝了!这款工具让SpringBoot不再需要Controller、Service、DAO、Mapper!

  • 一个注解搞定 SpringBoot 接口防刷,还有谁不会?

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

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

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

    Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写. ...

  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. 基于Sql Server 2008的分布式数据库的实践(五)
  2. 阅读笔记 1 火球 UML大战需求分析
  3. linux之gdb基本调试命令和使用总结
  4. TQ210 —— 点亮LED
  5. ubuntu 设置 时区 更新时间
  6. html把多个div做成块,HTML块
  7. html input 文本框的一些操作(限制输入...)
  8. linux内核分析与应用 -- 并发(下)
  9. 阿里企业邮箱使用第三方客户端同步邮件的坑
  10. 游戏设计的艺术:一本透镜的书——第十九章 世界包含着各种空间
  11. java duration 设置值,Java中的Duration toHours()方法
  12. ESP32基于arduino和风天气获取代码
  13. python基础个人总结
  14. 74LVC1G3157GW
  15. php创建数组教程,PHP中使用array函数新建一个数组
  16. Codeforces Round #439 (Div. 2)C - The Intriguing Obsession(简单dp)
  17. 异常检测方法-MAD
  18. Trait和Trait Objec
  19. Mac下完美利用雷蛇鼠标的多个功能按键(解决雷蛇Win键组合键无法映射问题)
  20. 密码学基本原理和发展——古典密码学

热门文章

  1. Python实现:开始日期 + 间隔天数,依次输入所有日期
  2. 解决Attempt to execute SCRIPT mexLasso as a function
  3. [bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划
  4. Java实现网页截屏功能(基于phantomJs)
  5. 微酷WeiKuCMS现赠送高速开发系统软件。公司、程序猿的福音呀!
  6. 在tomcat中用jndi配置数据源启动java web程序
  7. nodejs端口被占用。
  8. 你为什么应该经常访问招聘网站?招聘网站至少有4个方面的价值!
  9. Linux使用netstat命令查看并发连接数
  10. 【复盘】升级打怪第一关,冲啊!