我已经使用 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的倍数