数据库 – 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的新手,所以也许有更优雅的方式来实现同样的目标. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |