使用 stackexchange.redis 存储 Lua 脚本

Posted

技术标签:

【中文标题】使用 stackexchange.redis 存储 Lua 脚本【英文标题】:Storing Lua scripts with stackexchange.redis 【发布时间】:2015-10-10 11:15:57 【问题描述】:

我正在尝试在 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;

【问题讨论】:

到目前为止,您有没有得到任何推荐的解决方案? 嘿任何更新。 @PankajRawat @aasis21 我放弃了使用 redis 的 Lua 脚本,但我会推荐 redisgreen.net/blog/intro-to-lua-for-redis-programmers @ziv 你有这方面的更新吗? 由于所有 lua 脚本都在内存中并且不会在节点之间复制,因此我认为加载脚本并将其称为 Willy-nilly 是危险的,特别是因为 StackExchange.Redis 似乎使用 EVALSHA 调用。我会考虑在执行脚本之前加载它是最好的解决方案; lua 文件的大小应该小到可以忽略,除非延迟很重要。 【参考方案1】:

请参阅documentation。使用 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

【讨论】:

以上是关于使用 stackexchange.redis 存储 Lua 脚本的主要内容,如果未能解决你的问题,请参考以下文章

怎样在Redis通过StackExchange.Redis 存储集合类型List

如何在Redis通过StackExchange.Redis 存储集合类型List

如何使用 StackExchange.Redis 将 Redis Key 插入为整数

StackExchange.Redis helper访问类封装

Redis和StackExchange.Redis

Redis 详解 StackExchange.Redis Client