本页面介绍了 COMMAND
命令回复中的一小部分。在 COMMAND 命令的回复中,每个命令都由一个数组表示。该数组的第 8 个元素是命令提示。它是一个字符串数组。
这些提示为 Valkey 客户端提供了关于命令的额外信息。这些信息可以指导 Valkey 集群客户端如何在集群部署中执行命令并处理其输出。
与命令标志(请参阅 COMMAND
回复的第 3 个元素)不同,命令标志严格地是服务器内部操作的一部分,而提示除了向客户端报告之外没有其他用途。
nondeterministic_output
此提示表示命令的输出是非确定性的。这意味着即使使用相同的参数和数据,对该命令的调用也可能产生不同的结果。这种差异可能是由于命令的随机性(例如,RANDOMKEY
和 SPOP
);调用的时序(例如,TTL
);或与服务器状态相关的通用差异(例如,INFO
和 CLIENT LIST
)。
注意:在 Redis OSS 7.0 之前,此提示是 random
命令标志。
nondeterministic_output_order
此提示的存在表明命令的输出是确定性的,但其顺序是随机的(例如,HGETALL
和 SMEMBERS
)。
注意:在 Redis OSS 7.0 之前,此提示是 sort_for_script
标志。
request_policy:
value
此提示可以帮助客户端确定在集群模式下将命令发送到哪些分片。对于没有 request_policy
提示的命令,客户端应实现以下默认行为:
- 命令不接受键名参数:客户端可以在任意分片上执行该命令。
- 对于接受一个或多个键名参数的命令:客户端应根据输入键的哈希槽将命令路由到单个分片。
如果客户端应采用与默认行为不同的行为,则 request_policy
提示可以是以下之一:
- all_nodes: 客户端应在所有节点(包括主节点和副本节点)上执行该命令。一个例子是
CONFIG SET
命令。此提示适用于不接受键名参数的命令。该命令在每个分片上原子性地执行。
- all_shards: 客户端应在所有主分片上执行该命令(例如,
DBSIZE
命令)。此提示适用于不接受键名参数的命令。该命令在每个分片上原子性地执行。
- multi_shard: 客户端应在多个分片上执行该命令。客户端应根据输入键名参数的哈希槽来拆分输入。例如,命令
DEL {foo} {foo}1 bar
应该拆分为DEL {foo} {foo}1
和DEL bar
。如果键被哈希到多个槽,即使所有槽都由同一个分片管理,命令也必须拆分。此类命令的示例包括MSET
、MGET
和DEL
。但是请注意,SUNIONSTORE
不被视为 multi_shard,因为它的所有键都必须属于同一个哈希槽。 - special: 表示客户端请求策略的一种非平凡形式,例如
SCAN
命令。
response_policy:
value
此提示可以帮助客户端确定需要从集群中多个分片的回复中计算出的聚合结果。对于没有 request_policy
提示的命令的默认行为仅适用于具有嵌套类型(即数组、集合或映射)的回复。客户端对默认行为的实现应如下:
- 命令不接受键名参数:客户端可以将所有回复聚合到一个嵌套数据结构中。例如,我们对所有分片调用
KEYS
所获得的数组回复。这些回复应统一打包到一个结构中,不分特定顺序。 - 对于接受一个或多个键名参数的命令:客户端需要保留与输入键名相同的回复顺序。例如,
MGET
的聚合回复。
response_policy
提示适用于回复标量数据类型的命令,或者当期望客户端实现非默认聚合时。此提示可以是以下之一:
- one_succeeded: 如果至少有一个分片没有返回错误,客户端应返回成功。客户端应返回其获得的第一个非错误回复。如果所有分片都返回错误,客户端可以返回其中任何一个错误回复。例如,考虑一个发送到所有分片的
SCRIPT KILL
命令。尽管脚本应该加载到集群的所有分片中,但SCRIPT KILL
通常在任何给定时间只在一个分片上运行。 - all_succeeded: 客户端仅在没有错误回复的情况下才应成功返回。即使单个错误回复也应导致聚合结果无效并被返回。否则,客户端应返回其中一个非错误回复。例如,考虑
CONFIG SET
、SCRIPT FLUSH
和SCRIPT LOAD
命令。 - agg_logical_and: 客户端应返回所有回复的逻辑 AND 运算结果(仅适用于整数回复,通常来自返回 0 或 1 的命令)。以
SCRIPT EXISTS
命令为例。它返回一个由 0 和 1 组成的数组,表示其给定 SHA1 和在脚本缓存中是否存在。仅当所有分片都报告给定脚本 SHA1 和存在于其各自的缓存中时,聚合响应才应为 1。 - agg_logical_or: 客户端应返回所有回复的逻辑 OR 运算结果(仅适用于整数回复,通常来自返回 0 或 1 的命令)。
- agg_min: 客户端应返回回复中的最小值(仅适用于数字回复)。例如,集群范围的
WAIT
命令的聚合回复应为所有分片中的最小值(同步副本的数量)。 - agg_max: 客户端应返回回复中的最大值(仅适用于数字回复)。
- agg_sum: 客户端应返回回复的总和(仅适用于数字回复)。示例:
DBSIZE
。 - special: 此类提示表示回复策略的一种非平凡形式。
INFO
就是一个很好的例子。
示例
127.0.0.1:6379> command info ping
1) 1) "ping"
2) (integer) -1
3) 1) fast
4) (integer) 0
5) (integer) 0
6) (integer) 0
7) 1) @fast
2) @connection
8) 1) "request_policy:all_shards"
2) "response_policy:all_succeeded"
9) (empty array)
10) (empty array)