Sorting Redis基于分数和日期时间排序集是否为平局破坏者?

Sorting Redis基于分数和日期时间排序集是否为平局破坏者?,sorting,optimization,lua,redis,sortedset,Sorting,Optimization,Lua,Redis,Sortedset,我想使用redis的排序集作为引导板。但是使用ZREVRANGE 0 x,我只能从分数(基于分数的升序排序集的末尾)中获得前x,默认的平局断路器是,从官方redis文档中: 字典顺序用于等分元素 我需要的平局打破者是分数输入的日期和时间 e、 g 我看到的唯一解决方案是在条目上存储上次更新的日期和时间,但仍然使用ZREVRANGE键0 x从前x个用户获得最大和最小分数。然后执行ZREVRANGEBYSCORE键max-min。如果结果长度大于x,则至少有一个tie,因此我将使用2个键在Lua中对

我想使用redis的排序集作为引导板。但是使用
ZREVRANGE 0 x
,我只能从分数(基于分数的升序排序集的末尾)中获得前x,默认的平局断路器是,从官方redis文档中:

字典顺序用于等分元素

我需要的平局打破者是分数输入的日期和时间

e、 g

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

这个方法看起来很慢,我需要让它为成千上万的用户工作。我不喜欢Lua的2个调用和处理(在redis端,保持原子性),我想知道是否有更好的方法使用2个键进行排序集或配置另一个平局断路器


我的代码已编写,因此无法更改数据库类型。如果你有什么有趣的想法,我很想听听,因为我不是redis的专家。

排序集分数是一个浮点值。你的分数和分数的日期时间都可以符合这个条件

  • 分数将是某个范围内的整数,例如0到2^10,只需要10位
  • 分数可以是自2010年1月以来的unix时间戳秒数(为了减小时间戳的大小,为了简单起见,您甚至可以将简单的unix时间戳作为整数)
  • 现在让我们将redis分数称为RScore。 你可以把这个人的分数放在数字最左边的10位,然后 以最右边的x位表示的时间戳。中间的位可以是零

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

    submits (in order)     redis sorts it as      I need
    User1 -- Score 50      User1                  User1
    User3 -- Score 40      User2                  User3
    User2 -- Score 40      User3                  User2