Redis 命令提示
获取有关命令的更多信息
命令提示是一个字符串数组。 这些提示为Redis客户端提供了关于命令的额外信息。 这些信息可以指导Redis集群客户端在集群部署中如何执行命令以及如何处理其输出。
与命令的标志(参见COMMAND
回复的第三个元素)不同,这些标志严格用于服务器的内部操作,而提示除了向客户端报告外没有任何其他用途。
命令提示是任意字符串。 然而,以下部分描述了建议的提示,并展示了它们可能遵循的约定。
非确定性输出
此提示表明命令的输出不是确定性的。
这意味着使用相同的参数和数据调用命令可能会产生不同的结果。
这种差异可能是由于命令的随机性(例如,RANDOMKEY
和 SPOP
);调用的时间(例如,TTL
);或与服务器状态相关的通用差异(例如,INFO
和 CLIENT LIST
)。
注意: 在 Redis 7.0 之前,这个提示是 random 命令标志。
非确定性输出顺序
此提示的存在表明命令的输出是确定性的,但其顺序是随机的(例如,HGETALL
和 SMEMBERS
)。
注意: 在 Redis 7.0 之前,这个提示是 sort_for_script 标志。
请求策略
这个提示可以帮助客户端在集群模式下确定发送命令的分片。 客户端在没有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,因为它的所有键必须属于同一个哈希槽。 - 特殊: 表示客户端请求策略的一种非平凡形式,例如
SCAN
命令。
响应策略
这个提示可以帮助客户端确定他们需要从集群中多个分片的回复中计算的聚合。 没有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: 客户端应返回所有回复的逻辑与操作结果(仅适用于整数回复,通常来自返回0或1的命令)。
- agg_min: 客户端应返回回复中的最小值(仅适用于数值回复)。
例如,集群范围内的
WAIT
命令的聚合回复应为所有分片中的最小值(同步副本的数量)。 - agg_max: 客户端应从回复中返回最大值(仅适用于数值回复)。
- agg_sum: 客户端应返回回复的总和(仅适用于数值回复)。
示例:
DBSIZE
。 - 特殊: 这种类型的提示表示一种非平凡的回复策略形式。
INFO
是一个很好的例子。
Example
redis> 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)