从另一个 lua 脚本中加载 lua 脚本

我已经为我的 node.js 项目编写了一些 lua 脚本。但是其中一些 lua 脚本中有相同的代码。首先让我解释一下。

我的第一个脚本返回给定密钥中的所有数据从 redis。

script1.lua

local data = {};
local keyslist = redis.call('keys', 'day:*');
local key, redisData;
for iCtr = 1, #keyslist do
    key = string.gsub(keyslist[iCtr], 'day:','');

    redisData = redis.call('hmget', keyslist[iCtr], 'users');
    table.insert(data, {date=key, users=redisData[1]});
end
return cjson.encode(data);

我的第二个脚本返回相同密钥的前两条记录从 redis。

script2.lua

local data = {};
local keyslist = redis.call('keys', 'day:*');
local key, redisData;
for iCtr = 1, #keyslist do
    if iCtr < 3
        key = string.gsub(keyslist[iCtr], 'day:','');

        redisData = redis.call('hmget', keyslist[iCtr], 'users');
        table.insert(data, {date=key, users=redisData[1]});
    end
end
return cjson.encode(data);

现在想要从 script2.lua 脚本中调用 script1.lua,如下所示。

script2.lua(希望如下)

local file = assert(loadfile("script1.lua"));
return file(2)  -- 只返回所需的前两条记录。
                -- 有关需求的 forLoop 逻辑将进行更改。

我尝试过上面的代码,但它会抛出以下错误

脚本尝试访问不存在的全局变量“loadfile

对于我的糟糕的解释,我很抱歉。

点赞
用户1979882
用户1979882

这是一个 Redis 的问题

查看: https://redislabs.com/ebook/redis-in-action/part-3-next-steps-3/chapter-11-scripting-redis-with-lua/11-1-adding-functionality-without-writing-c/11-1-1-loading-lua-scripts-into-redis

和这里

http://redis.io/commands/script-load

ret_1 = script_load("return 1")

ret_1(conn)

1L

在你的情况下,该脚本不理解“loadfile”的含义。

或尝试这个项目https://github.com/anvaka/redis-load-scripts

2016-09-13 10:38:49
用户10046004
用户10046004

使用dofile(filename)函数并按照以下方式重构你的第二个Lua文件:

file2_function = function()
代码
代码
代码
代码
return blah,blub
end

然后只需要按照以下方式调用全局变量file2_function

blah, blub = file2_function()

这种解决方案中唯一的缺点是创建了一个全局变量:file2_function

2018-07-21 08:35:44
用户12040044
用户12040044

要运行一个文件,可以使用dofile("filename.lua")函数,也可以使用loadstring(stringOfCode)函数从字符串中获取一个函数。例如:

code = "print('hello from string')"
fnc = loadstring(code)
fnc()

或者简写为:

loadstring("print('hello from string')")()

这将打印:hello from string

2021-04-08 09:49:35