当前位置: 首页 > 面试题库 >

Redis zrevrangebyscore,按字典顺序排序

高才
2023-03-14
问题内容

我已经在Redis中使用排序集实现了排行榜。我希望具有相同分数的用户按时间顺序排序,即,第一名的用户应排名更高。当前,redis支持词典顺序。有没有一种方法可以覆盖它。手机号码被用作排序集中的成员。

我想到的一种解决方案是在移动电话号码之前添加时间戳,并维护散列以映射移动电话号码和时间戳。

$redis.hset('mobile_time', '1234567890', "#{Time.now.strftime('%y%m%d%H%M%S')}")
pref = $redis.hget('mobile_time, '1234567890'')
$redis.zadd('myleaderboard', "1234567890:#{pref}")

这样,在任何情况下,我都可以通过从哈希添加前缀来获得给定用户的排名。

现在这不是我想要的。这将与我想要的相反。早到的用户将被置于晚到的用户下方(两者得分相同)。

Key for user1 = 201210121953**23**01234567890    score: 400
key for user2 = 201210121253**26**09313123523    score: 400 (3 seconds later)

如果我使用zrevrangebyscore,则将user2放置在高于user1的位置。

但是,有一种方法可以获取所需的排名:

users_with_higher_score_count = $redis.zcount("mysset", "(400", "+inf")
users_with_same_score = $redis.zrangebyscore("mysset", "400", "400")

现在,我具有正确顺序的列表 users_with_same_score 。查看索引,我可以计算出用户的排名。

获得排行榜。我可以以50个间隔获取成员,并通过ruby代码对其进行排序。但这似乎不是一个好方法。

我想知道是否有更好的方法可以做到这一点。或可以在我打算的解决方案中进行的任何改进。

在此先感谢您的帮助。

PS 分数是50的倍数


问题答案:

排序集中的分数支持双精度浮点数,因此可能更好的解决方案是将redis分数存储为highscore.timestamp

例如(伪代码)

highscore = 100
timestamp = now()
redis.zadd('myleaderboard', highscore + '.' + timestamp, playerId)

这意味着获得相同高分的多个玩家也将根据其获得高分的时间进行排序,如下所示:

对于玩家1 …

redis.zadd('myleaderboard', '100.1362345366', "Charles")

对于玩家2 …

redis.zadd('myleaderboard', '100.1362345399', "Babbage")


 类似资料:
  • 根据字典顺序和自定义顺序对字符串数组进行排序(一种排列形式)。这是代码: 问题是,当我对一些输入运行此命令时,输出是正确的,而对于其他输入,输出是不正确的。我一直在调试它,但没有找到错误。 编辑: 阿德里安娜正在玩英文字母表。当她玩完字母表后,她意识到她把字母的位置弄乱了。现在,给定一组单词,她想知道根据她制作的新字母表排序,这些单词的字典排序是什么。 换句话说,给定英语字母表E和一组单词S的排列

  • 问题内容: 我想在Swift中对字典进行排序。我有一本字典,例如: 等,我希望它像 等等 我在SO上尝试了许多解决方案,但没有人为我工作。我正在使用XCode6 Beta 5,在它上面有一些正在给编译器错误,在一些解决方案中有例外。因此,任何可以发布字典排序工作副本的人。 问题答案: 编辑: 上面代码中的排序数组仅包含键,而值必须从原始字典中检索。但是,也是(键,值)对的一对,我们可以使用全局函数

  • 我在寻找字典上最小的字符串的排列数。 例如,< code>bbaa现在,字典上最小的字符串是< code>aabb,因此,排列是, < code>(1,2,3,4),(2,1,3,4),(1,2,4,3),(2,1,4,3)也就是4。 我对它的想法(在python中)是找到最小的字符串(基本上将其排序为字符串),然后创建一个计数器来存储每个字符的计数。 因为,我们不需要一个在字典上变得更大的字符串

  • 问题内容: 我是Java的新手,正在尝试按字母顺序排列术语的arrayList。(一个术语定义为一个字符和一个整数)(例如 我的代码如下: 为什么这不起作用?以及我该如何完成呢?我的arrayList称为术语,填充有Term类型 问题答案: 您在这行代码中遇到的问题。您的课程不是So 的类型,这两个对象将基于哪个属性或条件方法? 您必须使您的类为Comparable类型。和,根据您的需要覆盖该方法

  • 本文向大家介绍在Python中按字典顺序对单词进行排序,包括了在Python中按字典顺序对单词进行排序的使用技巧和注意事项,需要的朋友参考一下 按字典顺序对单词进行排序意味着我们要首先按单词的第一个字母排列它们。然后,对于第一个字母相同的单词,我们将它们按第二个字母排列在该组中,依此类推,就像在语言的词典中一样(不是数据结构)。 Python有2个函数,按照这种类型的顺序进行排序和排序,让我们看看

  • 问题内容: 我有一个字符串数组,例如: 使用时,我按字典顺序对它们进行了排序,例如。 如何遍历根据数字值排序的字符串? 问题答案: 您可以将内置函数与一个键一起使用,以在比较之前将列表中的每个项目映射到一个整数: 输出量 使用此方法将根据需要输出字符串列表。