# 25. Redis 的哈希槽机制在集群模式中的作用是什么?

# 标准答案

Redis 集群采用 哈希槽(Hash Slot)机制 来管理数据分布,使得键值数据可以均衡地存储在多个节点上,并支持动态扩容与故障恢复。整个 Redis 集群共有 16384 个哈希槽,每个键通过 CRC16(key) % 16384 计算其哈希槽,再由对应的 Redis 节点负责存储。

该机制避免了传统一致性哈希的虚拟节点管理复杂性,同时确保了负载均衡、数据一致性和故障恢复能力,是 Redis 集群模式高效运作的核心。

# 答案解析

# 1️⃣ 哈希槽机制的设计背景

在分布式存储系统中,数据如何分布到多个节点上 是一个核心问题。传统的方案有两种:

  1. 一致性哈希(Consistent Hashing):每个节点对应一个哈希环上的区间,数据存储到对应的节点,但扩容时需要重新计算大量数据的归属,可能导致数据大规模迁移。
  2. 固定分区(Fixed Partitioning):数据分成固定的多个分区,每个分区分配给不同节点,扩容需要重新划分分区,管理复杂。

Redis 采用 哈希槽机制 来简化数据分布:

  • 将整个数据空间划分为 16384 个固定哈希槽,每个槽由集群中的某个节点负责。
  • 数据分布稳定,节点变更时仅需迁移部分哈希槽,而非所有数据。
  • 避免了一致性哈希的复杂性,同时保留了灵活性和可扩展性。

# 2️⃣ 哈希槽的具体工作原理

# 1. 键值如何映射到哈希槽

Redis 计算键值对应该存储在哪个节点的流程:

  1. 计算 CRC16(key),得到一个 16-bit 哈希值。
  2. 16384 取模,得到该键所属的哈希槽 slot = CRC16(key) % 16384
  3. 该哈希槽映射到一个 Redis 主节点,键值对存储在该节点上。

# 2. 哈希槽如何分配给节点

  • 每个 Redis 节点可以负责多个哈希槽,例如:
    • 节点 A 负责槽 0 ~ 5000
    • 节点 B 负责槽 5001 ~ 10000
    • 节点 C 负责槽 10001 ~ 16383
  • 一个哈希槽只能归属于一个主节点,但可以有多个从节点用于故障恢复。
  • Redis 通过 gossip 协议在集群内维护哈希槽分布信息。

# 3️⃣ 哈希槽机制的作用

# ✅ 1. 负载均衡

Redis 集群通过哈希槽的均匀分配,使数据尽可能分散在多个节点上,避免某些节点压力过大,影响性能

  • 数据量增长 时,可以通过新增节点,动态迁移部分哈希槽,重新分配负载。
  • 高并发场景 下,哈希槽机制确保流量在多个节点之间分散,提高整体吞吐量。

# ✅ 2. 动态扩容

当需要增加或减少节点时:

  1. 增加节点:Redis 只需把部分哈希槽从现有节点迁移到新节点,而不影响其他槽的数据。
  2. 减少节点:Redis 只需把该节点的哈希槽数据迁移到其他节点后,再移除该节点。
  3. Redis 提供 CLUSTER ADDSLOTSCLUSTER DELSLOTS 命令来调整哈希槽归属。

例如,从 3 个节点扩容到 4 个节点:

  • 迁移 10001 ~ 13000 这部分哈希槽到新节点 D,减少其他节点的负载,而数据仍然可以按哈希槽查询,无须重算所有键的位置

# ✅ 3. 故障恢复

  • 主节点故障时,集群会自动将其负责的哈希槽切换到相应的从节点,保持数据高可用
  • 从节点自动接管哈希槽后,客户端无需手动修改数据访问逻辑,整个集群可以继续运行。

# ✅ 4. 提高查询效率

客户端查询时:

  1. 通过 CLUSTER SLOTS 获取槽位分布,缓存到本地。
  2. 直接向存储该槽的 Redis 节点发送请求,避免查询多个节点,提高访问效率。

# ✅ 5. 事务与 Lua 脚本的限制

Redis 集群中,单条命令只能操作一个哈希槽

  • MGET/MSET 不能跨多个槽执行,必须保证所有 key 在同一个哈希槽内。
  • 事务(MULTI/EXEC)也受此限制,多键操作必须落在相同哈希槽,否则会报 CROSSSLOT 错误。

解决方案:使用 {} 标签

  • {user:123}{user:456} 会被映射到同一个哈希槽,因为 {} 内部的部分用于计算哈希值。

# 4️⃣ 哈希槽的迁移

Redis 允许在 不影响业务的情况下进行数据迁移

  1. 使用 CLUSTER SETSLOT <slot> IMPORTING 将槽临时导入目标节点。
  2. 使用 CLUSTER SETSLOT <slot> MIGRATING 让原节点标记该槽为迁移状态。
  3. 使用 redis-cli --cluster reshard 进行槽数据迁移。
  4. 槽迁移完成后,集群更新槽位分布表,并重新平衡数据负载。

# 深入追问

🔹 Redis 集群如何处理跨槽事务?
🔹 如何快速判断一个 Redis key 落在哪个哈希槽?
🔹 Redis 在高并发场景下如何优化哈希槽迁移的效率?

# 相关面试题

🔹 Redis 集群如何保证一致性?
🔹 Redis 采用什么机制避免数据倾斜?
🔹 Redis 哨兵模式与集群模式的区别?

# 总结

Redis 哈希槽机制 是集群模式的核心,它将数据分为 16384 个槽 并均匀分布到不同节点,保证了 负载均衡、扩展性和高可用性。哈希槽避免了传统一致性哈希的复杂性,使得节点扩容、故障恢复和数据迁移更加高效。Redis 依赖哈希槽机制来维护集群的稳定性,确保业务在分布式环境下的高效运行。🚀