Redis 基于分数和日期时间排序的集合作为决胜局?

Redis sorted set based on score and date time as tie breaker?

我想使用 redis 的排序集作为排行榜。但是使用 ZREVRANGE 0 x,我只能从分数中获得前 x(基于分数的升序排序集的末尾),使用默认的决胜局,来自官方 redis 文档:

Lexicographical order is used for elements with equal score.

我需要的决胜局是分数条目的日期时间。

例如

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 中的较小列表进行排序。

这个方法看起来很慢,我需要让它适用于数十万用户。我不喜欢使用 Lua 进行的 2 次调用和处理(在 Redis 方面,保持原子性)并且想知道是否有更好的方法将 2 个键用于排序集或配置另一个决胜局?

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

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

  1. 分数将是某个范围内的整数,比如 0 到 2^10,只需要 10 位
  2. 分数可以是自 2010 年 1 月以来的 unix 时间戳秒数(为了减少时间戳的大小,为简单起见,您甚至可以将简单的 unix 时间戳作为整数)

现在让我们将redis 分数称为RScore。 你可以把这个人的分数放在数字的最左边 10 位,然后 最右边 x 位的时间戳。中间的位可以为零。

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