使用stackexchange.redis存储Lua脚本

13

我正在尝试在Azure WebApp上使用StackExchange.Redis并需要运行一些Lua脚本。

建议的方式是将脚本加载到服务器上,但我难以理解正确的模式。

我认为应该在WebApp启动时完成:

LuaScript luaScript = LuaScript.Prepare(scriptString);
var endpoints = redis.GetEndPoints();
var endpoint = endpoints[0];
IServer server = redis.GetServer(endpoint);
LoadedLuaScript loadedScript = luaScript.Load(server);

然后将LoadedLuaScript保留以备后用(与ConnectionMultiplexer一起)。 稍后当我想运行Lua脚本时:

IDatabase db = redis.GetDatabase();
db.ScriptEvaluate(loadedScript);

这是正确的方式吗?

由于Azure可以拥有多个Redis节点,因此我是否应该为每个端点运行luaScript.Load,并仅保留一个供以后使用?即:

LuaScript luaScript = LuaScript.Prepare(script);
var endpoints = redis.GetEndPoints();
LoadedLuaScript loadedScript;
foreach (var endpoint in endpoints)
{
    IServer server = redis.GetServer(endpoint);
    loadedScript = luaScript.Load(server);
}
return loadedScript;

你到目前为止有得到任何推荐的解决方案吗? - Pankaj Rawat
这个有任何更新吗?@PankajRawat - aasis21
@aasis21,我放弃了使用Lua脚本与Redis,但我会推荐https://www.redisgreen.net/blog/intro-to-lua-for-redis-programmers/。 - Pankaj Rawat
@ziv,你有这方面的任何更新吗? - Bynho
因为所有lua脚本都在内存中,并且不在节点之间复制,所以我认为随意加载脚本并调用它是很危险的,特别是因为StackExchange.Redis似乎使用EVALSHA进行调用。我认为在执行脚本之前加载脚本是最好的解决方案;除非延迟非常关键,否则应该忽略lua文件的大小。 - Mooshua
1个回答

0
请参阅文档。使用 StackExchange.Redis,您无需手动将 Lua 脚本加载到 Redis 中,也不必使用 LoadedLuaScript。
即使您有多个 Redis 节点,LuaScript 类也会自动处理脚本的传输。它尝试通过哈希调用脚本,如果缺少脚本,则会出现 NOSCRIPT 错误,然后传输脚本。
正确的方式是简单地调用:
LuaScript.Prepare(script).Evaluate(myDb)

请查看https://github.com/StackExchange/StackExchange.Redis/blob/main/src/StackExchange.Redis/RedisDatabase.cs中的ScriptEvalMessage:GetMessages


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接