Redis的zrevrangebyscore,排序比字典顺序等(Redis zrevrangebys

2019-08-01 10:18发布

我在使用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,用户2将被置于比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的倍数

Answer 1:

在有序集合的得分支持双精度浮点数,所以可能是一个更好的解决办法是将存储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")

详情请参见这个问题: 对Redis的领先独特的得分



Answer 2:

sort命令的外部砝码的特点是你的救星这里


SORT mylist BY weight_*

http://redis.io/commands/sort



Answer 3:

如果您在得分降序排列显示的排行榜,然后我不认为上述解决方案将正常工作。 而不只是附加timestamp的分数,你应该追加Long.MAX_VALUE - System.nanoTime()所以你的最终得分的代码应该是这样的-

highscore = 100
timestamp = Long.MAX_VALUE - System.nanoTime();
redis.zadd('myleaderboard', highscore + '.' + timestamp, playerId);

现在,当你打电话,你会得到正确的次序redis.zrevrange('myleaderboard', startIndex, endIndex)



文章来源: Redis zrevrangebyscore, sorting other than lexicographical order