数据库 – Redis:获取排序集的所有分数

前端之家收集整理的这篇文章主要介绍了数据库 – 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],-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的新手,所以也许有更优雅的方式来实现同样的目标.

原文链接:https://www.f2er.com/mssql/76429.html

猜你在找的MsSQL相关文章