2016-03-28 3 views
1

Как получить список участников на основе их идентификатора из отсортированного набора, а не только одного члена?Redis Sorted Set: Bulk ZSCORE

Я хотел бы построить подмножество с набором идентификаторов из фактического отсортированного набора.

Я использую клиента Ruby для Redis и не хочу повторять его по очереди. Потому что там может быть более 3000 членов, которых я хочу найти.

Вот issue tracker для новой команды ZMSCORE, чтобы сделать объемный ZSCORE.

+0

Рассмотрите возможность использования 'MULTI'. Для 'ZSCORE' нет встроенного множественного доступа. Может быть, указать язык по вашему выбору, чтобы на этот вопрос можно было ответить более конкретно. – woozyking

+0

@woozyking Я использую клиент Ruby. Обновлен вопрос с более подробной информацией. – emaillenin

+0

Вы можете использовать 'MULTI' с Ruby, не так ли? –

ответ

3

Там нет VARIADIC формы для 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" 

EDIT: В 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"]) 

Сценарий Lua для получения баллов с идентификаторами участника:

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

можно ли запустить сценарий lua с помощью ruby ​​client вместо cli? – emaillenin

+0

@emaillenin вы можете запустить команду оболочки внутри ruby ​​http://stackoverflow.com/a/2400 – woozyking

+1

@emaillenin - конечно, просто вызовите redis.eval() 'redis-rb' (или 'redis.evalsha()') –

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