首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Redis中将排行榜限制为仅N个元素?

如何在Redis中将排行榜限制为仅N个元素?
EN

Stack Overflow用户
提问于 2012-10-12 02:16:44
回答 2查看 3.2K关注 0票数 7

我需要创建一个具有最大元素数量的排行榜,比如N?我知道如何使用LPUSH + LTRIM将列表大小限制为N个元素。如何使用Redis排序集为排行榜实现这一点

到目前为止,我的方法是通过3个步骤来完成这项工作: a)使用ZADD将score+项添加到排行榜

b)找出第N个元素的排名(我不确定该怎么做)

c)执行ZREMRANGEBYRANK排行榜0 rank_of_the_nth_element。

有没有更好的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-12 04:05:35

实际上,我有一个使用redis的排行榜应用程序。你可以在here上查看。在我的应用程序中,排行榜受到最高n分数的限制,而且当旧分数太旧时,旧分数也会下降(因此可以有日、周、月、年高分板)。

无论如何,我认为你想要做的是一个全面的排行榜,所以低分被推开了。在Redis排序集分数的意义上,如果你设置了这样的设置,高分应该留下来(他们在底部),低分应该离开(他们在顶部),那么你应该这样做:

代码语言:javascript
复制
ZREMRANGBYRANK leaderboard 0 -100

该示例假设您希望保留最后100个分数。

也许你颠倒了分数,所以1000的“高分”在redis中存储为-1000,所以它是排序集中的第一个。在这种情况下,它将与上面相同,但使用ZREMRANGEBYRANK leaderboard 100 -1删除前100个项目之后的所有项目。

更新:意识到有ZREMRANGEBYRANK,所以简化了我的例子。

您提出的解决方案也应该有效。如果想要找到nth元素的分数,可以使用以下命令:

代码语言:javascript
复制
hundredth_entry = ZRANGE leaderboard 100 100
hundredth_score = ZSCORE leaderboard hundredth_entry
ZREMRANGEBYSCORE leaderboard -inf (hundredth_score

(的存在是为了使范围不包含,因此任何小于第100个分数的内容都将被删除,但不会删除第100个分数本身。

票数 7
EN

Stack Overflow用户

发布于 2013-11-05 19:37:47

OP算法的lua实现:

代码语言:javascript
复制
redis.call("ZADD", KEYS[1], ARGV[1]+0, ARGV[2])
local n = redis.call("ZCARD", KEYS[1])
if n > ARGV[3]+0 then 
    redis.call("ZREMRANGEBYRANK", KEYS[1], 0, n-ARGV[3]-1) 
end

然后替换

代码语言:javascript
复制
ZADD key score member

使用

代码语言:javascript
复制
EVAL script 1 key score member cap
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12846028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档