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

时间:2017-07-30 23:28:58

标签: caching lua redis

我理解使用EVALSHA运行Lua脚本的常用方法是首先通过SCRIPT LOAD传递脚本来加载脚本。但是,根据我的理解,如果Redis服务器意外重新启动,例如,缓存的脚本将不再存在,并且必须使用SCRIPT LOAD重新加载。

是否有某种方法可以将Redis服务器设置为在启动时自动将某些指定的Lua脚本从文件加载到其缓存中,以便可以使用EVALSHA可靠地执行它们而无需担心脚本可能正在卸载?

2 个答案:

答案 0 :(得分:1)

感谢 Curtis Yallop 所做的评论我终于可以使用这个命令加载 myscript.lua 文件了。在我的情况下,“$(cat myscript.lua)”导致错误。说“$”是一个未知字符。

redis-cli -x script load < myscript.lua

为我工作:)

答案 1 :(得分:0)

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

2种可能的方式:

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

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

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

检查脚本是否存在:

SCRIPT EXISTS sha1 sha2 ... shaN

加载脚本:

SCRIPT LOAD script

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

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

更多信息: