Redis中基于分数和日期时间的排名解决方案?

我想使用Redis的有序集合作为一个排行榜。但是使用ZREVRANGE 0 x,我只能从分数的顶部(升序排列的分数的末尾)获取前x个元素,使用的默认排序方法是在Redis官方文档中提到的字典顺序:

对于得分相等的元素,使用字典顺序。

我需要的解决方案是分数条目的日期时间。例如:

提交(按顺序)redis将其排序需求
用户1 -- 分数50 用户1
用户3 -- 分数40 用户3
用户2 -- 分数40 用户2

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

这种方法似乎非常慢,我需要使其适用于数十万用户。我不喜欢两次调用和使用Lua进行处理(在Redis端进行原子操作),并想知道是否有更好的方法可以使用2个键的有序集或者配置另一个解决方案?

我的代码已经编写完成,因此我无法更改数据库类型。如果您有任何有趣的想法,我很乐意听取,因为我不是Redis的专家。

点赞
用户533399
用户533399

排序集合分数是浮点数值。你的分数和得分的日期时间都可以适合其中。

  1. 分数将是在某个范围内的整数,比如从0到2的10次方,只需要10位
  2. 分数可以是自Jan'2010年以来的Unix时间戳秒数(为了缩小时间戳的大小,为了简单起见,你甚至可以把简单的Unix时间戳作为整数)

现在我们称Redis分数为RScore。 你可以把一个人的分数放在数字的左侧10位,时间戳放在最右侧的x位。中间的位可以是零。

所以,每当您对RScore进行排序时,它将首先按分数排序,如果存在平局,则按右侧位中的Unix时间戳进行排序。 要从RScore中查找得分和得分的时间戳,您只需要解析一组右侧位。 在Python中执行此操作的示例实用程序在此处

2017-05-16 18:44:11