string - Lua bool 值在 Redis 中没有预期的行为

标签 string lua redis match string-matching

我有一个脚本

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

最佳答案

  1. 您不需要执行 if((string.match(tostring(field),'ev')) ~= nil)。您只需执行 if(string.match(tostring(field),'ev')) 即可。
  2. 您的脚本失败的原因是 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/

相关文章:

c# - 有 8 位字符的字符串类型吗?

lua 要求如何工作

redis - Redis中如何让多个节点存储一个hash map

laravel - 设计 Laravel 缓存(Redis)架构

redis - 在 StackExchange.Redis 中制作多个 ConnectionMultiplexer

javascript - 函数调用中的字符串与函数中定义的字符串的处理方式不同 - 奇怪的错误

java - 分割Java字符串

lua 尝试调用方法 'len'(一个 nil 值)

lua - 插入到字符串

python - 该函数接受输入字符串 x 列表并返回整数 ptr