我理解使用EVALSHA
运行Lua脚本的常用方法是首先通过SCRIPT LOAD
传递脚本来加载脚本。但是,根据我的理解,如果Redis服务器意外重新启动,例如,缓存的脚本将不再存在,并且必须使用SCRIPT LOAD
重新加载。
是否有某种方法可以将Redis服务器设置为在启动时自动将某些指定的Lua脚本从文件加载到其缓存中,以便可以使用EVALSHA
可靠地执行它们而无需担心脚本可能正在卸载?
答案 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哈希,但是我不喜欢这种方法,在分布式环境中也会遇到困难。
更多信息: