当前位置: 首页 > 面试题库 >

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

祁建明
2023-03-14
问题内容

我试图声明一个没有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



 类似资料:
  • 主要内容:第一个Lua脚本命令,为什么使用Lua脚本,常用脚本命令,基本命令应用从 Redis 2.6 版本开始,Redis 使用内置的 Lua 解释器执行脚本,这意味着我们可以直接在 Redis 客户端执行Lua 脚本 ,于此同时 Redis 还非常贴心地提供了用于编写 Lua 脚本的 命令。 第一个Lua脚本命令 Lua 是一种轻量小巧、开源的脚本语言,用标准 C语言编写。其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它被广泛的应用于:游戏开发

  • 问题内容: 我正在设置将使用Redis和APCu的PHP标记的缓存实现。由于APC是键值存储,因此我将使用Redis进行键标记关系,并与APC上的每个Web服务器进行同步。 我当前的问题仅涉及Redis。可能您知道实现,但需要明确说明:键可以具有与之关联的标签。在以后的某个时间点,您可以通过某些标签删除缓存的密钥。有很多键,但没有那么多标签,并且键和标签之间存在n对n的关系。 由组成: 因为设置后

  • 本文向大家介绍Lua定义函数,包括了Lua定义函数的使用技巧和注意事项,需要的朋友参考一下 示例 让我们看一下语法。首先,我们看到一个function关键字。好吧,这很具有描述性。接下来,我们看到add标识符;名字。然后,我们看到这些参数(a, b)可以是任何参数,并且是局部的。只有在功能体内,我们才能访问它们。让我们跳到最后,我们看到...好吧end!介于两者之间的是函数体;调用时运行的代码。该

  • 问题内容: 我创建了一个redis lua脚本来执行基于关键数据类型的命令: 每次执行时,它都会返回null。请帮助纠正脚本。 问题答案: 对响应的返回形式如下表:(如果类型为字符串,则返回) 因此,为了正确检查,您应该将代码更改为: 其余代码将正常运行。 问题是这样的:TYPE命令是少数几个返回“简单字符串”或“状态” redis答复的命令之一(有关响应类型,请参见redis协议规范)。在red

  • Lua 脚本功能是 Reids 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点, 并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。 本章先介绍 Lua 环境的初始化步骤, 然后对 Lua 脚本的安全性问题、以及解决这些问题的方法进行说明, 最后对执行 Lua 脚本的两

  • 主要内容:一、Lua和Redis,二、运行机制,三、开发和应用,四、总结一、Lua和Redis 这篇其实和Redis本身的源码关系不是太大了,主要是看一下对REDIS的支持。Lua可能好多人都没有听说过,但是如果搞过网游的人,估计都用过,做为一种胶水语言,Lua对C/C++的支持非常友好,这是一般的脚本语言都没有做到的。它很小很轻量,所以非常容易与其它程序集成。在魔兽和仙剑等游戏中都广泛使用。 Lua的缺点也很明显,对开发支持的力度不大,功能也少,功能少,就意味着如果