数据库 – Redis:获取排序集的所有分数
发布时间:2020-05-23 23:38:56 所属栏目:MsSql 来源:互联网
导读:我需要为redis排序集获得所有分数. redis ZADD myzset 10 one(integer) 1redis ZADD myzset 20 two(integer) 1redis ZADD myzset 30 three(integer) 1 现在我想检索myzset的所有分数,即. 10,20,30. 解决此问题的一种方法是使用服务器端Lu
|
我需要为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],-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',i,i+20,'withscores' )
for j=1,2 do
res[tmp[j+1]]=true
i = i + 1
end
end
for k,k)
end
return result
请注意我是Lua的新手,所以也许有更优雅的方式来实现同样的目标. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
