我需要为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的新手,所以也许有更优雅的方式来实现同样的目标.