redis集群中的哈希槽位(slot)为什么是16384个

在 Redis 集群中,Redis 根据公式 HASH_SLOT=CRC16(key) mod 16384 ,来确定客户端的 key 映射到哪个分片上,然后 Redis 会去相应节点进行操作。然而,CRC16 算法最多可产生 65535 个槽位,但是 Redis 的取模 是16384,主要基于如下原因
1.心跳数据包大小以及网络带宽
在Redis的集群中,每个槽位的状态信息需要进行记录以维护槽位的分配情况。这些状态信息通常使用位图来表示,其中每个槽对应一个位,用于表示该槽的状态。每个位只占用一个比特(bit),因此需要将插槽数除以8,将位的数量转换为字节(byte)的数量,以计算所需的空间大小。
因此,如果有16384个插槽,每个插槽的状态需要占用16384个比特,即16384 / 8 = 2048字节,即2KB的空间。同理,如果有65536个插槽,则需要65536 / 8 = 8192字节,即8KB的空间
因为Redis每秒都会发送一定数量的心跳包,如果消息头是8k,未免有些太大了,浪费网络资源。
2.redis集群的节点个数,基本不会超过1000
集群节点越多,心跳包的消息体携带的数据越多,如果节点超过1000个,也会造成网络的拥堵,对于节点数在1000个以内的redis集群,16384个槽位足够用了
3.压缩比高,容易传输
Redis主节点的哈希槽信息是通过bitmap存储的,在传输过程中,会对bitmap进行压缩,bitmap的填充率越低,压缩率越高。
bitmap 填充率 = slots / N (N表示节点数)。
也就是说slots越小,填充率就会越小,压缩率就会越高,传输效率就会越高。

综合下来,从心跳包的大小、网络带宽、心跳并发、压缩率等维度考虑,16384 个插槽更有优势且能满足业务需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值