Redis如何减少lua的复制粘贴
2017-5-23 12:23:35
收藏:0
阅读:77
评论:1
我正在编写Redis内部的Lua逻辑,几乎每个脚本都有些共同的东西,将它们移动到共享函数中会非常方便,但存在以下问题:
- Redis无法使用Lua的require语句
- 不能正式调用其他Redis功能(参见:https://stackoverflow.com/a/22599862/1812225)
例如,我在每个地方都有这段代码:
local prefix = "/" .. type
if typeId then
prefix = prefix .. "(" .. typeId .. ")"
end
我正在考虑在将脚本发送到Redis之前进行某些后处理,但这似乎有些过度了...
解决/减少这个问题的最佳实践是什么?
更新代码示例:
local registryKey = "/counters/set-" .. type
local updatedKey = "/counters/updated/set-" .. type
if typeId then
redis.call("SAdd", updatedKey, name .. ":" .. typeId)
redis.call("SAdd", registryKey, name .. ":" .. typeId)
else
redis.call("SAdd", updatedKey, name)
redis.call("SAdd", registryKey, name)
end
这是另一个代码示例,无法简单地移动到客户端,因为它调用Redis命令并作为事务的一部分工作。
谢谢!
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
"Hack" #1"
在使用
SCRIPT LOAD之后,你会得到一个 sha1 值,你可以使用它来调用EVALSHA。同样的,你也可以在另一个脚本中使用相同的 sha1 值来调用这个脚本 - 只需调用函数f_<sha1>。然而,在使用该方法时,传递 KEYS/ARGV 结构的方式有所不同。请注意,这是未记录的行为,这意味着在将来的 Redis 版本中,该行为可能会发生变化。
学会这个技巧的功劳归功于 Josiah Carlson 博士,他将其归功于另一个人(如果我没记错的话,是 Fritzy)。想要了解更多信息,请查看他的lua-call Python wrapper: https://github.com/josiahcarlson/lua-call。
“Hack”#2
Redis 对 Lua 进行了沙箱操作并施加了一些限制以保持其健康。你可以绕过其中的一些限制,例如访问 _G 并在那里定义你的实用程序函数,这样它将对所有脚本都可用(就像我使用 https://github.com/redislabs/redis-lua-debugger 一样)。
然而,这也相当危险 - 除了潜在的复制问题,该用法也未经过测试,并且因此可能导致未定义的行为(我的小脚本成功崩溃了不少实例 ;))。
附加内容
这两种技巧都需要额外的管理工作,以确保这些“全局”脚本在任何其他脚本调用它们之前都已加载。