如何在 StackExchange.Redis 中正确加载 Lua 脚本?

Jon*_*yMC 5 lua stackexchange.redis

StackExchange.Redis 脚本文档中,它说可以使用 LoadedLuaScript 来避免每次评估时将 Lua 脚本重新传输到 redis。然后给出了将脚本加载到服务器中的示例。我认为每次调用脚本时都不应该这样做,那么脚本应该加载到哪里?

如果redis服务器重启,脚本就不会持久,那么应该如何处理呢?是否应该在 ConnectionMultiplexer 的 ConnectionRestored 事件中加载它们?想必您需要将它们存储在 ConcurrentDictionary 中?

Chr*_*riZ 3

StackExchange.Redis 在内部处理 Lua 脚本缓存。通常你不必关心手动加载Lua脚本到redis。

StackExchange.Redis 在第一次调用“ScriptEvaluate”时自动将 Lua 脚本传输到 redis。对于同一脚本的进一步调用,仅使用哈希:

var prepared = LuaScript.Prepare(script);
prepared.Evaluate(someDb); // loads the script to redis and calls it

var prepared2 = LuaScript.Prepare(script);
prepared2.Evaluate(someDb); // calls the script by it's hash
Run Code Online (Sandbox Code Playgroud)

LoadedLuaScript 对于边缘情况可能很有用,例如加载而不执行。

我还澄清了官方 doku

背景资料

该库尝试通过哈希值调用脚本,如果脚本丢失,则会出现 NOSCRIPT 错误,然后传输脚本。

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

该行为也在官方 StackExchange.Redis github 存储库中进行了讨论和解释: