根据上一篇的设计进一步结合实际场景进行实现,通过伪代码的形式展开。现假设有以下场景:
游戏闯关排行榜以通关次数正序、复活次数倒序和第一次通关的时间倒序来进行排序
1.根据排序规则组合排序分值
第一步是组合排序分值,只有根据排序规则组合出来的分值,才能通过排序获取到正确的排名。在排序规则中一般会有两种方式,属性正序和倒序。
正序对于组合数字来说没有影响,但是倒序就需要进行特殊的处理。
组合的方式在上一篇中已经阐述,在这主要讨论如何生成这个排序字段。可以看出排序字段中的通关次数,复活次数都是与业务动作绑定在一起的。在触发这些动作的同时,对排序分值进行增减,就可以达到实时改变排名的效果了。
那么多说无益,上代码
2.排序分值反解排名
排行榜顾名思义就是需要看到你和其他人的排名,所以你需要获取到所有的排名信息和名次。然而你从redis中取出的数据是根据权重组合出来的分值,并没有所谓的排名。
那应该咋整?只能老老实实根据分数再把数据拆出来。这一步就点麻烦,需要考虑到组装分数的位数问题。例如:
闯关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。这两个数字其实就是就是组合数字的分界点