Redis根据得分和日期时间排序,作为平局?

时间:2017-05-16 18:26:22

标签: sorting optimization lua redis sortedset

我想使用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的专家。

1 个答案:

答案 0 :(得分:5)

排序集分数是浮点值。您的分数和分数的日期时间都适合。

  1. 得分将是某个范围内的整数,例如0到2 ^ 10,仅需要10位
  2. 分数可以是自2010年1月以来的unix时间戳秒(为了简化,你可以简单地将简单的unix时间戳作为整数),以减少时间戳的大小。
  3. 现在让我们将redis评分称为RScore。 您可以将此人的分数放在该数字的最左边10位,并且 最右边x位的时间戳。中间的位可以为零。

    因此,每当您对Rscore进行排序时,它将首先按分数排序,如果存在平局,则将按正确位中的unix时间戳排序。 要从RScore中查找得分的分数和时间戳,您只需要解析正确的位组。 在python中执行此操作的示例实用程序是here