2017-01-14 3 views
0

아시다시피 sDiff는 세트에서만 작동합니다. 그러나 인덱스 된 목록간에 차이점을 어떻게 얻을 수 있습니까?두 목록간에 차이가 있습니까?

.... 
$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

더가 내장되지-에 명령 그것을 위해 - 옵션은 두 목록을 끌어와 클라이언트에서 (차이에 대한) 비교를 수행하거나 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

레디 스 목록의 차이를 찾기위한 지원을 내장에-가 없습니다. 그러나 해결 방법이 있습니다. 귀하의 코드 구문을보고, 당신이 PHP에서 일하고 있다고 가정합니다. PHP array_diff()가 구출하는 것입니다. 다음 단계가 작동합니다.

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

이 접근법은 다른 프로그래밍 언어로 번역 될 수 있습니다.

p.s. 목록이 거대한 경우 한 번에 모든 항목을로드하는 대신 일괄 적으로 차이점을 얻으십시오.

관련 문제