redis排行榜同分数排序问题

Posted by Ethan Blog on October 29, 2020

在使用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覆盖掉即可。