【问题标题】:StackExchange Redis C# How to run a LUA Script - need better real-world exampleStackExchange Redis C# 如何运行 LUA 脚本 - 需要更好的真实示例
【发布时间】:2016-10-26 03:54:51
【问题描述】:

我有一个中等复杂度的 LUA 脚本,我已经通过 redis-cli 进行了测试。使用:

EVALSHA sha1 numkeys key1..keyn arg1..arg2

我的脚本有 2 个参数,没有键。

我正在将 .NET 端的脚本从文本文件加载到 string luaString,然后使用

LuaScript lua = LuaScript.Prepare(luaString) 创建 LuaScript 对象。到目前为止这么好?

现在我创建:

object luaParams = new { '1923920', '{ "type":"message", "property1":"this is an example" }' };

RedisResult r = lua.Evaluate(IDatabase, luaParams);

抛出异常:

附加信息:ERR 错误运行脚本(调用 f_a14d7a96f7556c52775eb277db66dfe0bfadd6a5): @user_script:37: @user_script: 37: Lua redis() 命令参数必须是字符串或 整数

我查看了 github scripting.md,但它的示例似乎没有解决我的情况,或者我只是没有“得到”一些东西。

我错过了什么?我尝试过引用和未引用的 luaParams,添加 0 表示没有键。

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

    我是这样做的...(由于我无法提供准确的信息,因此混入了一些伪代码 - 它缺乏足够的上下文)

    string actualScript = File(pathToFullLuaScriptOnDotNetServer).ReadToEnd();
    string luaSha = rClient.CalculateSha1(actualScript);
    
    //This current impl is not optimized - should do this in AppStart
    bool hasScript = rClient.HasLuaScript(luaSha);
    if (!hasScript)
    {
        luaSha = rClient.LoadLuaScript(CommWebAPI.RedisConfig.scriptString);
    }
    

    ...

    string geom = f["geometry"].ToString();
    string[] p = new string[] { integerParam + "", geom.StripNewLines() };
    List<string> result = rClient.ExecLuaShaAsList(luaSha, p);
    //getLuaScriptError is a custom function - see below
    string luaError = getLuaScriptError(result);
    if (null == luaError)
    {
        aggregatedResults = aggregatedResults.Union(result).ToList();
    }
    else
    {
        Debug.Print("Redis LUA error: " + luaError);
    }
    

    ...

    private string getLuaScriptError(List<string> response)
    {
        //check if LUA error:  2 results, 0 == null, 1 == error message.
        if (2 == response.Count)
        {
            if (null == response[0])
            {
                return response[1];
            }
        }
        return null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-05
      • 2016-08-10
      • 2020-10-15
      • 2017-09-26
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多