- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想使用 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 方面的专家。
最佳答案
排序后的集合分数是一个浮点值。您的分数和分数的日期时间都可以符合。
现在让我们将 redis 分数称为 RScore。你可以把这个人的分数放在数字的最左边 10 位,然后最右边 x 位的时间戳。中间位可以为零。
因此,无论何时对 Rscore 进行排序,它都会首先按分数排序,如果出现平局,则会按正确位中存在的 unix 时间戳进行排序。要从 RScore 中找到分数和分数的时间戳,您只需解析正确的位集。在 python 中执行此操作的示例实用程序是 here .
关于sorting - Redis 基于分数和日期时间排序的集合作为决胜局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44008972/
对于家庭作业,我需要根据启发式比较节点,以便我可以将它们放入 TreeSet 中。但是,当两个节点的启发值相等时,我需要一些方法来打破平局。 我不允许修改提供的 Node 类,据我所知,Node 没有
我在 Python 3.3.x 中有一个 Counter 我想对其进行排序。 我知道我可以使用 .most_common(x) 但我希望键在值相同的情况下按字母顺序排序。 有什么办法可以做到这一点?设
我是一名优秀的程序员,十分优秀!