ServiceStack Redis,如何将Lua表作为列表返回
我正在使用ServiceStack中的Redis客户端。我有一个Lua脚本,它用几个Redis调用的结果填充Lua表。我想以某种方式归还这张桌子。我的想法是使用客户端库中的execluashasaslist方法,在lua脚本中只执行一个returnmytable。它不起作用,我总是得到一个空的列表回来 如何将lua表返回到redis客户端 这是我在Redis客户端使用的C脚本: 更新后提示从下面回答 LuaBody就是这样创建的:ServiceStack Redis,如何将Lua表作为列表返回,lua,redis,lua-table,Lua,Redis,Lua Table,我正在使用ServiceStack中的Redis客户端。我有一个Lua脚本,它用几个Redis调用的结果填充Lua表。我想以某种方式归还这张桌子。我的想法是使用客户端库中的execluashasaslist方法,在lua脚本中只执行一个returnmytable。它不起作用,我总是得到一个空的列表回来 如何将lua表返回到redis客户端 这是我在Redis客户端使用的C脚本: 更新后提示从下面回答 LuaBody就是这样创建的: 从Lua中,您需要返回一个Lua数组或一个JSON对象。”myT
从Lua中,您需要返回一个Lua数组或一个JSON对象。”myTable'听起来像一个句柄,它只在Lua解释器中有效。该句柄在调用后直接清理,因此不会传播到客户端 编辑:应该创建一个简单的Lua表/数组。不知道接下来会发生什么,不看剧本 关于Lua脚本原子性的更多信息,请参见本文 希望这有帮助,TW 编辑操作后: 这是OP最初的Lua脚本: 局部a={} 对于i=1,1,1 do a[47700415]=redis.调用'hget','asr:47700415','MDEngines' a[47700415_000]=redis.调用'hget','asr:47700415_000','MGEngines' 终止 归还 答:不能在Lua返回值中返回嵌套值。从ServiceStack函数中可以看到,Lua脚本返回一个列表,而列表不是嵌套的 这里有两种解决方案,一种是JSON,它的开销很小,但在编程时可能更容易,而且是nill安全的 答:使用cjson 也是一种非常好且紧凑的序列化格式,我们经常使用它,可以如下方式返回: a-alt:使用cmsgpack b:使用一个简单的数组 这将返回: a: tw@srv-flux-02:~$redis cli-p 14312评估$cat~/tw_luatest.lua 0 {\47700415\:\Hello\,\47700415\u 000\:\World\} b: tw@srv-flux-02:~$redis cli-p 14312评估$cat~/tw_luatest2.lua 0 1 47700415 2你好 3 47700415_000 4世界 如您所见,我在HSET中放入了一些虚拟数据 我也可以推荐这个链接,里面有一些不错的信息: 可以看到向Lua dict添加值的好方法: 本地fkeys=redis.调用'sinter',解压密钥 局部r={} 对于i,输入ipairsfkeys do r[r+1]=redis.调用'hgetall',键 终止 返回r
嗨,TW,我已经用我的代码更新了。你知道会出什么问题吗?再次感谢。我最终使用了json:-你好,又是TW。我已经在上面更新了如何创建Lua脚本。当我尝试使用大量数据分类时,聚合包含6项,csSearchResult包含84000项,这需要很长的时间7,5分钟。需要时间的是redisClient.ExecLuaShaAsListsha1行。如果我运行它几次,它可能会更快,有时是几秒钟而不是几分钟。不过,大多数情况下速度都很慢。对于少量的数据,速度总是非常快。我检查了服务器上的CPU和内存,但它们从未达到最大值。你知道原因是什么吗?更正,应该是ExecLuaShaAsString,而不是ExecLuaShaAsList。嗨,TW,没问题。我解决了。我将Azure服务器从小型到中型的1.7GB ram更改为3.5,现在只需3秒。原来是内存问题。以前我使用了94%的内存,现在是50%。
using (var redisClient = GetPooledRedisClient())
{
var sha1 = redisClient.LoadLuaScript(luaBody);
List<string> theList = redisClient.ExecLuaShaAsList(sha1);
int listLength = theList.Count(); //listLength is always 0 for some reason
}
private string GetLuaScript(List<CatalogItem> categories, List<CatalogItem> products)
{
string categoriesToAggregate = string.Join("\",\"", categories.Select(c=>c.Name));
categoriesToAggregate = "\"" + categoriesToAggregate + "\"";
string csSearchResult = string.Join("\",\"", products.Select(c => c.Name));
csSearchResult = "\"" + csSearchResult + "\"";
StringBuilder sb = new StringBuilder();
sb.AppendLine("local categoriesToAggregate = {").Append(categoriesToAggregate).Append("} ");
sb.AppendLine("local csSearchResult = {").Append(csSearchResult).Append("} ");
sb.AppendLine("local result = {} ");
sb.AppendLine();
sb.AppendLine("for i=1,#categoriesToAggregate do ");
sb.AppendLine(" result[categoriesToAggregate[i]] = 0 ");
sb.AppendLine();
sb.AppendLine(" for j=1,#csSearchResult do ");
sb.AppendLine(" local fieldValue = redis.call('hget', 'asr:'..csSearchResult[j], categoriesToAggregate[i]) ");
sb.AppendLine(" if fieldValue then ");
sb.AppendLine(" result[categoriesToAggregate[i]] = result[categoriesToAggregate[i]] + fieldValue ");
sb.AppendLine(" end ");
sb.AppendLine(" end ");
sb.AppendLine("end ");
sb.AppendLine();
sb.AppendLine("return cjson.encode(result) ");
return sb.ToString();
}
local a={}
for i = 1, 1, 1 do
a["47700415"] = redis.call('hget', 'asr:47700415', 'MDEngines')
a["47700415_000"] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return cjson.encode(a)
return cmsgpack.pack(a)
local a={}
for i = 1, 1, 1 do
a[1] = "47700415"
a[2] = redis.call('hget', 'asr:47700415', 'MDEngines')
a[3] = "47700415_000"
a[4] = redis.call('hget', 'asr:47700415_000', 'MGEngines')
end
return a