EVAL script numkeys [key [key ...]] [arg [arg ...]]

从 2.6.0 开始可用。

时间复杂度:取决于执行的脚本。

调用服务器端 Lua 脚本的执行。

第一个参数是脚本的源代码。脚本是用Lua编写的,并由Redis 中的嵌入式Lua 5.1解释器执行。

第二个参数是输入键名称参数的数量,后跟脚本访问的所有键。这些输入键的名称可作为KEYS全局运行时变量用于脚本。 任何其他输入参数都不应代表键的名称。

重要提示: 为确保在独立部署和集群部署中正确执行脚本,必须将脚本访问的所有键名显式提供为输入键参数。该脚本应该只访问名称作为输入参数给出的键。脚本不应该使用程序生成的名称或基于存储在数据库中的数据结构的内容来访问键。

有关 Lua 脚本的更多信息,请参阅Redis 可编程性和Eval 脚本简介。

例子
以下示例将运行一个脚本,该脚本返回它获取的第一个参数。

> EVAL "return ARGV[1]" 0 hello
"hello"

EVALSHA sha1 numkeys [key [key ...]] [arg [arg ...]]

从 2.6.0 开始可用。

时间复杂度:取决于执行的脚本。

通过其 SHA1 摘要评估服务器缓存中的脚本。

服务器使用SCRIPT LOAD命令缓存脚本。该命令在其他方面与EVAL相同。

有关 Lua 脚本的更多信息,请参阅Redis 可编程性和Eval 脚本简介。

EVALSHA_RO sha1 numkeys key [key ...] arg [arg ...]

自 7.0.0 起可用。

时间复杂度:取决于执行的脚本。

这是EVALSHA命令的只读变体,无法执行修改数据的命令。

与EVALSHA不同,使用此命令执行的脚本始终可以被终止,并且永远不会影响复制流。因为它只能读取数据,所以这个命令总是可以在master或replica上执行。

有关EVALSHA脚本的更多信息,请参阅Eval 脚本简介。

EVAL_RO script numkeys key [key ...] arg [arg ...]

自 7.0.0 起可用。

时间复杂度:取决于执行的脚本。

这是EVAL命令的只读变体,无法执行修改数据的命令。

与EVAL不同,使用此命令执行的脚本始终可以被终止并且永远不会影响复制流。因为脚本只能读取数据,所以这个命令总是可以在master或者replica上执行。

有关EVAL脚本的更多信息,请参阅EVAL 脚本简介。

例子

> SET mykey "Hello"
OK

> EVAL_RO "return redis.call('GET', KEYS[1])" 1 mykey
"Hello"

> EVAL_RO "return redis.call('DEL', KEYS[1])" 1 mykey
(error) ERR Error running script (call to b0d697da25b13e49157b2c214a4033546aba2104): @user_script:1: @user_script: 1: Write commands are not allowed from read-only scripts.

FCALL function numkeys key [key ...] arg [arg ...]

自 7.0.0 起可用。

时间复杂度:取决于执行的功能。

调用一个函数。

使用FUNCTION LOAD命令将函数加载到服务器。第一个参数是加载函数的名称。

第二个参数是输入键名参数的数量,后跟函数访问的所有键。在 Lua 中,这些输入键的名称可作为回调函数的第一个参数的表提供给函数。

重要提示: 为确保在独立部署和集群部署中正确执行函数,必须明确提供函数访问的所有键名作为输入键参数。该函数应该只访问名称作为输入参数给出的键。函数不应该使用以编程方式生成的名称或基于存储在数据库中的数据结构的内容来访问键。

任何额外的输入参数都不应代表键名。这些是常规参数,并作为回调的第二个参数在 Lua 表中传递。

有关更多信息,请参阅Redis 可编程性和Redis 函数简介页面。

例子

下面的示例将创建一个以mylib单个函数命名的库,该函数myfunc返回它获取的第一个参数。

redis> FUNCTION LOAD Lua mylib "redis.register_function('myfunc', function(keys, args) return args[1] end)"
OK
redis> FCALL myfunc 0 hello
"hello"

FCALL_RO function numkeys key [key ...] arg [arg ...]

自 7.0.0 起可用。

时间复杂度:取决于执行的功能。

这是FCALL命令的只读变体,无法执行修改数据的命令。

有关更多信息,请参阅Redis 函数简介。

FUNCTION DELETE library-name

自 7.0.0 起可用。

时间复杂度: O(1)

删除库及其所有功能。

此命令删除名为library-name的库及其中的所有函数。如果库不存在,服务器将返回错误。

有关更多信息,请参阅Redis 函数简介。

返回值

简单的字符串回复

例子

redis> FUNCTION LOAD Lua mylib "redis.register_function('myfunc', function(keys, args) return 'hello' end)"
OK
redis> FCALL myfunc 0
"hello"
redis> FUNCTION DELETE mylib
OK
redis> FCALL myfunc 0
(error) ERR Function not found

FUNCTION DUMP

自 7.0.0 起可用。

时间复杂度: O(N) 其中 N 是函数的数量

返回已加载库的序列化有效负载。您可以稍后使用FUNCTION RESTORE命令恢复序列化的有效负载。

有关更多信息,请参阅Redis 函数简介。

返回值

批量字符串回复:序列化的有效载荷

例子

以下示例显示如何使用FUNCTION DUMP转储加载的库,然后调用FUNCTION FLUSH删除所有库。然后,它使用FUNCTION RESTORE从序列化的有效负载中恢复原始库。

redis> FUNCTION DUMP
"\xf6\x05mylib\x03LUA\x00\xc3@D@J\x1aredis.register_function('my@\x0b\x02', @\x06`\x12\x11keys, args) return`\x0c\a[1] end)\n\x00@\n)\x11\xc8|\x9b\xe4"
redis> FUNCTION FLUSH
OK
redis> FUNCTION RESTORE "\xf6\x05mylib\x03LUA\x00\xc3@D@J\x1aredis.register_function('my@\x0b\x02', @\x06`\x12\x11keys, args) return`\x0c\a[1] end)\n\x00@\n)\x11\xc8|\x9b\xe4"
OK
redis> FUNCTION LIST
1) 1) "library_name"
   2) "mylib"
   3) "engine"
   4) "LUA"
   5) "description"
   6) (nil)
   7) "functions"
   8) 1) 1) "name"
         2) "myfunc"
         3) "description"
         4) (nil)

FUNCTION FLUSH [ASYNC|SYNC]

自 7.0.0 起可用。

时间复杂度: O(N) 其中 N 是删除的函数数

删除所有库。

除非使用可选模式参数调用,否则lazyfree-lazy-user-flush配置指令会设置有效行为。有效模式是:

  • ASYNC:异步刷新库。
  • SYNC:同步刷新库。
    有关更多信息,请参阅Redis 函数简介。

返回值

简单的字符串回复

FUNCTION KILL

自 7.0.0 起可用。

时间复杂度: O(1)

杀死当前正在执行的函数。

FUNCTION KILL命令只能用于在执行期间未修改数据集的函数(因为停止只读函数不会违反脚本引擎保证的原子性)。

有关更多信息,请参阅Redis 函数简介。

返回值

简单的字符串回复

FUNCTION LIST [LIBRARYNAME library-name-pattern] [WITHCODE]

自 7.0.0 起可用。

时间复杂度: O(N) 其中 N 是函数的数量

返回有关函数和库的信息。

您可以使用可选LIBRARYNAME参数来指定匹配库名称的模式。可选WITHCODE修饰符将导致服务器在回复中包含库源实现。

响应中为每个库提供了以下信息:

  • library_name:库的名称。
  • engine:库的引擎。
  • 描述:库的描述。
  • 函数:库中的函数列表。每个函数都有以下字段:
    • 名称:函数的名称。
    • 描述:函数的描述。
    • flags:函数标志数组。
  • library_code:库的源代码(当给定WITHCODE修饰符时)。
    有关更多信息,请参阅Redis 函数简介。

返回值

数组回复

FUNCTION LOAD engine-name library-name [REPLACE] [DESCRIPTION library-description] function-code

自 7.0.0 起可用。

时间复杂度: O(1)(考虑编译时间是多余的)

将库加载到 Redis。

该命令的第一个参数engine-name是库的执行引擎的名称。目前,Redis 只支持Lua引擎。

library-name参数是库的唯一名称。接下来是实现该库的源代码。对于 Lua 引擎,实现应该使用redis.register_function()API声明库的一个或多个入口点。加载后,您可以使用FCALL(或FCALL_RO适用时)命令调用库中的函数。

尝试加载名称已存在的库时,Redis 服务器会返回错误。修饰符更改此行为并用REPLACE新内容覆盖现有库。

您还可以使用可选DESCRIPTION参数将描述附加到库。

该命令将在以下情况下返回错误:

  • 提供了无效的引擎名称。
  • 库的名称已经存在而没有REPLACE修饰符。
  • 库中的函数是使用另一个库中已经存在的名称创建的(即使REPLACE已指定)。
  • 引擎未能创建库的函数(例如,由于编译错误)。
  • 库没有声明任何函数。

有关更多信息,请参阅Redis 函数简介。

返回值

简单的字符串回复

例子

下面的示例将创建一个以mylib单个函数命名的库,该函数myfunc返回它获取的第一个参数。

redis> FUNCTION LOAD Lua mylib "redis.register_function('myfunc', function(keys, args) return args[1] end)"
OK
redis> FCALL myfunc 0 hello
"hello"

FUNCTION RESTORE serialized-value [FLUSH|APPEND|REPLACE]

自 7.0.0 起可用。

时间复杂度: O(N),其中 N 是有效载荷上的函数数

从序列化的有效负载中恢复库。

您可以使用可选的策略参数来提供处理现有库的策略。允许以下策略:

  • APPEND:将恢复的库附加到现有库并在发生冲突时中止。这是默认策略。
  • FLUSH:在恢复有效负载之前删除所有现有库。
  • REPLACE:将恢复的库附加到现有库,在名称冲突的情况下替换任何现有库。请注意,此策略不会阻止函数名称冲突,只会阻止库。

有关更多信息,请参阅Redis 函数简介。

返回值

简单的字符串回复

FUNCTION STATS

自 7.0.0 起可用。

时间复杂度: O(1)

返回有关当前正在运行的函数的信息以及有关可用执行引擎的信息。

回复是带有两个键的地图:

  1. running_script:关于运行脚本的信息。如果没有 in-flight 函数,服务器会回复nil。否则,这是具有以下键的映射:
    • 名称:函数的名称。
    • command:用于调用函数的命令和参数。
    • duration_ms:函数的运行时持续时间,以毫秒为单位。
  2. engines: 这是地图的地图。地图中的每个条目都代表一个引擎。引擎图包含有关引擎的统计信息,例如函数数量和库数量。
    您可以使用此命令检查长时间运行的函数的调用,并决定是否使用FUNCTION KILL命令将其终止。

有关更多信息,请参阅Redis 函数简介。

返回值

数组回复

SCRIPT DEBUG YES|SYNC|NO

自 3.2.0 起可用。

时间复杂度: O(1)

为使用EVAL执行的后续脚本设置调试模式。Redis 包含一个完整的 Lua 调试器,代号 LDB,可用于简化编写复杂脚本的任务。在调试模式下,Redis 充当远程调试服务器和客户端,例如redis-cli,可以逐步执行脚本、设置断点、检查变量等 - 有关 LDB 的更多信息,请参阅Redis Lua 调试器页面。

重要提示:避免使用 Redis 生产服务器调试 Lua 脚本。请改用开发服务器。

LDB 可以在以下两种模式之一中启用:异步或同步。在异步模式下,服务器会创建一个不会阻塞的分叉调试会话,并且在会话完成后对数据的所有更改都会回滚,因此可以使用相同的初始状态重新启动调试。当调试会话处于活动状态时,备用同步调试模式会阻塞服务器,并在结束后保留​​对数据集的所有更改。

  • YES. 启用 Lua 脚本的非阻塞异步调试(丢弃更改)。
  • SYNC. 启用 Lua 脚本的阻塞同步调试(保存对数据的更改)。
  • NO. 禁用脚本调试模式。

有关EVAL脚本的更多信息,请参阅EVAL 脚本简介。

返回值

简单的字符串回复:OK。

SCRIPT EXISTS sha1 [sha1 ...]

从 2.6.0 开始可用。

时间复杂度: O(N),N 是要检查的脚本数量(因此检查单个脚本是 O(1) 操作)。

返回有关脚本缓存中存在的脚本的信息。

此命令接受一个或多个 SHA1 摘要并返回一列或零的列表,以表明脚本是否已定义或不在脚本缓存中。这在流水线操作之前很有用,以确保加载脚本(如果没有,则使用SCRIPT LOAD加载它们),以便可以仅使用EVALSHA而不是EVAL来执行流水线操作以节省带宽。

有关EVAL脚本的更多信息,请参阅EVAL 脚本简介。

返回值

数组回复该命令返回与指定的 SHA1 摘要参数相对应的整数数组。对于脚本缓存中实际存在的脚本的每个相应的 SHA1 摘要,返回 1,否则返回 0。

SCRIPT FLUSH [ASYNC|SYNC]

从 2.6.0 开始可用。

时间复杂度: O(N),其中 N 是缓存中的脚本数量

刷新 Lua 脚本缓存。

默认情况下,SCRIPT FLUSH将同步刷新缓存。从 Redis 6.2 开始,将lazyfree-lazy-user-flush配置指令设置为“yes”会将默认刷新模式更改为异步。

可以使用以下修饰符之一来明确规定冲洗模式:

  • ASYNC: 异步刷新缓存
  • SYNC: 同步刷新缓存

有关EVAL脚本的更多信息,请参阅EVAL 脚本简介。

返回值

简单的字符串回复

历史

  • Redis 版本 >= 6.2.0:添加了 ASYNCSYNC 刷新模式修饰符,以及 lazyfree-lazy-user-flush 配​​置指令。

SCRIPT KILL

从 2.6.0 开始可用。

时间复杂度: O(1)

终止当前正在执行的EVAL脚本,假设脚本尚未执行任何写入操作。

此命令主要用于终止运行时间过长的脚本(例如,因为错误而进入无限循环)。该脚本将被终止,当前被阻止进入 EVAL 的客户端将看到返回错误的命令。

如果脚本已经执行过写操作,则不能以这种方式杀死它,因为这会违反 Lua 的脚本原子性契约。在这种情况下,只能SHUTDOWN NOSAVE杀死脚本,硬性地杀死Redis进程并防止它保留半写的信息。

有关EVAL脚本的更多信息,请参阅EVAL 脚本简介。

返回值

简单的字符串回复

SCRIPT LOAD script

从 2.6.0 开始可用。

时间复杂度: O(N),其中 N 是脚本主体的字节长度。

将脚本加载到脚本缓存中,而不执行它。将指定的命令加载到脚本缓存后,它将可以使用EVALSHA和正确的脚本 SHA1 摘要调用,就像在第一次成功调用EVAL之后一样。

该脚本保证永远留在脚本缓存中(除非SCRIPT FLUSH被调用)。

即使脚本已经存在于脚本缓存中,该命令也以相同的方式工作。

有关EVAL脚本的更多信息,请参阅EVAL 脚本简介。

返回值

批量字符串回复此命令返回添加到脚本缓存中的脚本的 SHA1 摘要。