Redis 加载 Lua 脚本并从文件中缓存它(而不是 SCRIPT LOAD)

aba*_*haw 5 lua caching redis

我知道运行 Lua 脚本的常用方法EVALSHA是首先通过将脚本传递给SCRIPT LOAD. 但是,据我了解,如果 Redis 服务器意外重启,例如,缓存的脚本将不再存在,必须重新加载SCRIPT LOAD.

有没有办法设置 Redis 服务器在启动时自动将一些指定的 Lua 脚本从文件加载到它的缓存中这样它们就可以可靠地执行而EVALSHA不必担心脚本可能被卸载?

Rai*_*doy 8

感谢Curtis Yallop的评论,我终于可以使用此命令加载myscript.lua文件了。就我而言,

$(cat myscript.lua)
Run Code Online (Sandbox Code Playgroud)

导致错误。说“$”是未知字符。

redis-cli -x script load < myscript.lua
Run Code Online (Sandbox Code Playgroud)

为我工作:)


Muh*_*man 1

这与 RDBMS 中的存储过程不同。这些加载的脚本并不由redis服务器存储,它们只是被缓存。所以一旦服务器重新启动,加载的脚本就会消失。

2种可能的方式:

EVAL您为脚本的第一次执行(即第一次执行)提供脚本的全文,然后您可以将其用于EVALSHA所有后续调用。

EVALSHANOSCRIPT: No Matching script, Please Use [EVAL]如果此 SHA 摘要无效,则返回特殊错误,因此EVALSHA即使客户端实际发送,客户端也始终可以在后台乐观地发送EVAL。如果NOSCRIPT返回,EVAL将被使用。

如果脚本不存在, 您可以使用SCRIPT EXISTS并加载该脚本。SCRIPT LOAD

检查脚本是否存在:

SCRIPT EXISTS sha1 sha2 ... shaN
Run Code Online (Sandbox Code Playgroud)

加载脚本:

SCRIPT LOAD script
Run Code Online (Sandbox Code Playgroud)

或者应用程序的代码(包括Lua脚本)在应用程序端进行管理,如果脚本是小文本,则每次需要执行时都发送脚本,在这种情况下,您不需要在Redis端进行配置或执行任何操作。这在分布式环境和 Redis 集群环境中非常有用。

第三种方法,您可能希望通过在 Linux 中添加自定义启动脚本来更改行为,在 Linux 中启动 Redis 服务器,然后加载所有脚本,但是您的应用程序代码仍然不知道有关这些 SHA 哈希值的任何信息,但我不知道这种方法在分布式环境中也有困难。

更多信息: