我知道运行 Lua 脚本的常用方法EVALSHA是首先通过将脚本传递给SCRIPT LOAD. 但是,据我了解,如果 Redis 服务器意外重启,例如,缓存的脚本将不再存在,必须重新加载SCRIPT LOAD.
有没有办法设置 Redis 服务器在启动时自动将一些指定的 Lua 脚本从文件加载到它的缓存中,这样它们就可以可靠地执行而EVALSHA不必担心脚本可能被卸载?
感谢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)
为我工作:)
这与 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 哈希值的任何信息,但我不知道这种方法在分布式环境中也有困难。
更多信息: