如何從一個排序集而不是一個成員獲取基於其ID的成員列表?Redis Sorted Set:Bulk ZSCORE
我想用實際排序集合中的一組ID來構建一個子集。
我正在使用Redis的Ruby客戶端,並且不想逐個迭代。因爲我想查找超過3000個成員。
這裏是issue tracker來一個新的命令ZMSCORE來做批量ZSCORE。
如何從一個排序集而不是一個成員獲取基於其ID的成員列表?Redis Sorted Set:Bulk ZSCORE
我想用實際排序集合中的一組ID來構建一個子集。
我正在使用Redis的Ruby客戶端,並且不想逐個迭代。因爲我想查找超過3000個成員。
這裏是issue tracker來一個新的命令ZMSCORE來做批量ZSCORE。
沒有爲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 LOAD
和EVALSHA
和從外部文件加載腳本(而不是在應用硬編碼):
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"])
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
我們可以使用ruby客戶端而不是cli來運行lua腳本嗎? – emaillenin
@emaillenin你可以在ruby中運行shell命令http://stackoverflow.com/a/2400 – woozyking
@emaillenin - 當然,只需調用redis-rb的'redis.eval()'(或'redis.evalsha()') –
考慮使用'MULTI'。 'ZSCORE'沒有內置的多路訪問。也許表明你選擇的語言,這可以用更具體的方式來回答。 – woozyking
@woozyking我正在使用Ruby客戶端。用更多細節更新了問題。 – emaillenin
你可以在Ruby中使用'MULTI',對不對? –