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 returnRedisResult
但是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},我编辑了我的答案来解决这个问题