槽是 Redis 分布式架构的基石,理解它就像拿到了打开 Redis Cluster 之门的钥匙。
02|Redis 槽的本质:为什么是 16384 个?
Redis Cluster 采用哈希槽分区算法,将整个键空间划分为 16384 个槽(编号 0-16383)。这个看似随意的数字背后藏着精妙的工程权衡:
- CRC16 算法优势:Redis 使用
CRC16(key) mod 16384计算槽位,CRC16 能生成 16bit 哈希值(0-65535),而 16384 正好是 2 的 14 次方,位运算替代取模性能提升 300% - 心跳包压缩:16384 个槽位用 2KB bitmap 即可表示,在集群规模 1000 节点时,心跳包大小控制在 8KB 以内
- 负载均衡精度:每个节点平均承载约 512 个槽(16384÷32),在节点增减时数据迁移粒度适中
// Redis 源码中的槽位计算(cluster.c)
unsigned int keyHashSlot(char *key, int keylen) {
int s, e; /* start-end indexes of { and } */
for (s = 0; s < keylen; s++)
if (key[s] == '{') break;
/* 处理 hash tag 情况:{user1000}.profile 和 {user1000}.age 会落到同槽 */
if (s == keylen) return crc16(key,keylen) & 0x3FFF;
for (e = s+1; e < keylen; e++)
if (key[e] == '}') break;
if (e == keylen || e == s+1) return crc16(key,keylen) & 0x3FFF;
return crc16(key+s+1,e-s-1) & 0x3FFF;
}