在Redis中搜索Lua脚本

时间:2016-09-21 17:54:38

标签: lua redis

我正在尝试使用Lua脚本在哈希中搜索字段值,我做错了什么:) 我有关键的“文章”,它是zset持有文章ID和密钥文章:n其中“n”是文章编号。 以下脚本:

local ids = redis.call("zrange", 'articles', '0', '-1')
local ret = {}
for k, id in pairs(ids) do
    local row = redis.call("hgetall", "article:"..id)
    ret[k] = row
end
return ret

返回:

1)  1) "slug"
    2) "first-title"
    3) "title"
    4) "first title"
2)  1) "slug"
    2) "second-title"
    3) "title"
    4) "second title"

我试图包含条件只返回标题中包含字符串“second”的键,但它不返回任何内容。

local ids = redis.call("zrange", 'articles', '0', '-1')
local ret = {}
for k, id in pairs(ids) do
    local row = redis.call("hgetall", "article:"..id)
    if (string.find(row[4], "second")) then
        ret[k] = row
    end
end
return ret

请你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

您从lua返回的表格必须是其索引从1开始的数组。

但是,在您的示例中,只有第二篇文章与条件匹配,其索引为2。事实上,您将表格设置为:ret[2] = row。由于返回的表不是索引从1开始的数组,因此Redis将其作为空数组,并且什么也得不到。

<强>解决方案:

local ids = redis.call("zrange", 'articles', '0', '-1')
local ret = {}
local idx = 1;  -- index starting from 1
for k, id in pairs(ids) do
    local row = redis.call("hgetall", "article:"..id)
    if (string.find(row[4], "second")) then
        ret[idx] = row   -- set table
        idx = idx + 1    -- incr index by 1
    end
end
return ret

答案 1 :(得分:0)

试试这个条件

if (string.find(row[4], "second") ~= nil) then