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

我有一个问题,

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库和lua返回了RedisResult,但是lua表格数据无法解析为RedisValue[]

有没有人有主意?

点赞
用户23354
用户23354

RedisResult是一种通用的包装器,用于未知形状的数据。有操作符可让您以多种方式解释数据,例如:

RedisResult val = ...

// 简单
int asInt = (int)val; // 一个整数
string asString = (string)val; // 一个字符串

string[] asStrings = (string[])val; // 一组字符串
double[] asDoubles = (double[])val; // 一组 double

// 更为结构化

var asKeys = (RedisKey[])val; // 一组键
var asValues = (RedisValue[])val; // 一组值
var asMulti = (RedisResult[])val; // 一组通用值

所以你可以将其可能转换为需要的类型。但是:在脚本中使用KEYS是一个大问题,您应该真正改变它。


回答评论中的问题:

为什么我不使用keys,你能为我解释一下吗?因为我检查性能,而keysscan更好,而对于表格,hvals返回二进制对象,所以=>key,{{key,obj},{key,obj}}

引用来自redis文档

警告:将KEYS视为应仅在生产环境中极其小心地使用的命令。当针对大型数据库执行此命令时,它可能会破坏性能。此命令旨在进行调试和特殊操作,例如更改您的键空间布局。不要在常规应用程序代码中使用KEYS

每个redis实例都带有一个用于服务请求的单线程核心。KEYS在小型数据库上看起来还可以,但是_有或没有过滤器_的性能都是O(N),其中N是数据库中键的总数,对于大型系统:它可能是_灾难性的_,意味着:需要花费10秒才能返回。通常,redis操作预计最多需要_MPI_coefficient.毫秒时间_,而您的KEYS操作运行时:什么都不能干。它_完全_阻止服务器在该期间的核心。

您指出,KEYSSCAN更高效,在某些情况下是正确的。SCAN的整个观点是它允许您将操作作为(潜力很大的)一系列_小批量_-"扫描前100个;现在从那里扫描下一个100个; 接下来的100个"。这有很多开销和延迟,并涉及更多的往返到服务器,但好处是它不会为单个巨大时间块阻止服务器核心。

然而!通常,更好的方法是使用一个与您的数据匹配的_集合_。假设您有一个大型数据库,您对所有/foo/{whatever}数据都感兴趣。现在;而不是使用KEYSSCAN查找这些值,_如果需要_迭代该系列中的所有键,则可以将所有放入集合中。所以当您创建/foo/abc时,您还会通过sadd/foo/abc放入集合/foo/_keys(或者其他什么;这里没有公约)。现在:要迭代该系列中的所有键,您只需迭代集合/foo/_keys - 这是一个_更为恰当的API_。

2018-02-26 11:33:33
用户2198985
用户2198985

将下面翻译成中文并且保留原本的 markdown 格式,

var asMulti = (RedisResult[])val;
foreach (var item in asMulti)
{
     var asd = (RedisValue[])item;
}

我的脚本返回一个表格,我认为这是 RedisResult[],并且在对象内部 所以设计成

"key, { {key, obj}, {key, obj}}" ```

2018-02-26 12:55:14