StackExchange Redis C# 如何 运行 一个 LUA 脚本 - 需要更好的真实示例
StackExchange Redis C# How to run a LUA Script - need better real-world example
我有一个中等复杂度的 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);
抛出异常:
Additional information: ERR Error running script (call to
f_a14d7a96f7556c52775eb277db66dfe0bfadd6a5): @user_script:37:
@user_script: 37: Lua redis() command arguments must be strings or
integers
我看过 github scripting.md 但它的示例似乎没有解决我的情况,或者我只是不 "getting" 东西。
我错过了什么?我试过带引号和不带引号的 luaParams,添加 0 表示没有键。
我是这样做的...(混入了一些伪代码,因为我无法提供准确的信息 - 它缺乏足够的上下文)
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;
}
我有一个中等复杂度的 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);
抛出异常:
Additional information: ERR Error running script (call to f_a14d7a96f7556c52775eb277db66dfe0bfadd6a5): @user_script:37: @user_script: 37: Lua redis() command arguments must be strings or integers
我看过 github scripting.md 但它的示例似乎没有解决我的情况,或者我只是不 "getting" 东西。
我错过了什么?我试过带引号和不带引号的 luaParams,添加 0 表示没有键。
我是这样做的...(混入了一些伪代码,因为我无法提供准确的信息 - 它缺乏足够的上下文)
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;
}