加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 07:47:37 所属栏目: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. 解决方法 解决此问题的一种方法是使用服务器端Lua脚本
我需要为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的新手,所以也许有更优雅的方式来实现同样的目标.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读