非常教程

Redis参考手册

集合 | Cluster

cluster setslot

CLUSTER SETSLOT slot IMPORTING|MIGRATING|STABLE|NODE [node-id]

自3.0.0起可用。

时间复杂度: O(1)

CLUSTER SETSLOT 负责以不同方式更改接收节点中散列槽的状态。它可以取决于所使用的子命令:

1. MIGRATING子命令:设置迁移状态下的散列槽。

2. IMPORTING子命令:在导入状态下设置哈希槽。

3. STABLE 子命令:清除散列槽中的任何导入/迁移状态。

4. NODE 子命令:将哈希槽绑定到不同的节点。

该命令及其子命令集对于启动和结束集群实时重新分片操作很有用,它通过在源节点中设置迁移状态的哈希槽以及在目标节点中导入状态来完成。

下面介绍了每个子命令。最后你会找到如何使用这个命令和其他相关命令执行实时重新分片的描述。

CLUSTER SETSLOT <slot>迁移<destination-node-id>

此子命令将一个插槽设置为迁移状态。为了在此状态下设置一个插槽,接收命令的节点必须是散列插槽的所有者,否则会返回错误。

当插槽设置为迁移状态时,节点将按以下方式更改行为:

1. 如果收到关于现有密钥的命令,则通常会处理该命令。

2. 如果收到有关不存在的密钥的命令ASK,节点将发出重定向,要求客户端仅重试该特定查询destination-node。在这种情况下,客户端不应该将其哈希槽更新为节点映射。

3. 如果命令包含多个键,如果不存在,则行为与点2相同(如果全部存在),则与点1相同,但如果只存在部分键数,则该命令将按TRYAGAIN顺序发出错误对于有兴趣完成迁移到目标节点的密钥,以便可以执行多密钥命令。

集群SETSLOT <slot>导入<source-node-id>

此子命令反转MIGRATING并准备目标节点以从指定的源节点导入密钥。该命令仅适用于节点尚不是指定散列槽的所有者的情况。

当插槽在导入状态下设置时,节点以下列方式更改行为:

1. 关于这个散列槽的命令将被拒绝,并且MOVED通常会生成重定向,但是在命令跟在命令后面的ASKING情况下,将执行该命令。这样,当处于迁移状态的节点生成ASK重定向时,客户端会联系目标节点ASKING发送命令并立即发送命令。通过这种方式命令旧节点中不存在的密钥或已迁移到目标节点的密钥在目标节点中执行,以便:

2. 新密钥始终在目标节点中创建。在散列槽迁移期间,我们必须只移动旧密钥,而不是新密钥。

3. 为了保证一致性,已经迁移的关键字命令在作为迁移目标的节点(新散列槽所有者)的上下文中正确处理。

4. 没有ASKING这种行为就像平时一样。这可以确保具有散列槽插入映射的客户端不会在目标节点中写入错误,从而创建尚未被迁移的新版本密钥。

集群SETSLOT <slot>稳定

此子命令仅清除插槽中的迁移/导入状态。它主要用于修复被错误状态redis-trib fix卡住的簇。通常在迁移结束时使用SETSLOT ... NODE ...子命令自动清除这两个状态,如下一节所述。

集群SETSLOT <slot>节点<node-id>

NODE子命令是具有最复杂语义的子命令。它将哈希槽与指定节点相关联,但该命令仅在特定情况下起作用,并且根据槽状态具有不同的副作用。以下是该命令的一组前置条件和副作用:

1. 如果当前哈希槽所有者是接收命令的节点,但为了实现该命令,该槽将被分配给不同的节点,如果在接收该命令的节点中仍存在该哈希槽的密钥,则该命令将返回错误。

2. 如果插槽处于迁移状态,则当插槽分配给另一个节点时,该状态将被清除。

3. 如果插槽在接收命令的节点中处于导入状态,并且该命令将该插槽分配给该节点(在从一个节点到另一个节点的散列插槽重新分割结束时发生在目标节点中),则该命令具有以下副作用:A)导入状态被清除。B)如果节点配置历元还不是最大的群集,它会生成一个新的配置历元,并为其自身分配新的配置历元。这样,其新的哈希槽所有权将胜过以前的故障转移或槽迁移创建的任何过去的配置。

需要注意的是,步骤3是 Redis 集群节点在未经其他节点同意的情况下创建新配置历元的唯一时间。这仅在手动配置运行时发生。然而,这是不可能的,因为 Redis 集群使用配置时期冲突解决算法,所以这会创建一个非瞬时设置,其中两个节点具有相同的配置时期。

返回值

简单字符串回复:OK如果命令成功,则所有子命令都会返回。否则会返回错误。

Redis集群实时重新解析解释

CLUSTER SETSLOT 命令是 Redis Cluster 使用的一个重要组件,用于将一个哈希槽中包含的所有密钥从一个节点迁移到另一个节点。这就是迁移如何在其他命令的帮助下进行编排的。我们将调用当前散列槽所有权的source节点以及我们想要迁移destination节点的节点。

1. 使用CLUSTER SETSLOT <slot> IMPORTING <source-node-id>将目标节点插槽设置为导入状态。

2. 使用CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>将源节点插槽设置为迁移状态。

3. 使用 CLUSTER GETKEYSINSLOT 命令从源节点获取密钥,并使用 MIGRATE 命令将它们移动到目标节点中。

4. 使用CLUSTER SETSLOT <slot> NODE <destination-node-id>源或目标。

注意:

  • 步骤1和2的顺序很重要。我们希望目标节点ASK在源节点配置为重定向时准备好接受重定向。
  • 步骤4在技术上不需要使用SETSLOT在不涉及重新分割的节点中使用,因为配置最终会自我传播,但是这样做是一个好主意,以便阻止节点在被移动的散列插槽时指向错误的节点尽快,导致更少的重定向找到正确的节点。
Redis

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。 它通常被称为数据结构服务器,因为值( value )可以是 字符串( String ), 哈希(Map),列表(list),集合( sets ) 和 有序集合( sorted sets )等类型。

主页 https://redis.io/
源码 https://github.com/antirez/redis
发布版本 4.0.2

Redis目录

1.集合 | Cluster
2.连接 | Connection
3.Geo
4.Hashes
5.HyperLogLog
6.键 | Keys
7.列表 | Lists
8.Pub/Sub
9.脚本 | Scripting
10.服务器 | Server
11.设定 | Sets
12.排序集 | Sorted Sets
13.字符串 | Strings
14.事务 | Transactions
15.Redis Dump 命令
16.Redis DEL 命令
17.Redis 键(key)
18.Redis 命令
19.Redis 配置
20.Redis 简介
21.Redis RANDOMKEY 命令
22.Redis TTL 命令
23.Redis Pttl 命令
24.Redis PERSIST 命令
25.Redis Move 命令
26.Redis PEXPIREAT 命令
27.Redis Keys 命令
28.Redis Expireat 命令
29.Redis Expire 命令
30.Redis EXISTS 命令
31.Redis Mget 命令
32.Redis Getbit 命令
33.Redis Getset 命令
34.Redis Getrange 命令
35.Redis Get 命令
36.Redis SET 命令
37.Redis 字符串(String)
38.Redis Type 命令
39.Redis Renamenx 命令
40.Redis Rename 命令
41.Redis Incrby 命令
42.Redis Incr 命令
43.Redis Psetex 命令
44.Redis Msetnx 命令
45.Redis Mset 命令
46.Redis Strlen 命令
47.Redis Setrange 命令
48.Redis Setnx 命令
49.Redis Setex 命令
50.Redis Setbit 命令
51.Redis Hincrby 命令
52.Redis Hgetall 命令
53.Redis Hget 命令
54.Redis Hexists 命令
55.Redis Hdel 命令
56.Redis 哈希(Hash)
57.Redis Append 命令
58.Redis Decrby 命令
59.Redis Decr 命令
60.Redis Incrbyfloat 命令
61.Redis Blpop 命令
62.Redis 列表(List)
63.Redis Hvals 命令
64.Redis Hsetnx 命令
65.Redis Hset 命令
66.Redis Hmset 命令
67.Redis Hmget 命令
68.Redis Hlen 命令
69.Redis Hkeys 命令
70.Redis Hincrbyfloat 命令
71.Redis Lrem 命令
72.Redis Lrange 命令
73.Redis Lpushx 命令
74.Redis Lpush 命令
75.Redis Lpop 命令
76.Redis Llen 命令
77.Redis Linsert 命令
78.Redis Lindex 命令
79.Redis Brpoplpush 命令
80.Redis Brpop 命令
81.Redis Sdiff 命令
82.Redis Scard 命令
83.Redis Sadd 命令
84.Redis 集合(Set)
85.Redis Rpushx 命令
86.Redis Rpush 命令
87.Redis Rpoplpush 命令
88.Redis Rpop 命令
89.Redis Ltrim 命令
90.Redis Lset 命令
91.Redis Sunion 命令
92.Redis Srem 命令
93.Redis Srandmember 命令
94.Redis Spop 命令
95.Redis Smove 命令
96.Redis Smembers 命令
97.Redis Sismember 命令
98.Redis Sinterstore 命令
99.Redis Sinter 命令
100.Redis Sdiffstore 命令