使用 stackexchange.redis 存储 Lua 脚本

我正在尝试在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;
点赞
用户16487514
用户16487514

请查看 文档。使用 StackExchange.Redis,您无需手动将 Lua 脚本加载到 Redis 中,并且不需要使用 LoadedLuaScript。

即使您有多个 Redis 节点,LuaScript 类也会自动处理脚本的传输。它会尝试按其哈希调用脚本,如果脚本不存在,则会收到 NOSCRIPT 错误,然后传输脚本。

正确的方法是简单地调用

LuaScript.Prepare(script).Evaluate(myDb)

有关 ScriptEvalMessage:GetMessages,请查看 https://github.com/StackExchange/StackExchange.Redis/blob/main/src/StackExchange.Redis/RedisDatabase.cs

2021-07-20 15:30:34