为什么RedisCluster会设计成16384个槽呢?
点击上方蓝色“方志朋”,选择“设为星标”
回复“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个槽呢?相关推荐
- 为什么RedisCluster会设计成16384个槽?
Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写. ...
- Spring 为啥默认把 bean 设计成单例的?
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:在滴滴和头条干了 2 年后端开发,太真实-个人原创100W+访问量博客:点击前往,查看更多 熟悉Spring开发 ...
- String的内存模型,为什么String被设计成不可变的
String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前言 关于String,收集一波基础,来源 ...
- 这样设计是否更好些~仓储接口是否应该设计成基础操作接口和扩展操作接口
前言 我们进行linq to sql和ef时代后,底层的实现基本使用的是repository模块,即仓储模式,事实上就是把ORM实体的最基本操作进行封闭,对外层不公开操作实现的细节. 面向接口的编程 ...
- 为什么ui框架设计成单线程_评估UI设计的备忘单
为什么ui框架设计成单线程 Whether you're evaluating your design proposals or giving feedback to a colleague duri ...
- 支付渠道参数如何设计成路由化配置
转载自 支付渠道参数如何设计成路由化配置 今天我们来探讨在搭建支付系统时一个比较关键的问题:渠道参数路由化配置如何设计? 在开发支付系统的时候,我们经常会涉及到对接多个支付渠道,除常见的支付宝.微信 ...
- java语言特点 字符串不变_面试必问:Java中String类型为什么设计成不可变的?
这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下. 想要完全了解String,在这里我们需要解决以下 ...
- Spring为啥默认把bean设计成单例的
熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton.prototype.request.session.global session.而且默认情况下是single ...
- 为什么jdk中把String类设计成final
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 为什么j ...
最新文章
- 基于Sql Server 2008的分布式数据库的实践(五)
- 阅读笔记 1 火球 UML大战需求分析
- linux之gdb基本调试命令和使用总结
- TQ210 —— 点亮LED
- ubuntu 设置 时区 更新时间
- html把多个div做成块,HTML块
- html input 文本框的一些操作(限制输入...)
- linux内核分析与应用 -- 并发(下)
- 阿里企业邮箱使用第三方客户端同步邮件的坑
- 游戏设计的艺术:一本透镜的书——第十九章 世界包含着各种空间
- java duration 设置值,Java中的Duration toHours()方法
- ESP32基于arduino和风天气获取代码
- python基础个人总结
- 74LVC1G3157GW
- php创建数组教程,PHP中使用array函数新建一个数组
- Codeforces Round #439 (Div. 2)C - The Intriguing Obsession(简单dp)
- 异常检测方法-MAD
- Trait和Trait Objec
- Mac下完美利用雷蛇鼠标的多个功能按键(解决雷蛇Win键组合键无法映射问题)
- 密码学基本原理和发展——古典密码学
热门文章
- Python实现:开始日期 + 间隔天数,依次输入所有日期
- 解决Attempt to execute SCRIPT mexLasso as a function
- [bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划
- Java实现网页截屏功能(基于phantomJs)
- 微酷WeiKuCMS现赠送高速开发系统软件。公司、程序猿的福音呀!
- 在tomcat中用jndi配置数据源启动java web程序
- nodejs端口被占用。
- 你为什么应该经常访问招聘网站?招聘网站至少有4个方面的价值!
- Linux使用netstat命令查看并发连接数
- 【复盘】升级打怪第一关,冲啊!