Redis集群的键分布机制

news/2025/1/16 3:07:51/

Redis 集群的键分布机制基于哈希槽(Hash Slot),它是一种无中心的分布式哈希算法,用于确定键存储在哪个节点上。以下是 Redis 集群键分布机制的详细说明:

1、键分布基本原理

1.1 哈希槽的概念

  • Redis 集群将所有的键分布在 16384 个哈希槽(编号从 0 到 16383)中。
  • 每个节点负责一部分哈希槽。键通过哈希算法映射到某个哈希槽,再由负责该哈希槽的节点存储。

1.2 哈希算法

Redis 集群通过 CRC16 算法对键进行哈希,并对结果取模 16384 来计算哈希槽:

1.3 哈希槽与节点的映射

  • 集群中,每个节点负责一组连续的或不连续的哈希槽。
  • 例如:
    • 节点 A 负责哈希槽 0-5460
    • 节点 B 负责哈希槽 5461-10922
    • 节点 C 负责哈希槽 10923-16383

2、特殊键模式的处理

2.1 普通键

  • 如果键是一个普通字符串,直接对整个字符串进行哈希。
    • 例如,键 “user:1001” 映射到一个哈希槽。

2.2 使用{}的键

  • Redis 支持通过 {} 指定键的哈希部分,这样可以强制多个键映射到同一个哈希槽。
    • 仅对 {} 中的部分进行哈希计算。
    • 例如:
      • "user:{1001}:profile" "user:{1001}:settings" 都只对 {1001} 进行哈希,因此会映射到同一个哈希槽。
        用例
  • 这种机制用于键分组,保证一组相关的键分布在同一个节点上,适用于 MSET/MGET、事务、Lua 脚本等操作。

3、节点分布和迁移

3.1 初始分布

  • 当创建集群时,哈希槽在节点之间平均分配。
  • 可以使用 redis-cli --cluster create 命令自动完成初始分布。

3.2 数据迁移

  • 当添加或移除节点时,Redis 集群会通过重新分片(resharding)将哈希槽重新分配。
  • Redis 内置的数据迁移机制:
    • 使用 CLUSTER SETSLOT 和 MIGRATE 命令在节点之间移动键。
    • 例如,当哈希槽 5460 从节点 A 移动到节点 B 时,相关的键也会从节点 A 迁移到节点 B。

4. 数据一致性和多键操作

4.1 一致性保证

  • 一个键只能存储在一个节点上。
  • Redis 集群使用主从复制(Replication)保证数据的高可用性:
    • 每个主节点有一个或多个从节点。
    • 如果主节点宕机,从节点会被提升为主节点。

4.2 多键操作的限制

  • 多键操作(如 MSET/MGET 或事务)要求所有涉及的键在同一个哈希槽中。
  • 如果不在同一个哈希槽,Redis 会报错:
(error) CROSSSLOT Keys in request don't hash to the same slot
  • 解决方法:使用 {} 将相关键分组到同一个哈希槽。

5. 键分布示例

假设我们有以下键:

user:1001:name
user:1002:name
order:5001
order:{5001}:status
  • user:1001:name 的哈希槽:
CRC16("user:1001:name") % 16384 = 14239

例如,该键被分配到节点 C。

  • order:{5001}:status 和 order:{5001}:details:
    • 只对 {5001} 进行哈希计算,映射到同一个哈希槽。

6. 常用命令

6.1 查看键的哈希槽

redis-cli -c cluster keyslot <key>

示例:

redis-cli -c cluster keyslot "order:{5001}:status"

6.2 查看哈希槽分布

redis-cli -c cluster slots

6.3 迁移哈希槽

通过 redis-cli --cluster reshard 工具操作。

总结

  • Redis 集群的键分布机制通过 16384 个哈希槽实现。
  • 使用 {} 可以将相关键分配到同一个哈希槽,从而支持多键操作。
  • 哈希槽的分布由集群自动管理,节点之间支持动态迁移以适应集群规模的变化。

http://www.ppmy.cn/news/1563491.html

相关文章

android framework.jar 在应用中使用

在开发APP中&#xff0c;有时会使用系统提供的framework.jar 来替代 android.jar, 在gradle中配置如下&#xff1a; 放置framework.jar 依赖配置 3 优先级配置 gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet options.bootstrapClasspat…

关于使用FastGPT 摸索的QA

近期在通过fastGPT&#xff0c;创建一些基于特定业务场景的、相对复杂的Agent智能体应用。 工作流在AI模型的基础上&#xff0c;可以定义业务逻辑&#xff0c;满足输出对话之外的需求。 在最近3个月来的摸索和实践中&#xff0c;一些基于经验的小问题点&#xff08;自己也常常…

【高阶数据结构】布隆过滤器+海量数据处理

布隆过滤器 一.什么是布隆过滤器&#xff1f;二.布隆过滤器器误判率推导三.布隆过滤器代码实现四.布隆过滤器删除问题五.布隆过滤器的应用六.海量数据处理问题1.10亿个整数中求最大的前100个2.100亿个整数中&#xff0c;求某个整数是否出现3.给两个文件&#xff0c;分别有100亿…

PowerBuilder中调用Excel OLE对象的方法

在 PowerBuilder 中调用 Excel OLE 对象&#xff0c;首先使用 CREATE OLEObject 创建 Excel 实例&#xff0c;通过 ConnectToNewObject("Excel.Application") 连接。然后可以通过 ole_excel.Workbooks.Add() 创建新工作簿&#xff0c;操作工作表并保存文件。使用 ole…

MySQL程序之:简要概述

MySQL安装中有许多不同的程序。本节简要概述了它们。后面的部分提供了每个程序的更详细描述&#xff0c;但NDB集群程序除外。每个程序的描述表明了它的调用语法和它支持的选项。&#xff0c;“NDB集群程序”&#xff0c;描述了特定于NDB集群的程序。 大多数MySQL发行版包括所有…

C++笔记:打包独立运行的exe(在静态库中使用MFC)

从window7到window11都默认安装有C依赖库&#xff0c;见如下 但是一些企业用的特殊window版本可能没有这个依赖库&#xff0c;导致Visual Studio生成的exe无法运行&#xff08;报缺失dll&#xff09;&#xff0c;就需要打包生成时使用静态库依赖。 共两步&#xff1a; 第一步…

Spring Boot 项目启动后自动加载系统配置的多种实现方式

Spring Boot 项目启动后自动加载系统配置的多种实现方式 在 Spring Boot 项目中&#xff0c;可以通过以下几种方式实现 在项目启动完成后自动加载系统配置缓存操作 的需求&#xff1a; 1. 使用 CommandLineRunner CommandLineRunner 是一个接口&#xff0c;可以用来在 Spring…

【漫话机器学习系列】045.特征向量(Eigenvector)

特征向量&#xff08;Eigenvector&#xff09; 特征向量&#xff08;Eigenvector&#xff09; 是线性代数中的一个重要概念&#xff0c;与矩阵的特征值&#xff08;Eigenvalue&#xff09;密切相关。它在许多数学、物理和机器学习领域中起着关键作用&#xff0c;尤其是在主成分…