后端岗位面试题更新 2026-08-05

在 Redis 集群模式下,当客户端需要读写某个键时,它是通过什么机制来确定该键对应的具体节点位置?

后端开发技术原理Redis

考察说明

考察对 Redis 集群数据分片与键定位原理的理解。

回答思路

  1. 【回答框架 1】Redis 集群通过分片(sharding)将数据分布到多个主节点,每个键根据其键名计算哈希槽(hash slot)。具体定位过程为:首先使用 CRC16 算法对键名计算一个 16 位的哈希值,然后对该哈希值对 16384 取模,得到 0 到 16383 之间的一个槽位编号。
  2. 【回答框架 2】集群中的每个主节点负责一部分哈希槽,例如节点 A 负责 0-5000,节点 B 负责 5001-10000,节点 C 负责 10001-16383。客户端定位键时,只需计算出键的槽位号,再根据槽位与节点的映射关系(通常由客户端缓存或从集群节点获取)找到对应的节点。
  3. 【回答框架 3】当客户端向集群发送命令时,如果键的槽位不在该节点负责范围内,节点会返回 MOVED 重定向错误,其中包含正确节点的地址。客户端收到后更新本地映射并重新发送请求。此外,在集群重新分片(resharding)时可能返回 ASK 错误,要求客户端先发送 ASKING 命令再重试,以支持数据迁移过程中的访问。
  4. 【回答框架 4】实际应用中,客户端库(如 Jedis、Lettuce)通常会维护槽位到节点的映射缓存,并提供自动重定向逻辑,从而对应用层透明。理解这一机制有助于排查集群访问错误和设计键分布策略。
  5. 【关键点 1】键定位核心是 CRC16(key) % 16384 计算哈希槽。
  6. 【关键点 2】每个节点负责部分哈希槽,槽位与节点映射需客户端维护。
  7. 【关键点 3】MOVED 表示槽位归属变更,ASK 用于迁移中的临时重定向。
  8. 【关键点 4】键分布不均衡可能导致热点,需合理设计键名。
  9. 【易错点 1】不能直接使用键的哈希值取节点数来定位,因为槽位是固定 16384,不是节点数。
  10. 【易错点 2】MOVED 和 ASK 错误虽都涉及重定向,但语义不同:MOVED 是永久性,ASK 是临时性。
  11. 【易错点 3】忽略客户端缓存更新会导致频繁重定向,影响性能,应依赖客户端库自动处理。