Redis间隔查询

时间:2016-05-03 19:11:38

标签: data-structures redis processing-efficiency database nosql

我有一个元组(S,T)形式的数据,其中S是字符串,T是整数。 S和T都不是独一无二的,而它们的组合是独一无二的。我需要将所有元组都放在S1 == S2|T1 - T2| <= C的位置。可以用Redis有效地做到吗?

1 个答案:

答案 0 :(得分:1)

一种方法是将数据存储在列表中,并使用Lua脚本进行检索。首先,对于(Sn,Tn)形式的元组,插入如下:

LPUSH myKey S1:T1
LPUSH myKey S2:T2
... and so on

然后,使用下面的Lua脚本:

local function split(div,str)
    if (div=='') then return false end
    local pos,arr = 0,{}
    for st,sp in function() return string.find(str,div,pos,true) end do
        table.insert(arr,string.sub(str,pos,st-1))
        pos = sp + 1
    end
    table.insert(arr,string.sub(str,pos))
    return arr
end

local key = KEYS[1]
local sVal = ARGV[1]
local tVal = tonumber(ARGV[2])
local cVal = tonumber(ARGV[3])
local length = redis.call("LLEN", key)

if (tonumber(length) == 0) then
    return nil
end

local data = redis.call("LRANGE", key, 0, tonumber(length))
local retval = {}

for index,val in pairs(data) do
    local parts = split(":", val)    
    if (parts[1] == sVal and math.abs(tonumber(parts[2]) - tVal) <= cVal) then
        table.insert(retval, val)
    end
end

return retval

将其另存为script.lua并执行以下操作:

$ redis-cli "$(cat script.lua)" 1 myKey sValue tValue cValue

这将返回与Sn:Tn匹配的所有元组(S1 == S2 and |T1 - T2| <= C形式)。