我需要获得可用于redis排序集合的所有分数。Redis:获取有排序集合的所有分数
redis> ZADD myzset 10 "one"
(integer) 1
redis> ZADD myzset 20 "two"
(integer) 1
redis> ZADD myzset 30 "three"
(integer) 1
现在我想检索myzset的所有分数,即。 10,20,30。
我需要获得可用于redis排序集合的所有分数。Redis:获取有排序集合的所有分数
redis> ZADD myzset 10 "one"
(integer) 1
redis> ZADD myzset 20 "two"
(integer) 1
redis> ZADD myzset 30 "three"
(integer) 1
现在我想检索myzset的所有分数,即。 10,20,30。
解决此问题的一种方法是使用服务器端Lua脚本。
请看下面的代码:
local res = {}
local result = {}
local tmp = redis.call('zrange', KEYS[1], 0, -1, 'withscores')
for i=1,#tmp,2 do
res[tmp[i+1]]=true
end
for k,_ in pairs(res) do
table.insert(result,k)
end
return result
您可以通过使用EVAL命令执行它。
它使用zrange命令来提取zset的内容(带分数),然后构建一个集合(用Lua中的表示)来删除多余分数,最后构建回复表。所以zset的值绝不会通过网络发送。
如果zset中的项数很高,因为它将整个zset复制到一个Lua对象中(因此需要内存),此脚本存在缺陷。但是,很容易将其更改为逐渐迭代zset(每20项20个项目)。例如:
local res = {}
local result = {}
local n = redis.call('zcard', KEYS[1])
local i=0
while i<n do
local tmp = redis.call('zrange', KEYS[1], i, i+20, 'withscores')
for j=1,#tmp,2 do
res[tmp[j+1]]=true
i = i + 1
end
end
for k,_ in pairs(res) do
table.insert(result,k)
end
return result
请注意我是Lua的新手,所以可能有更多优雅的方法来达到同样的效果。
编辑:由于您的问题与值的大小之前并不明显,我做了一些额外的研究。
根据目前的文档没有办法从一个有序集合中得到分数。
你需要做什么才能得到分数是同时将它们添加到一个单独的集合,并在需要时从那里得到它们。
你应该尽可能先做的事情是尝试将不同的问题映射到数据结构中。我无法从您的问题中得知为什么您需要获得分数,但可能有其他方法来构建将更好地映射到Redis的问题。
-
我不知道有什么办法让所有得分没有得到钥匙,但ZRANGE
至少会得到你想要的信息;
redis> ZADD myzset 10 "one"
(integer) 1
redis> ZADD myzset 20 "two"
(integer) 1
redis> ZADD myzset 30 "three"
(integer) 1
redis> ZRANGE myzset 0 -1 WITHSCORES
["one","10","two","20","three","30"]
您需要传递可选参数WITHSCORES。见文档here:
ZREVRANGE键启动停止[WITHSCORES]返回一个范围件在 有序set,通过指数,从高责令低
分数当谈到红宝石以下命令会做
redis.zrange("zset", 0, -1, :with_scores => true)
# => [["a", 32.0], ["b", 64.0]]
我知道,但问题是,在v在我的情况下,线索是如此之大,只跟踪分数是有问题的。 – biztiger
@biztiger更新。显然不是完美的解决方案,但是如果你真的需要这个功能的话,这是一个可行的解决方案。 –