ServiceStack Redis,如何将Lua表作为列表返回

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

我正在使用ServiceStack中的Redis客户端。我有一个Lua脚本,它用几个Redis调用的结果填充Lua表。我想以某种方式归还这张桌子。我的想法是使用客户端库中的execluashasaslist方法,在lua脚本中只执行一个returnmytable。它不起作用,我总是得到一个空的列表回来

如何将lua表返回到redis客户端

这是我在Redis客户端使用的C脚本:

更新后提示从下面回答

LuaBody就是这样创建的:


从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