biz*_*ger 7 database nosql redis
我需要为redis排序集获得所有分数.
redis> ZADD myzset 10 "one"
(integer) 1
redis> ZADD myzset 20 "two"
(integer) 1
redis> ZADD myzset 30 "three"
(integer) 1
Run Code Online (Sandbox Code Playgroud)
现在我想检索myzset的所有分数,即.10,20,30.
编辑:由于您之前的值大小问题不明显,我做了一些额外的研究.
根据当前的文档,没有办法从排序集中获得分数.
要获得分数,您需要做的是同时将它们添加到单独的集合中,并在需要时从那里获取它们.
你应该首先做的是尝试以不同的方式将问题映射到数据结构中.我无法从您的问题中看出为什么您需要获得分数,但可能还有其他方法可以构建更好地映射到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"]
Run Code Online (Sandbox Code Playgroud)
解决此问题的一种方法是使用服务器端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
Run Code Online (Sandbox Code Playgroud)
您可以使用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
Run Code Online (Sandbox Code Playgroud)
请注意,我是Lua的新手,所以也许有更多优雅的方法可以实现相同的目标。
归档时间: |
|
查看次数: |
7952 次 |
最近记录: |