COMMAND

用法
COMMAND
复杂度
O(N),其中 N 是命令的总数
2.8.13
ACL 类别
@connection, @slow

返回一个数组,其中包含每个 Valkey 命令的详细信息。

COMMAND 命令是自省的。它的回复描述了服务器可以处理的所有命令。Valkey 客户端可以在握手期间调用它来获取服务器的运行时能力。

COMMAND 也有几个子命令。有关更多详细信息,请参阅其子命令。

集群注意事项:此命令对于集群感知的客户端特别有用。此类客户端必须识别命令中的键名,以便将请求路由到正确的碎片。尽管大多数命令都接受单个键作为它们的第一个参数,但此规则存在许多例外。您可以调用 COMMAND,然后在客户端中缓存命令与其各自的键规范规则之间的映射。

它返回的回复是一个数组,其中每个命令有一个元素。描述 Valkey 命令的每个元素本身也表示为一个数组。

命令数组由固定数量的元素组成。数组中元素的精确数量取决于服务器的版本。

  1. 名称
  2. 参数数量
  3. 标志
  4. 第一个键
  5. 最后一个键
  6. 步长
  7. ACL 类别
  8. 提示
  9. 键规范
  10. 子命令

名称

这是命令的小写名称。

注意:Valkey 命令名称不区分大小写。

参数数量

参数数量是命令期望的参数数量。它遵循一个简单的模式

  • 正整数表示固定数量的参数。
  • 负整数表示最小数量的参数。

命令的参数数量总是包括命令本身的名称(以及适用的子命令)。

示例

  • GET 的参数数量是 2,因为该命令只接受一个参数,并且总是采用 GET _key_ 的格式。
  • MGET 的参数数量是 -2,因为该命令至少接受一个参数,但也可能接受多个参数:MGET _key1_ [key2] [key3] ...

标志

命令标志是一个数组。它可以包含以下简单字符串(状态回复)

  • admin: 该命令是管理命令。
  • asking: 即使在哈希槽迁移期间也允许执行该命令。此标志在 Valkey 集群部署中相关。
  • 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: 该命令与Valkey 发布/订阅相关。
  • random: 该命令返回随机结果,这在逐字脚本复制时是一个问题。此标志是一个命令提示
  • readonly: 该命令不修改数据。
  • sort_for_script: 从脚本调用时,该命令的输出会排序。
  • skip_monitor: 该命令不显示在 MONITOR 的输出中。
  • skip_slowlog: 该命令不显示在 SLOWLOG 的输出中。此标志是一个命令提示
  • stale: 当副本拥有陈旧数据时,允许执行该命令。
  • write: 该命令可能修改数据。

可移动键

考虑 SORT

1) 1) "sort"
   2) (integer) -2
   3) 1) write
      2) denyoom
      3) movablekeys
   4) (integer) 1
   5) (integer) 1
   6) (integer) 1
   ...

一些 Valkey 命令没有预定的键位置或不容易找到。对于这些命令,movablekeys 标志表示 first keylast keystep 值不足以找到所有键。

以下是带有 movablekeys 标志的几个命令示例

  • SORT:可选的 STOREBYGET 修饰符后跟键名。
  • ZUNIONnumkeys 参数指定键名参数的数量。
  • MIGRATE:键出现在 KEYS 关键字之后,并且仅当第二个参数为空字符串时。

Valkey 集群客户端需要使用以下其他方法来定位此类命令的键。

您可以使用 COMMAND GETKEYS 命令,让您的 Valkey 服务器报告给定命令调用中的所有键。

客户端可以使用键规范来识别键名的位置。对于解析键规范的客户端,唯一需要使用 COMMAND GETKEYS 的命令是 SORTMIGRATE

欲了解更多信息,请参阅键规范页面

第一个键

命令的第一个键名参数的位置。对于大多数命令,第一个键的位置是 1。位置 0 始终是命令名称本身。

最后一个键

命令的最后一个键名参数的位置。Valkey 命令通常接受一个、两个或多个键。

接受单个键的命令,其 first keylast key 都设置为 1。

接受两个键名参数的命令,例如 BRPOPLPUSHSMOVERENAME,此值设置为它们的第二个键的位置。

接受任意数量键的多键命令,例如 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)。与使用步长值 1MGET 不同。

ACL 类别

这是一个简单字符串的数组,这些字符串是命令所属的 ACL 类别。有关更多信息,请参阅访问控制列表页面。

命令提示

关于命令的有用信息。供客户端/代理使用。

有关更多信息,请查阅命令提示页面。

键规范

这是一个由命令键规范组成的数组。数组中的每个元素都是一个映射,描述了在命令参数中定位键的方法。

有关更多信息,请查阅键规范页面

子命令

这是一个数组,包含命令的所有子命令(如果有)。一些 Valkey 命令有子命令(例如 CONFIGREWRITE 子命令)。数组中的每个元素都代表一个子命令,并遵循与 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)
...

RESP2/RESP3 回复

数组回复:一个嵌套的命令详细信息列表。数组中命令的顺序是随机的。