当前位置: 首页 > news >正文

Redis分片集群散列插槽

一、前言:为什么 Redis Cluster 用 16384 个槽?

在 Redis 分片集群(Cluster)中,数据不是随机分布,而是通过“散列插槽”(Hash Slot)机制进行分片
你可能好奇:

  • 为什么是16384个槽,不是 65536 或 1024?
  • key 是如何映射到具体节点的?
  • 为什么MGET user:1 user:2有时会报错?

本文将带你彻底搞懂 Redis 散列插槽的设计哲学与工作原理


二、散列插槽:Redis Cluster 的分片基石

2.1 基本概念

  • Redis Cluster 将整个 key 空间划分为16384 个哈希槽(slot)
  • 每个 key 通过公式计算归属哪个 slot:
    slot = CRC16(key) % 16384
  • 每个 master 节点负责一部分连续或不连续的 slot

优势

  • 分片规则简单、确定
  • 扩容/缩容只需迁移 slot,无需 rehash 全量数据

三、为什么是 16384?不是更多或更少?

这是 Redis 作者Salvatore Sanfilippo(antirez)在 GitHub issue 中亲自解释的经典问题。

3.1 官方理由(精简版)

“16384 is the right balance between:

  • 消息大小:每个节点每秒通过 gossip 协议广播 cluster state
  • 集群规模:最多支持 1000 个节点(实际建议 ≤ 100)
  • 内存开销:每个 slot 状态需 2 字节,16384 × 2 = 32KB”

3.2 详细分析

槽位数每节点心跳包大小支持最大节点数内存开销
65536~130KB< 100128KB
16384~32KB~100032KB
4096~8KB> 10008KB
  • 65536 太大:心跳包过大,网络带宽浪费
  • 4096 太小:节点多时,slot 分配不均(如 100 节点,平均仅 40 个 slot/节点)
  • 16384 刚好:兼顾扩展性与效率

🔑结论:16384 是工程上的最优折中


四、Key 到 Slot 的计算过程(含代码)

4.1 CRC16 算法

Redis 使用CRC16_CCITT变种(初始值 0,无反转)。

4.2 Java 实现示例

public class RedisSlot { private static final int SLOT_COUNT = 16384; public static int getSlot(String key) { // 1. 提取 Hash Tag(如有) String tagKey = extractTag(key); // 2. 计算 CRC16 int crc = crc16(tagKey.getBytes(StandardCharsets.UTF_8)); // 3. 取模 return crc % SLOT_COUNT; } // 支持 Hash Tag:{user1001}.name 和 {user1001}.age 落在同一 slot private static String extractTag(String key) { int start = key.indexOf('{'); if (start != -1) { int end = key.indexOf('}', start + 1); if (end != -1 && end != start + 1) { return key.substring(start + 1, end); } } return key; } // 简化版 CRC16(实际应使用标准实现) private static int crc16(byte[] bytes) { int crc = 0; for (byte b : bytes) { crc = ((crc << 8) ^ LOOKUP_TABLE[((crc >> 8) ^ (b & 0xFF)) & 0xFF]) & 0xFFFF; } return crc; } private static final int[] LOOKUP_TABLE = { /* CRC16 表 */ }; }

关键点Hash Tag可强制多个 key 落在同一 slot!


五、客户端如何定位 Key 所在节点?

当客户端访问一个 key 时,流程如下:

5.1 首次访问(无本地缓存)

  1. 随机连接一个节点(如 7001)
  2. 节点计算 key 的 slot,发现不在自己负责范围
  3. 返回MOVED 重定向
    MOVED 5461 192.168.1.10:7002
  4. 客户端缓存<slot -> node>映射,并重连 7002

5.2 后续访问(有缓存)

  • 直接根据 slot 路由到目标节点,无重定向

💡Lettuce / Jedis Cluster 客户端会自动处理 MOVED/ASK


六、跨 Slot 操作为何失败?

6.1 问题场景

# 假设 user:1 → slot 1000, user:2 → slot 2000 redis-cli -c MGET user:1 user:2 # 报错:CROSSSLOT Keys in request don't hash to the same slot

6.2 原因

  • Redis Cluster要求多 key 操作必须在同一 slot
  • 否则无法保证原子性和一致性

6.3 解决方案:使用 Hash Tag

# 强制 user:1 和 user:2 落在同一 slot MGET {user100}.name {user100}.age # OK!
  • {}内的内容作为 hash key
  • user100相同 → slot 相同

最佳实践:对需要 multi-key 操作的数据,使用相同 Hash Tag


七、Slot 迁移与集群扩容

当新增 master 节点时,需迁移部分 slot

7.1 迁移流程

  1. 目标节点声明“我将接管 slot X”
  2. 源节点进入MIGRATING状态
  3. 客户端访问 slot X 的 key:
    • 若 key 存在 → 返回ASK 重定向到目标节点
    • 若 key 不存在 → 允许在目标节点写入
  4. 源节点逐步迁移 key(CLUSTER GETKEYSINSLOT+MIGRATE
  5. 迁移完成,更新集群拓扑

7.2 客户端感知

  • 收到ASK时,先发 ASKING 命令,再发原命令
  • Lettuce/Jedis 自动处理,业务无感

八、监控与运维命令

8.1 查看 slot 分配

redis-cli -p 7001 CLUSTER SLOTS # 返回:[[0,5460,"192.168.1.10",7001], [5461,10922,"192.168.1.10",7002], ...]

8.2 查看 key 所属 slot

redis-cli -p 7001 CLUSTER KEYSLOT "user:1001" # 返回:5461

8.3 查看节点负责的 slots

redis-cli -p 7001 CLUSTER NODES # 输出中:connected 0-5460

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.jsqmd.com/news/479763/

相关文章:

  • 2026年衬衫现货厂家口碑评测:谁在领跑职业装供应市场? - 2026年企业推荐榜
  • 2026制造企业爱采购开户优质服务商推荐指南:GEO是什么/GEO运营/爱采购全店托管/爱采购哪家好/爱采购效果/选择指南 - 优质品牌商家
  • 2026泡沫混凝土发泡设备品牌推荐指南:泡沫混凝土设备机器、泡沫轻质混凝土设备、混凝土发泡机设备、现浇泡沫混凝土选择指南 - 优质品牌商家
  • 2026年热门的焊接钢筋网片厂家推荐:电焊钢筋网片实力品牌厂家推荐 - 品牌宣传支持者
  • 2026年吉林界石直销厂商综合实力与选购指南 - 2026年企业推荐榜
  • 2026广州搬家服务优质推荐榜专业透明靠谱:广州蚂蚁搬屋、广州公司搬迁、广州别墅搬家、广州天河搬家、广州家庭搬家选择指南 - 优质品牌商家
  • 2026热收缩膜包装机优质厂家推荐榜:包装机设备厂家/枕式热收缩包装机厂家/热封口包装机厂家/热收缩膜包装设备厂家/选择指南 - 优质品牌商家
  • 2026西南奢品贵金属回收优质机构推荐榜:贵金属金条金币回收电话、贵金属钯金回收电话、贵金属铂金回收电话、贵金属首饰回收电话选择指南 - 优质品牌商家
  • 2026会议音响套装优质品牌推荐选购指南:大礼堂音响/学校教室音响/平板无纸化会议/报告厅音响/无纸化会议终端/选择指南 - 优质品牌商家
  • 2026年知名的碟片式焊接波纹管工厂推荐:碟片式焊接波纹管源头工厂推荐 - 品牌宣传支持者
  • 川内招聘找工作服务品牌推荐指南:普工劳务派遣、正规劳务外包、短期工劳务外包、短期工找工作、高薪招聘找工作、保安劳务派遣外包选择指南 - 优质品牌商家
  • 全国专业烤漆门优质厂家推荐榜:强化门墙柜、推拉门墙柜、无烤漆门、民宿烤漆门、环保烤漆门、门墙柜一体、门墙柜定制选择指南 - 优质品牌商家
  • 投研人如何养“虾“?
  • 2026成都名包回收靠谱机构推荐指南:同城上门名包回收、名牌包回收、奢侈品包包回收、宝格丽名包回收、欧米茄名表回收选择指南 - 优质品牌商家
  • 大模型和芯片工程师都会犯错——凭什么用零缺陷标准要求前者?
  • ChatGPT:人工智能对话引擎的演进与影响
  • 2026手游平台搭建服务商推荐榜:手游平台系统、手游联运平台系统、搭建手游平台、游戏联运平台、游戏聚合发行系统选择指南 - 优质品牌商家
  • 2026高性价比三维数字孪生定制厂家推荐榜:三维数字孪生定制、展厅多媒体、展厅电子沙盘、数字展厅设计选择指南 - 优质品牌商家
  • 2026年热门的活动脚手架厂家推荐:脚手架搭设实力工厂推荐 - 品牌宣传支持者
  • 2026年比较好的施工围挡工厂推荐:施工围挡厂家精选 - 品牌宣传支持者
  • NumPy:ndarray 数组属性
  • WinClaw CLI 工具开发指南
  • 2026环保开关连接器优质供应商推荐指南:沉板开关、硅胶开关、精密连接器、翻盖式连接器、薄膜开关、超薄连接器、镀金连接器选择指南 - 优质品牌商家
  • 告别OSPF!EVE-NG专业版+BGP Unnumbered打通Underlay的完整实战
  • 川渝鄂名表维修保养公司推荐指南:名表保养维修价格电话、名表保养维修服务电话、名表保养维修门店电话、奢侈品回收公司电话选择指南 - 优质品牌商家
  • Debian/Ubuntu 18.04 上安装 GLIBC 2.28 (2026)
  • 2026年薯类深加工全粉设备优质品牌推荐:雪花全粉辊筒干燥机/预糊化淀粉辊筒干燥机/马铃薯全粉加工设备/马铃薯全粉生产线/选择指南 - 优质品牌商家
  • 2026连接器优质供应商推荐榜适配多行业需求:翻盖式连接器、薄膜开关、超薄连接器、镀金连接器、防尘开关、防水开关选择指南 - 优质品牌商家
  • 在Linux x86_64系统中编译mission
  • 威拉里发布多款金属3D打印新材料!三期项目与国外工厂全力推进!