为什么 Redis 集群中只使用 16384个slot 而不是 65535 个槽位?

再来看一段代码如下:Redis 发送心跳包需要再请求头中携带一些状态数据,/8 表示按照字节大小表示:
 
为什么 Redis 集群中只使用 16384个slot 而不是 65535 个槽位?_第1张图片

1)如果槽位是 65536,发送心跳信息的消息头达到 8k,发送心跳包过于庞大,在消息中需要占据 【CLUSTER_SLOTOS/8】的大小,当槽位为 65538 时,这块消息大小为:65536/8/1024=8kb;Redis 中每秒钟会发送一定数量的 ping 消息作为心跳包。如果槽位为 65535,这个 ping 消息的消息头太大了,浪费宽带。

2)Redis 集群主节点数量基本不可能超过 1000 个,集群节点越多,心跳包的消息体内携带数据越多。如果节点过 1000 个,也会导致网络堵塞。因此 Redis 作者不建议 Redis cluster 节点数量超过 1000 个。那么,对于节点数在 1000 以内的 Redis Cluster 集群,16384 个槽位够用了,没必要拓展到 65535 个。

3) 槽位越小,节点少的情况下,压缩比高,容易传输。Redis 主节点的配置信息中它负责的哈希槽是通过一张 BitMap 形式保存,在传输过程中会对 bitmap 进行压缩,但是如果 bitmap 的填重率 slots/N 很高的话,bitmap 压缩率就很低。如果节点少,而哈希槽数量很多的话,bitmap 的压缩率就很低。

你可能感兴趣的:(Redis,redis,数据库,缓存)