C# Redis Lua脚本返回表和解析对象

C# Redis Lua脚本返回表和解析对象,c#,lua,redis,stackexchange.redis,C#,Lua,Redis,Stackexchange.redis,我有个问题 local searchkey=@searchkey local blockKeys = redis.call('keys', searchkey) local table = {} for i = 0, #blockKeys, 1 do local seats = redis.call('HVALS', blockKeys[i]) table[i] = seats end return table 我想为.net obj解析这个表数据 我使用了StackExcha

我有个问题

local searchkey=@searchkey
local blockKeys = redis.call('keys', searchkey)
local table = {}
for i = 0, #blockKeys, 1 do
    local seats = redis.call('HVALS', blockKeys[i])
    table[i] = seats
end
return table
我想为.net obj解析这个表数据 我使用了
StackExchange.Redis
library和lua return
RedisResult
但是lua表数据没有解析
RedisValue[]


有人有主意吗

A
RedisResult
是用于未知形状数据的通用包装器。有一些运算符允许您以多种方式解释数据,例如:

RedisResult val = ...

// simple
int asInt = (int)val; // a single integer
string asString = (string)val; // a single string

string[] asStrings = (string[])val; // a table of strings
double[] asDoubles = (double[])val; // a table of doubles

// more structured

var asKeys = (RedisKey[])val; // a table of keys
var asValues = (RedisValue[])val; // a table of values
var asMulti = (RedisResult[])val; // a table of general purpose values
所以你可以把它放到你需要的地方。但是:在脚本中使用
键是一个大问题,您应该真正改变这一点


要解决评论中的问题:

为什么我不用钥匙,你能给我解释一下吗?因为我检查性能,键比扫描更好,对于表,hvals返回二进制对象so=>key,{{key,obj},{key,obj}

引自:

<强>警告< /强>:将键视为只应在生产环境中极其谨慎地使用的命令。当它在大型数据库上执行时,可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用密钥

每个redis实例都有一个用于服务请求的单线程内核
KEYS
在小型数据库上看起来不错,但无论是否使用过滤器,性能都是O(N),其中N是数据库中的键的总数,对于大型系统,这可能是灾难性的错误-意味着:需要10秒才能返回。通常,redis操作最坏情况下需要几毫秒的时间,而当您的
键运行时:其他任何操作都无法运行。在此期间,它会完全阻塞服务器

您注意到,
扫描
更有效,在某些方面也是如此。
SCAN
的整个要点是,它允许您将操作作为一系列(可能很长)小批量进行——“扫描前100个;现在从那里扫描下100个;然后再扫描下100个”。这会带来更多的开销和延迟,并涉及到更多到服务器的往返,但优点是它不会在一大块时间内阻塞服务器核心

然而!通常,更好的方法是使用一组您希望匹配数据的内容。假设您有一个大型数据库,并且您对所有的
/foo/{whatever}
数据都感兴趣。现在;与其使用
扫描
来查找这些值,如果需要迭代该族中的所有键,只需将所有放入一个集合即可。因此,当您创建
/foo/abc
时,您还可以通过
sadd
/foo/abc
放入设置的
/foo/\u键中(或其他;这里没有约定)。现在:要迭代该系列中的所有键,只需迭代set
/foo/_keys
——这是一个更合适的API

var asMulti = (RedisResult[])val;
foreach (var item in asMulti)
{
     var asd = (RedisValue[])item;
}
我的脚本返回表,我认为这是RedisResult[]和obj内部 所以设计


“键,{{key,obj},{key,obj}”

不要使用
。曾经说真的,永远不要那样做。推送时,您可以使用
扫描
,但该功能仅用于管理目的,如数据库分析工具。首先要做的是不要依赖于扫描键空间。一个好的经验法则是使用配置文件将
KEYS
命令重命名为
KILL_SERVER
;现在;Lua表应该(根据)映射到多批量回复,因此实际的形状应该已经“正常工作”。你得到了什么?怎么了?我不明白,为什么我不用钥匙,你能给我解释一下吗?因为我检查性能,键比扫描更好,对于表,hvals返回二进制对象so=>key,{{key,obj},{key,obj},我编辑了我的答案来解决这个问题