为什么Redis集群的最大槽数是16384个?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的小站:skjava.com


回答

在 Redis 集群中,Redis 根据公式 HASH_SLOT=CRC16(key) mod 16384 ,来确定客户端的 key 映射到哪个分片上,然后 Redis 会去相应节点进行操作。然而,CRC16 算法最多可产生 65535 个槽位,但是 Redis 的取模 是16384 ,主要基于如下两个原因:

  1. Redis 节点在发送心跳数据包时需要将所有槽都放入到这个心跳包里,如果采用 16384 个插槽,占用空间为 2KB(16384/8);如果采用 65536 个插槽,占空间 8KB (65536/8)。8KB 的心跳数据有点儿大。
  • Redis Cluster 不太可能扩展到超过 1000 个节点,太多会导致网络拥堵。选择 16384 ,照样可以确保每个主节点都有足够的槽。

所以,选择 16384 既可以保证集群中每个节点都有足够的槽,又能保证心跳数据包不会过大。

详解

Redis 的集群方案有三种:

  1. 主从复制模式
  2. Sentinel(哨兵)模式
  3. Redis Cluster 模式

在海量数据的存储下,Redis Cluster 模式是一种比较理想的模式。

Redis Cluster 采用分片模式,它定义了 16384 个 Slot 槽位,集群中每个节点负责 16384 个 Slot 槽中的部分槽以及这些槽所对应的所有数据。

客户端可以连接集群中的任意一个节点 A,客户端向节点 A 发送请求后,节点 A利用公式 slot = CRC16(key) % 16384 计算当前请求所在的 Slot,如果不是自己负责的 Slot,则将该 Slot 所在的 Redis 实例地址返回给客户端。客户端接收信息后会自动将请求发送给新的 Redis 实例。

CRC16 算法,生成 的hash 值有 16 位,可以产生 2^16 = 65536 个槽,既然可以产生这么多槽为什么 Redis-Cluster 的最大槽数为 16384 个呢?65536 不行吗?针对这个问题,Redis 官方其实已经给出了答案(github.com/redis/redis...):

大致意思有如下几个:

1、正常的心跳数据包携带节点的完整配置,它能以幂等方式来更新配置。如果采用 16384 个插槽,占空间 2KB ;如果采用 65536 个插槽,占空间 8KB 。

Redis 消息头结构如下(源码位置:redis-7.2.4/src/cluster.h):

注意红色框框部分,char 类型的 myslots[] ,长度为 CLUSTER_SLOTS/8,底层存储其实是一个 bitmap,每一个位代表一个槽,如果该位为1,表示这个槽是属于这个节点。那么他有多大呢?16384 / 8 / 1024 = 2kb,如果槽位数使用 65536,则占用空间大小为 65536 / 8 / 1024 = 8kb,作为心跳的数据包过于庞大。

2、Redis Cluster 不太可能扩展到超过 1000 个主节点。16384 个插槽范围比较合适,当集群扩展到1000个节点时,也能确保每个master节点有足够的插槽。

Redis 的集群主节点基本上不太可能超过 1000 个,集群节点越多,心跳包携带的数据就越多,如果超过 1000 个,可能会造成网络堵塞,所以 Redis 作者也不建议 Redis 集群节点数量超过 1000.

3、槽越少,节点越少,压缩比例就越高

Redis 节点配置信息中,节点所负责的槽是通过 bitmap 来保存的。

在传输过程中,Redis 会对 bitmap 进行压缩,bitmap 填充得越少,压缩效率就越高。所以槽越少,节点越少,压缩比例就越高。

4、总结

总结其实就两点原因:

  1. 16384 够用
  2. 65536 心跳消息头太大,得不偿失。
相关推荐
昵称为空C15 小时前
手撸一个动态 SQL 执行引擎:不重启服务,在线增删改查任意数据库
spring boot·后端
用户83562907805115 小时前
用 Python 自动化 PowerPoint 演讲者备注添加
后端·python
神奇小汤圆15 小时前
科研神器再升级!Claude Code 全套 Skills,16 大科研场景全覆盖!
后端
tyung15 小时前
Go 手写有界 SPSC 环形队列:无 CAS、无锁、Cache 友好的无锁模型
后端·go
咕白m62516 小时前
使用 C# 在 Excel 中应用多种字体样式
后端·c#
Java编程爱好者16 小时前
放弃 Spring AI?这 3 个开源框架,才是让 SpringBoot 玩转 AI Agent 的正解
后端
二月龙16 小时前
伪类与伪元素深度解析:before/after 实用案例
后端
码事漫谈16 小时前
时序数据库2026盘点:国产数据库如何以“融合多模”走出差异化之路?
前端·后端
浮游本尊16 小时前
Java学习第42天 - Spring 事务传播、隔离级别、锁机制与并发一致性
后端
道友可好16 小时前
让 AI 自己验收,等于让学生自己批卷
前端·人工智能·后端