Redis 从文件加载 Lua 脚本并缓存它(而不是使用 SCRIPT LOAD)
2017-7-31 16:8:37
收藏:0
阅读:63
评论:3
我知道使用 EVALSHA 运行 Lua 脚本的常见方式是先使用 SCRIPT LOAD 加载脚本。但是,据我了解,如果 Redis 服务器意外重启,缓存的脚本将不再存在,需要使用 SCRIPT LOAD 重新加载。
是否有一些方法可以设置 Redis 服务器,在启动时自动从文件中加载一些指定的 Lua 脚本到其缓存中,以便可以可靠地使用 EVALSHA 执行,而不必担心脚本可能被卸载?
点赞
用户7286223
感谢 Curtis Yallop 发表的评论,我终于可以使用下面这个命令来加载 myscript.lua 文件了。对于我的情况,
$(cat myscript.lua)
会引起错误,显示 "$" 是未知字符。
redis-cli -x script load < myscript.lua
对我起作用 :)
2021-07-10 20:35:57
用户7507
欢迎来到未来!Redis 7 版本拥有能够实现以下内容的 FUNCTIONS:
https://redis.io/docs/manual/programmability/functions-intro/
2022-12-16 21:08:31
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

这与 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 哈希。但我不喜欢这种方法在分布式环境中也很困难。
更多信息:
https://redis.io/commands/eval
https://grokbase.com/t/gg/redis-db/12ce84e9b3/lua-script-at-startup