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

Dav*_*d G 2 sorting optimization lua sortedset redis

我想使用redis'排序集作为排行榜.但是使用ZREVRANGE 0 x,我只能从得分中得到最高的x(基于得分的升序排序集的结尾),使用默认的tie tie,来自官方redis文档:

字典顺序用于具有相同分数的元素.

我需要的领带破坏者是分数输入的日期时间.

例如

submits (in order)     redis sorts it as      I need
User1 -- Score 50      User1                  User1
User3 -- Score 40      User2                  User3
User2 -- Score 40      User3                  User2
Run Code Online (Sandbox Code Playgroud)

我看到的唯一解决方案是在条目上存储上次更新的日期时间,但仍然用于ZREVRANGE key 0 x从前x个用户获取最大和最小分数.然后做一个ZREVRANGEBYSCORE key max min.如果结果长度高于x,则至少存在一个平局,因此我将使用2个键在Lua中对该较小的列表进行排序.

这种方法看起来非常慢,我需要让它适用于成千上万的用户.我不喜欢2个调用和Lua处理(在redis方面,保持原子)并且想知道是否有更好的方法来使用2个键来排序集合或配置另一个绑定器?

我的代码已经写好了,所以我不能改变我的数据库类型.如果你有任何有趣的想法,我很想听听他们,因为我不是redis的专家.

Dhr*_*hak 5

有序集合得分是浮点值.您的分数和分数的日期时间都适合.

  1. 得分将是某个范围内的整数,例如0到2 ^ 10,仅需要10位
  2. 分数可以是自2010年1月以来的unix时间戳秒(为了简化,你可以简单地将简单的unix时间戳作为整数)来减小时间戳的大小

现在让我们将redis评分称为RScore.您可以将此人的分数放在该数字的最左边10位,将时间戳放在最右边的x位中.中间的位可以为零.

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