2016-03-28 104 views
1

如何從一個排序集而不是一個成員獲取基於其ID的成員列表?Redis Sorted Set:Bulk ZSCORE

我想用實際排序集合中的一組ID來構建一個子集。

我正在使用Redis的Ruby客戶端,並且不想逐個迭代。因爲我想查找超過3000個成員。

這裏是issue tracker來一個新的命令ZMSCORE來做批量ZSCORE。

+0

考慮使用'MULTI'。 'ZSCORE'沒有內置的多路訪問。也許表明你選擇的語言,這可以用更具體的方式來回答。 – woozyking

+0

@woozyking我正在使用Ruby客戶端。用更多細節更新了問題。 – emaillenin

+0

你可以在Ruby中使用'MULTI',對不對? –

回答

3

沒有爲ZSCORE沒有可變參數的形式,但 - 看在討論:https://github.com/antirez/redis/issues/2344

也就是說,和暫時,你可以做的是使用Lua中了點。例如:

local scores = {} 
while #ARGV > 0 do 
    scores[#scores+1] = redis.call('ZSCORE', KEYS[1], table.remove(ARGV, 1)) 
end 
return scores 

在命令行中運行,這將是這樣的:

$ redis-cli ZADD foo 1 a 2 b 3 c 4 d 
(integer) 4 
$ redis-cli --eval mzscore.lua foo , b d 
1) "2" 
2) "4" 

編輯:在Ruby中,它可能會像下面這樣,雖然你會更好使用SCRIPT LOADEVALSHA和從外部文件加載腳本(而不是在應用硬編碼):

require 'redis' 

script = <<LUA 
    local scores = {} 
    while #ARGV > 0 do 
     scores[#scores+1] = redis.call('ZSCORE', KEYS[1], table.remove(ARGV, 1)) 
    end 
    return scores 
LUA 

redis = ::Redis.new() 
reply = redis.eval(script, ["foo"], ["b", "d"]) 

Lua腳本用會員ID獲得分數:

local scores = {} 
while #ARGV > 0 do 
    local member_id = table.remove(ARGV, 1) 
    local member_score = {} 
    member_score[1] = member_id 
    member_score[2] = redis.call('ZSCORE', KEYS[1], member_id) 
    scores[#scores + 1] = member_score 
end 
return scores 
+0

我們可以使用ruby客戶端而不是cli來運行lua腳本嗎? – emaillenin

+0

@emaillenin你可以在ruby中運行shell命令http://stackoverflow.com/a/2400 – woozyking

+1

@emaillenin - 當然,只需調用redis-rb的'redis.eval()'(或'redis.evalsha()') –