我想使用redis'排序集作为排行榜。但是使用ZREVRANGE 0 x
,我只能从得分中得到最高x(基于得分的升序排序集的结尾),默认的断路器来自官方redis文档:
字典顺序用于得分相等的元素。
我需要的决胜局是得分录入的日期时间。
e.g。
submits (in order) redis sorts it as I need
User1 -- Score 50 User1 User1
User3 -- Score 40 User2 User3
User2 -- Score 40 User3 User2
我看到的唯一解决方案是将最后一次更新的日期时间存储在条目中,但仍然使用ZREVRANGE key 0 x
来获取前x个用户的最大和最小分数。然后做一个ZREVRANGEBYSCORE key max min
。如果结果长度高于x,则至少存在一个平局,因此我将使用2个键在Lua中对该较小的列表进行排序。
这种方法似乎非常慢,我需要让它为成千上万的用户工作。我不喜欢2次调用和处理Lua(在redis方面,保持原子)并想知道是否有更好的方法来使用2个键来排序集合或配置另一个平局?
我的代码已经编写好了,所以我无法更改我的数据库类型。如果你有任何有趣的想法,我很想听听他们,因为我不是redis的专家。
答案 0 :(得分:5)
排序集分数是浮点值。您的分数和分数的日期时间都适合。
现在让我们将redis评分称为RScore。 您可以将此人的分数放在该数字的最左边10位,并且 最右边x位的时间戳。中间的位可以为零。
因此,每当您对Rscore进行排序时,它将首先按分数排序,如果存在平局,则将按正确位中的unix时间戳排序。 要从RScore中查找得分的分数和时间戳,您只需要解析正确的位组。 在python中执行此操作的示例实用程序是here。