Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

  • Spring

  • SpringCloud

  • MySQL

  • Redis

    • redis的槽

      • redis的槽
        • 1. 什么是槽(Slot)?
        • 2. 槽如何分配?
        • 3. 键如何映射到槽?
        • 4. 槽的迁移与平衡
          • (1)为什么需要迁移槽?
          • (2)手动迁移槽
        • 5. 槽 vs. 一致性哈希
        • 6. 关键注意事项
        • 7. 示例:3主3从集群的槽分配
          • 总结
      • 使用redis存key时,存到哪个主节点是怎么决定的
    • 集群搭建

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Redis
  • redis的槽
plantre
2025-06-19
目录

redis的槽

# Redis 槽(Slot)详解

Redis Cluster 使用 哈希槽(Hash Slot) 机制来分片(Sharding)数据,这是其实现分布式数据存储的核心设计。以下是关键概念解析:


# 1. 什么是槽(Slot)?

  • 定义:Redis Cluster 将整个数据集划分为 16384 个槽(编号 0-16383),每个键通过哈希计算映射到其中一个槽。
  • 作用:
    • 数据分片:不同槽的数据存储在不同的主节点上。
    • 负载均衡:槽均匀分布,避免单节点压力过大。
    • 动态扩缩容:通过迁移槽实现节点增减。

# 2. 槽如何分配?

  • 默认规则:

    • 集群初始化时,16384 个槽会 均匀分配 给所有主节点。
    • 例如:3 个主节点,每个节点大约负责 5461 个槽:
      • 节点A:0-5460
      • 节点B:5461-10922
      • 节点C:10923-16383
  • 查看槽分配:

    redis-cli -h 10.143.143.101 -p 7000 CLUSTER SLOTS
    
    1

    输出示例:

    1) 1) (integer) 0          # 起始槽
       2) (integer) 5460       # 结束槽
       3) 1) "10.143.143.101"  # 主节点IP
          2) (integer) 7000    # 主节点端口
       4) 1) "10.143.143.102"  # 从节点IP
          2) (integer) 7003    # 从节点端口
    
    1
    2
    3
    4
    5
    6

# 3. 键如何映射到槽?

  • 计算公式:

    slot = CRC16(key) % 16384
    
    1
    • CRC16 是 Redis 使用的哈希算法。
    • 例如:键 user:100 的哈希值模 16384 决定它属于哪个槽。
  • 手动计算槽:

    redis-cli -h 10.143.143.101 -p 7000 CLUSTER KEYSLOT "user:100"
    
    1

    输出:

    (integer) 14982  # 该键属于槽 14982
    
    1

# 4. 槽的迁移与平衡

# (1)为什么需要迁移槽?

  • 扩容:新增主节点时,需从其他节点转移部分槽给它。
  • 缩容:删除主节点前,需将其负责的槽迁移到其他节点。
  • 负载均衡:某些节点负载过高时,手动调整槽分布。

# (2)手动迁移槽

redis-cli --cluster reshard 10.143.143.101:7000
1

交互流程:

  1. 输入要迁移的槽数量(如 1000)。
  2. 输入目标节点ID(接收槽的节点)。
  3. 输入源节点ID(all 表示从所有节点抽取,或指定单个节点)。
  4. 确认迁移。

# 5. 槽 vs. 一致性哈希

特性 Redis 槽 一致性哈希(如 Twemproxy)
分片粒度 固定 16384 槽 虚拟节点(通常更多)
动态扩缩容 需手动迁移槽 自动重新哈希,但数据可能丢失
数据均衡 槽均匀分配,强制均衡 依赖哈希函数,可能不均匀
复杂度 高(需管理槽分配) 低(客户端透明)

# 6. 关键注意事项

  1. 槽覆盖所有数据:

    • 集群必须分配完所有 16384 个槽,否则部分数据无法读写。
    • 检查未分配槽:
      redis-cli --cluster check 10.143.143.101:7000 | grep "\[ERR\]"
      
      1
  2. 避免单点故障:

    • 每个主节点应有至少一个从节点(复制其槽数据)。
  3. 客户端重定向:

    • 如果客户端访问错误的节点,会收到 MOVED 或 ASK 响应,需支持自动跳转。

# 7. 示例:3主3从集群的槽分配

主节点 从节点 槽范围
10.143.143.101:7000 10.143.143.102:7003 0-5460
10.143.143.102:7002 10.143.143.103:7005 5461-10922
10.143.143.103:7004 10.143.143.101:7001 10923-16383

# 总结

  • 槽是 Redis Cluster 分片的基本单位,共 16384 个。
  • 键通过哈希映射到槽,槽再绑定到具体节点。
  • 扩缩容需手动迁移槽,但可通过工具(如 redis-cli --cluster rebalance)辅助。
  • 设计目标:在数据分片和负载均衡之间取得平衡,同时支持动态调整。
编辑 (opens new window)
上次更新: 2025/06/24, 00:41:57
FOR UPDATE锁类型
使用redis存key时,存到哪个主节点是怎么决定的

← FOR UPDATE锁类型 使用redis存key时,存到哪个主节点是怎么决定的→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式