我有一个脚本
local fields = redis.call('hkeys', 'a:hash:full:of:stuff');
local retval = {};
for i, field in pairs(fields) do
if((string.match(tostring(field),'ev')) ~= nil) then
retval[i] = {field, (string.match(tostring(field),'ev') ~= nil) }
end
end
return retval
此脚本返回一个空列表
当我将 if
语句更改为如下所示时
if((string.match(tostring(field),'.')) ~= nil) then
...
我得到一个很长的列表,其中包括以下内容
...
...
60) 1) "applet:1:metric:viewelement:20130607"
2) (nil)
61) 1) "applet:1:total_events:20130529"
2) (integer) 1
...
...
如果我用
替换 if 语句if(1)
我得到了相同的长键列表
我也尝试过使用string.find
,它有类似的行为。
唯一似乎是一种模式,如果匹配的字符串在字符串中出现多次,或者出现在开始。我对此不太确定,但它可能会有所帮助。
我正在使用以下命令运行此脚本
$ redis-cli eval "$(cat get_keys.lua)" 0
最佳答案
- 您不需要执行
if((string.match(tostring(field),'ev')) ~= nil)
。您只需执行if(string.match(tostring(field),'ev'))
即可。 - 您的脚本失败的原因是 lua 不支持表中的 nil 键。如果您设置
some_table[1]
、some_table[2]
和some_table[5]
然后返回数组,它将看起来像它以some_table[2]
结束。由于您仅在 if 语句通过时设置数组,因此如果在retval[1]
上失败,则不会返回数组的其余部分。
简单的修复方法是:
local fields = redis.call('hkeys', 'a:hash:full:of:stuff');
local retval = {};
for i, field in pairs(fields) do
if(string.match(tostring(field),'ev')) then
retval[i] = {field, (string.match(tostring(field),'ev') ~= nil) }
else retval[i] = 'some_nil_value'
end
end
return retval
我想你也可以使用table default values ,但我还没有玩过这些,所以不能在这里提供太多信息。
[编辑] OP 表示他不想要零占位符。在这种情况下,可以使用以下内容:
local fields = redis.call('hkeys', 'a:hash:full:of:stuff');
local retval = {};
for i, field in pairs(fields) do
if(string.match(tostring(field),'ev')) then
retval[#retval+1] = {field, (string.match(tostring(field),'ev') ~= nil) }
end
end
return retval
关于string - Lua bool 值在 Redis 中没有预期的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17030595/