使用redis做排行榜相同积分情况下,如何使用到达时间来排序

       好久没更新博客了,杂事多,其实还是就是自己懒惰了吧。哈哈哈哈。言归正传。

       最近需求撸了个排行榜,是用redis实现的,依稀记得,前几个月去面试的时候,面试官老喜欢问我做过排行榜么,做过排行榜么,那时候还没做过,也知道是redis做的,以为会有点难度,但是其实并不难。技术就是这样的,不知道就难,知道了就简单,消除恐惧的最好方法就是面对恐惧,奥里给!

       redis的有序集合(sorted set),会元素都会关联一个double类型的分数。然后通过分数来为集合中的成员进行从小到大的排序。简直就是天生为排行榜设计的,但是有序集合(sorted set)在元素积分相同的情况下居然是字典排序(就是同分数的情况下,使用我们存贮的元素进行排序),这就不符合我们理想中的排行榜了。

       改进如下:

       我们只需要在玩家的积分上关联上时间即可,例如:存入的数据为{uid,score}

       1.我们需要拿到一个时间来做标准,可以是排行榜的结束时间或者是任何别的时间。我使用的是结束时间的时间戳(end_time)。

       2.对score进行处理,new_score = score << 26 + (end_time - now)。进行位操作之后再加上时间戳。这样相同积分的情况下,越后面到达的存入的,处理之后的new_score越小。

       3.存入redis的数据为{uid, new_socre}。

       4.因为是使用了位操作,当需要显示积分的时候,new_score >>26即会剔除掉时间戳,显示积分。

       因为是使用了位操作并且关联了时间戳,在分数上相同的概率就会很小很小了。但是这样做也是有缺陷的,即相同时间到达相同积分的,还是会按照元素进行字典排序,不过无关紧要,这种概率很低。我的需求在这种情况下相同的话,是可以按照uid排序的,所以也没有再进一步优化。如果哪位同行看到了,有更好的方法也欢迎分享。

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值