2017-01-14 8 views
0

私が知っているように、sDiffはセットでしか動作しません。 しかし、どのようにインデックス付きリスト間の差分を得ることができますか?2つのリストの間に差異はありませんか?

.... 
$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コマンドで実行されたLuaのスクリプトを記述していますサーバー側で実行します。

--[[ 
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.リストが巨大な場合は、一度にすべてのアイテムを読み込むのではなく、バッチで違いを得るようにしてください。

関連する問題