1. Redis Cluster 的分片机制,16384 个哈希槽?
请说明 Redis Cluster 的分片机制,为什么使用 16384 个哈希槽,以及 key 如何映射到槽位?
- 16384 个哈希槽的划分
- CRC16 计算与取模
- key 与节点映射、hash tag
Redis Cluster 将整个 keyspace 划分为 16384 个哈希槽(slot),每个节点负责一部分槽位。key 通过 CRC16(key) % 16384 计算所属槽位,再根据槽位分布定位到具体节点。槽位可以手工迁移实现数据扩缩容。选择 16384 是因为它足够大以支持大量节点且便于位图(bitmap)表示槽位分布,同时比 65536 更省内存(节点心跳用 16384 位(约 2048 字节)的位图)。使用 hash tag(key 中花括号部分)可让相关 key 落在同一槽位以支持多 key 操作。
槽位是"数据分发"的中间层,把 key 的解耦与数据迁移解耦——移动槽位即可迁移数据,无需知道具体 key,是集群扩缩容与负载均衡的基础。
# 计算 key 的槽位
redis-cli cluster keyslot mykey
(integer) 6556