gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:03:32 26 4
gpt4 key购买 nike

我想使用 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 .

关于sorting - Redis 基于分数和日期时间排序的集合作为决胜局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44008972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com