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

我知道使用 EVALSHA 运行 Lua 脚本的常见方式是先使用 SCRIPT LOAD 加载脚本。但是,据我了解,如果 Redis 服务器意外重启,缓存的脚本将不再存在,需要使用 SCRIPT LOAD 重新加载。

是否有一些方法可以设置 Redis 服务器,在启动时自动从文件中加载一些指定的 Lua 脚本到其缓存中,以便可以可靠地使用 EVALSHA 执行,而不必担心脚本可能被卸载?

点赞
用户1334561
用户1334561

这与 RDBMS 中的存储过程不同,这些加载的脚本不会被 Redis 服务器存储,它们只是被缓存。因此,一旦服务器重新启动,加载的脚本将会消失。

有两种可能的方式:

第一次执行脚本时(即第一次使用 EVAL 运行),提供脚本的完整文本,之后可以使用 EVALSHA 进行所有后续调用。

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

如果某个脚本不存在,则可以使用 SCRIPT EXISTS 检查其是否存在,并使用 SCRIPT LOAD 加载该脚本。

检查脚本是否存在:

SCRIPT EXISTS sha1 sha2 ... shaN

加载脚本:

SCRIPT LOAD script

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

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

更多信息:

2019-05-10 19:55:04
用户7286223
用户7286223

感谢 Curtis Yallop 发表的评论,我终于可以使用下面这个命令来加载 myscript.lua 文件了。对于我的情况,

$(cat myscript.lua)

会引起错误,显示 "$" 是未知字符。

redis-cli -x script load < myscript.lua

对我起作用 :)

2021-07-10 20:35:57
用户7507
用户7507

欢迎来到未来!Redis 7 版本拥有能够实现以下内容的 FUNCTIONS:

https://redis.io/docs/manual/programmability/functions-intro/

2022-12-16 21:08:31