COMMAND
COMMAND
- 可用版本
- Redis 开源版 2.8.13
- 时间复杂度
- O(N),其中 N 是 Redis 命令总数
- ACL 类别
-
@slow
,@connection
,
返回一个数组,其中包含每个 Redis 命令的详细信息。
COMMAND
命令是内省的。其回复描述了服务器可以处理的所有命令。Redis 客户端可以在握手期间调用它来获取服务器的运行时能力。
COMMAND
命令还有几个子命令。请参阅其子命令以获取更多详细信息。
集群说明:此命令对于具备集群感知能力的客户端特别有用。此类客户端必须识别命令中的键名,以便将请求路由到正确的分片。尽管大多数命令将其第一个参数作为单个键接受,但此规则存在许多例外。您可以调用 COMMAND
命令,然后在客户端中缓存命令与其各自的键规范规则之间的映射。
其返回的回复是一个数组,其中每个命令都有一个元素。描述 Redis 命令的每个元素本身都表示为一个数组。
命令的数组由固定数量的元素组成。数组中元素的精确数量取决于服务器的版本。
- 名称
- Arity(参数数量)
- 标志
- 第一个键
- 最后一个键
- 步长
- ACL 类别(Redis 6.0 及更高版本)
- 提示(Redis 7.0 及更高版本)
- 键规范(Redis 7.0 及更高版本)
- 子命令(Redis 7.0 及更高版本)
名称
这是命令的小写名称。
注意:Redis 命令名称不区分大小写。
Arity(参数数量)
Arity(参数数量)是命令期望的参数个数。它遵循一个简单的模式:
- 正整数表示固定数量的参数。
- 负整数表示最小数量的参数。
命令的 arity 总是包含 命令本身的名称(以及适用的子命令)。
示例
GET
命令的 arity 是 2,因为它只接受一个参数,并且格式始终为GET _key_
。MGET
命令的 arity 是 -2,因为它接受至少一个参数,但也可能接受多个参数:MGET _key1_ [key2] [key3] ...
。
标志
命令标志是一个数组。它可以包含以下简单字符串(状态回复):
- admin: 命令是一个管理命令。
- asking: 即使在哈希槽迁移期间也允许执行此命令。此标志与 Redis Cluster 部署相关。
- blocking: 命令可能会阻塞请求客户端。
- denyoom: 如果服务器内存使用过高,则拒绝执行此命令(参见 maxmemory 配置指令)。
- fast: 命令在常数时间或 log(N) 时间内运行。此标志用于通过
LATENCY
命令监控延迟。 - loading: 数据库加载时允许执行此命令。
- movablekeys: 第一个键、最后一个键和步长值无法确定所有键的位置。在这种情况下,客户端需要使用
COMMAND GETKEYS
命令或 键规范。请参阅下文了解更多详细信息。 - no_auth: 执行此命令无需身份验证。
- no_async_loading: 在异步加载期间(即副本使用无盘
SWAPDB SYNC
并允许访问旧数据集时)拒绝执行此命令。 - no_mandatory_keys: 命令可能接受键名参数,但这些参数不是强制性的。
- no_multi: 不允许在事务上下文内执行此命令。
- noscript: 无法从脚本或函数中调用此命令。
- pubsub: 此命令与 Redis Pub/Sub 相关。
- random: 命令返回随机结果,这在逐字脚本复制中是一个问题。从 Redis 7.0 起,此标志成为命令提示。
- readonly: 命令不修改数据。
- sort_for_script: 从脚本中调用命令时,其输出会排序。
- skip_monitor: 命令不会显示在
MONITOR
的输出中。 - skip_slowlog: 命令不会显示在
SLOWLOG
的输出中。从 Redis 7.0 起,此标志成为命令提示。 - stale: 当副本数据陈旧时允许执行此命令。
- write: 命令可能会修改数据。
movablekeys(可移动键)
考虑 SORT
命令
1) 1) "sort"
2) (integer) -2
3) 1) write
2) denyoom
3) movablekeys
4) (integer) 1
5) (integer) 1
6) (integer) 1
...
某些 Redis 命令没有预定的键位置,或者不容易找到。对于这些命令,movablekeys 标志表示 第一个键、最后一个键和步长值不足以找到所有键。
以下是带有 movablekeys 标志的一些命令示例:
SORT
: 可选的 STORE, BY 和 GET 修饰符后面跟着键的名称。ZUNION
: numkeys 参数指定键名参数的数量。MIGRATE
: 键出现在 KEYS 关键字后面,并且仅当第二个参数是空字符串时。
Redis Cluster 客户端需要采用以下其他方法来定位此类命令的键。
您可以使用 COMMAND GETKEYS
命令,让您的 Redis 服务器报告给定命令调用中的所有键。
从 Redis 7.0 起,客户端可以使用键规范来识别键名的位置。对于解析键规范的客户端,唯一需要使用 COMMAND GETKEYS
的命令是 SORT
和 MIGRATE
。
有关更多信息,请参阅键规范页面。
第一个键
命令第一个键名参数的位置。对于大多数命令,第一个键的位置是 1。位置 0 始终是命令名称本身。
最后一个键
命令最后一个键名参数的位置。Redis 命令通常接受一个、两个或多个键。
接受单个键的命令,其 第一个键 和 最后一个键 都设置为 1。
接受两个键名参数的命令,例如 BRPOPLPUSH
、SMOVE
和 RENAME
,此值设置为其第二个键的位置。
接受任意数量键的多键命令,例如 MSET
,使用值 -1。
步长
第一个键与下一个键位置之间的步长或增量。
考虑以下两个示例:
1) 1) "mset"
2) (integer) -3
3) 1) write
2) denyoom
4) (integer) 1
5) (integer) -1
6) (integer) 2
...
1) 1) "mget"
2) (integer) -2
3) 1) readonly
2) fast
4) (integer) 1
5) (integer) -1
6) (integer) 1
...
步长计数使我们能够找到键的位置。例如 MSET
:其语法是 MSET _key1_ _val1_ [key2] [val2] [key3] [val3]...
,因此键位于每隔一个位置(步长值为 2)。与使用步长值为 1 的 MGET
不同。
ACL 类别
这是一个简单字符串数组,表示命令所属的 ACL 类别。有关更多信息,请参阅访问控制列表页面。
命令提示
有关命令的有用信息。供客户端/代理使用。
有关更多信息,请查看命令提示页面。
键规范
这是一个数组,包含命令的键规范。数组中的每个元素都是一个映射,描述了在命令参数中查找键的方法。
有关更多信息,请查看键规范页面。
子命令
这是一个数组,包含命令的所有子命令(如果有)。一些 Redis 命令有子命令(例如,CONFIG
命令的 REWRITE
子命令)。数组中的每个元素代表一个子命令,并遵循与 COMMAND
回复相同的规范。
示例
以下是 COMMAND
命令针对 GET
命令的输出:
1) 1) "get"
2) (integer) 2
3) 1) readonly
2) fast
4) (integer) 1
5) (integer) 1
6) (integer) 1
7) 1) @read
2) @string
3) @fast
8) (empty array)
9) 1) 1) "flags"
2) 1) read
3) "begin_search"
4) 1) "type"
2) "index"
3) "spec"
4) 1) "index"
2) (integer) 1
5) "find_keys"
6) 1) "type"
2) "range"
3) "spec"
4) 1) "lastkey"
2) (integer) 0
3) "keystep"
4) (integer) 1
5) "limit"
6) (integer) 0
10) (empty array)
...