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 专家。
排序后的集合分数是一个浮点值。你的分数和分数的日期时间都可以符合。
- 分数将是某个范围内的整数,比如 0 到 2^10,只需要 10 位
- 分数可以是自 2010 年 1 月以来的 unix 时间戳秒数(为了减少时间戳的大小,为简单起见,您甚至可以将简单的 unix 时间戳作为整数)
现在让我们将redis 分数称为RScore。
你可以把这个人的分数放在数字的最左边 10 位,然后
最右边 x 位的时间戳。中间的位可以为零。
因此,无论何时对 Rscore 进行排序,都会首先按分数排序,如果出现平局,则会按正确位中存在的 unix 时间戳进行排序。
要从 RScore 中找到分数和分数的时间戳,您只需解析正确的位集。
在 python 中执行此操作的示例实用程序是 here.
我想使用 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 专家。
排序后的集合分数是一个浮点值。你的分数和分数的日期时间都可以符合。
- 分数将是某个范围内的整数,比如 0 到 2^10,只需要 10 位
- 分数可以是自 2010 年 1 月以来的 unix 时间戳秒数(为了减少时间戳的大小,为简单起见,您甚至可以将简单的 unix 时间戳作为整数)
现在让我们将redis 分数称为RScore。 你可以把这个人的分数放在数字的最左边 10 位,然后 最右边 x 位的时间戳。中间的位可以为零。
因此,无论何时对 Rscore 进行排序,都会首先按分数排序,如果出现平局,则会按正确位中存在的 unix 时间戳进行排序。 要从 RScore 中找到分数和分数的时间戳,您只需解析正确的位集。 在 python 中执行此操作的示例实用程序是 here.