是否可以在redis中调用其他lua脚本中定义的lua函数?

我试图声明一个没有local关键字的函数,然后从其他脚本调用该函数,但是在运行命令时却给了我一个错误。

test = function ()    

return 'test'

end

# from some other script

test()

编辑:

我不敢相信我仍然没有答案。我将提供我的设置的更多详细信息。

我正在使用带有redis-scripto包的node来将脚本加载到redis中。这是一个例子。

var Scripto = require('redis-scripto');

var scriptManager = new Scripto(redis);

scriptManager.loadFromDir('./lua_scripts');

var keys = [key1, key2];

var values = [val];

scriptManager.run('run_function', keys, values, function(err, result) {

console.log(err, result)

})

还有lua脚本。

-- ./lua_scripts/dict_2_bulk.lua

-- turns a dictionary table into a bulk reply table

dict2bulk = function (dict)

local result = {}

for k, v in pairs(dict) do

table.insert(result, k)

table.insert(result, v)

end

return result

end

-- run_function.lua

return dict2bulk({ test=1 })

引发以下错误。

[Error: ERR Error running script (call to f_d06f7fd783cc537d535ec59228a18f70fccde663): @enable_strict_lua:14: user_script:1: Script attempted to access unexisting global variable 'dict2bulk' ] undefined

回答:

请参阅下面的Josiah答案。我的回答原来是 或者至少是

。当然,这让我感到非常高兴,这使Redis更加灵活。

我很确定这是不可能的。不允许使用全局变量(请阅读docs),Redis

Lua引擎将脚本本身获取本地范围和临时范围。

如果Lua函数执行任何写操作,则会在幕后自动设置“正在写”标志。这将开始交易。如果您级联Lua调用,则Redis中的簿记将变得非常麻烦,尤其是当级联在Redis从站上执行时。这就是为什么公司EVALEVALSHA有意不提供为有效的Redis调用一个Lua脚本中。调用您正在尝试执行的已“加载”的Lua函数也是如此。如果从服务器在第一个脚本的加载和第二个脚本的执行之间重启,将会发生什么?

我们为克服此限制所做的工作:

不使用EVAL,仅使用SCRIPT LOADEVALSHA。将SHA1存储在Redis哈希集中。

我们在版本控制系统中将其自动化,因此已提交的Lua脚本会自动使用逻辑名自动获取哈希存储在Redis主数据库中的SHA1校验和。客户端不能使用EVAL(在从属服务器上;我们在配置中禁用了EVAL

+ LOAD)。但是客户可以要求SHA1进行下一步。几乎我们所有的Lua函数都为下一次调用返回SHA1。

希望这会有所帮助,TW

以上是 是否可以在redis中调用其他lua脚本中定义的lua函数? 的全部内容, 来源链接: utcz.com/qa/415519.html

回到顶部