Redis排行榜的实现

根据上一篇的设计进一步结合实际场景进行实现,通过伪代码的形式展开。现假设有以下场景:

游戏闯关排行榜以通关次数正序复活次数倒序第一次通关的时间倒序来进行排序

1.根据排序规则组合排序分值

第一步是组合排序分值,只有根据排序规则组合出来的分值,才能通过排序获取到正确的排名。在排序规则中一般会有两种方式,属性正序和倒序。

 

正序对于组合数字来说没有影响,但是倒序就需要进行特殊的处理。

 

组合的方式在上一篇中已经阐述,在这主要讨论如何生成这个排序字段。可以看出排序字段中的通关次数,复活次数都是与业务动作绑定在一起的。在触发这些动作的同时,对排序分值进行增减,就可以达到实时改变排名的效果了。

image.png

那么多说无益,上代码

 

2.排序分值反解排名

排行榜顾名思义就是需要看到你和其他人的排名,所以你需要获取到所有的排名信息和名次。然而你从redis中取出的数据是根据权重组合出来的分值,并没有所谓的排名。

10793CDA.jpg

那应该咋整?只能老老实实根据分数再把数据拆出来。这一步就点麻烦,需要考虑到组装分数的位数问题。例如:

闯关5次、复活2次和第一次通关时间2020-06-09

分数为5978408367999

闯关15次、复活2次和第一次通关时间2020-06-09

分数为15978408367999

这个时候通过字符串截取的时候就要小心这个的截取方式

 

这里呢,要是上来直接数位数开始截取,也不是不可以,毕竟组装分数的规则是确定的,但未免有点不体面。

String successNum;
String correctlyNum = "0";
//避免异常数据报错
//11:答对题数1位+时间戳10位
if (scoreStr.length() > 10) {
    //没有通过关
    if (scoreStr.length() <= 12) {
        successNum = scoreStr.substring(0, scoreStr.length() - 10);
    } else {
        correctlyNum = scoreStr.substring(0, scoreStr.length() - 12);
        successNum = scoreStr.substring(scoreStr.length() - 12, scoreStr.length() - 10);
    }
}

其实这里有两个关键的数字,10和12。这两个数字其实就是就是组合数字的分界点

 

image.png

3.更通用的展望

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古柏树下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值