2017-01-14 2 views
0

Как я знаю, sDiff работает только с наборами. Но как я могу получить разницу между индексированными списками? неRedis diff между двумя списками?

.... 
$Redis->lPush("KEY1", "Value1"); 
$Redis->lPush("KEY1", "Value2"); 
$Redis->lPush("KEY1", "Value3"); 

$Redis->lPush("KEY2", "Value1"); 
$Redis->lPush("KEY2", "Value3"); 
$Redis->lPush("KEY2", "Value4"); 

$Redis->sDiff("KEY1", "KEY2"); 
.... 

ответ

2

Там будет не встроенная команда для этого - ваши вариантов либо тянуть два список и выполнить сравнение (дифф) в клиенте, или написать скрипт Lua, который запускается с EVAL команды на выполните его на стороне сервера. Вот пример такого сценария:

--[[ 
LDIFF key [key ...] 
Returns the elements in the first list key that are also present in all other 
keys. 
]]-- 

-- A utility function that converts an array to a table 
local function a2t(a) 
    local t = {} 
    for i, v in ipairs(a) do 
    t[v] = true 
    end 
    return t 
end 

-- A utility function that converts a table to an array 
local function t2a(t) 
    local a = {} 
    for k, _ in pairs(t) do 
    a[#a+1] = k 
    end 
    return a 
end 

-- main 
local key = table.remove(KEYS,1) 
local elems = a2t(redis.call('LRANGE', key, 0, -1)) 

-- iterate remaining keys 
while #KEYS > 0 do 
    key = table.remove(KEYS,1) 
    local check = a2t(redis.call('LRANGE', key, 0, -1)) 
    -- check each element in the current key for existence in the first key 
    for k, _ in pairs(elems) do 
    if check[k] then 
     elems[k] = nil 
    end 
    end 
end 

-- convert the table to an array and reply 
return t2a(elems) 

Запуск этого с redis-cli выглядит следующим образом:

$ redis-cli LPUSH key1 value1 value2 value3 
(integer) 3 
$ redis-cli LPUSH key2 value1 value3 value4 
(integer) 3 
$ redis-cli --eval ldiff.lua key1 key2 
1) "value2" 
0

Redis не имеет встроенной поддержки для поиска списка различий. Но есть обходной путь. Увидев синтаксис вашего кода, я предполагаю, что вы работаете над php. PHP array_diff() - это спасение. Следующие шаги должны работать.

$a1 = $Redis->lPush("KEY1",0,-1) 
$a2 = $Redis->lPush("KEY2",0,-1) 
diff = array_diff($a1,$a2) 

Этот подход может быть переведен на любой другой язык программирования.

p.s. Если списки огромны, убедитесь, что вы получаете разницу в партии, вместо того, чтобы сразу загружать все предметы.

Смежные вопросы