在使用redis开发一个排行榜的时候,我们通常使用redis的有序集合(sorted set),时间复杂度为O(M*log(N)),但是在某些分差较小,需要先到达这个分数的用户排在前面,但是如果同分数情况下,可能会出现后到达分数的排在前。网上有很多解决方案,这里介绍一个最优解决方案(以下均为伪代码)。
使用毫秒时间排序
1
2
3
4
5
6
7
8
userA = 10 //假如A获得10分
userB = 10 //假如B也获得10分
userA = 10+".".time.Now().UnixNano() //使用毫秒时间戳拼接 得到结果 10.1257894000000
userB = 10+".".time.Now().UnixNano() //使用毫秒时间戳拼接 得到结果 10.1257895000000
redis.sAdd("myzset",userA,userAid) //写入到redis里面
redis.sAdd("myzset",userB,userBid) //写入到redis里面
这样由于时间戳的不同,A和B即便同分数也不会出现排序错乱问题,我们取出时只需要将分数转为取整即可,如果有修改分数的地方只需要先取出分数相加,然后直接sAdd覆盖掉即可。