Redis分类套装:散装ZSCORE

时间:2016-03-28 13:47:37

标签: ruby redis

如何根据排序集中的ID而不是仅仅一个成员来获取成员列表?

我想使用实际有序集合中的一组ID构建一个子集。

我正在为Redis使用Ruby客户端,并且不想逐个迭代。因为我想要查找超过3000个成员。

以下是新命令ZMSCORE issue tracker进行批量ZSCORE。

1 个答案:

答案 0 :(得分:3)

volumes没有可变形式,但请参阅讨论:https://github.com/antirez/redis/issues/2344

那说,暂时,你可以做的就是使用Lua脚本。例如:

ZSCORE

从命令行运行它看起来像:

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

编辑:在Ruby中,它可能类似于以下内容,尽管您最好使用SCRIPT LOADEVALSHA并从外部加载脚本文件(而不是在应用程序中硬编码):

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

使用成员ID获得分数的Lua脚本:

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"])