离线数仓,需要计算TOP10的玩家的排名,每天会取出分数前10的玩家作为TOP10。但有些玩家会被封号,被封号之后就会从TOP10名单里删除,这样一来TOP10的人数就会变少,变成九个,八个,七个。
现在希望一直能有10个玩家在榜上,想问有没有人遇见过类似的情况,有什么比较好的解决方案吗?
无代码
拿前30个玩家的分数,这样被删除后还可以顶上去,但存在极端情况,如果前30个也都被封号了,还是会少。
希望一直能有10个玩家在榜上,麻烦大家来评论区聊聊自己的思路
可以在原有接口中添加一个过滤逻辑,对已经排序的数据筛选出有效账号列表(未封号的),然后取出前十条,如果对你有所帮助望采纳
实例代码如下:
//获取排好序的玩家列表playerList
List<Player> playerList = getPlayerList();
//筛选有效账号列表useablePlayerList
List<Player> useablePlayerList = playerList.stream().filter(player -> player.getIsValid = 1).collect(Collectors.toList());//getIsValid此处根据代码实际情况来定,为有效的标识
然后就可以对有效列表取出前十逻辑处理。
封号的时候,给一个消息队列,通知数据仓库那里,如果封的是排行榜前10的号,就调用重新计算一下排名。
反正都排序了,取10个也是取,取30也是取,都取一点呗
封号依据是什么?能不能在取排行TOP10之前把封号的数据都过滤掉再来排序?
果然,就怕你这个逻辑是排序后再封号,因为这就会涉及到要做一个循环处理,而且一开始必须全部把序号排了
全排序-取前10-循环(封号n人-补上n人)
当循环里,封号人数为0时跳出循环,或者无法补足10人时跳出循环(极端情况,全部排完还不够10人)
另外,为了节省开销,可以根据多次真实数据来计算一个概率,比如前30人完成TOP10的概率、前100人完成TOP10的概率....
然后得到一个最佳的区间,以后就优先用这个区间的来算,再增加一次检查,检查发现不对,再使用次佳的区间来算,以次类推,这样可以减少循环的次数
把封号的去掉重新拍就可以了吧,不过挺感兴趣的这是啥游戏,封号这么严重,前30都封号,封号就不参与排名即可,没啥难度。
获得TOP10的玩家的时候难道没有对所有玩家排序吗?
去掉封号的,排一下序不就行了?
1.你排序搞个筛选,把封号的去掉
2.或者你就排前30名这样简单粗暴。
是先排序再封号的,不可以做到在排序时就筛选掉封号的。(其中牵扯其他逻辑,我就不做详解了,结果就是只能先排序再封号)
建议将数据先存入redis,通过redis的特性来做。
逻辑些许的怪异, 大体就是只能存玩家和分数, 不能存状态(封号), 然后排序取出, 给出两个思路吧:
既然是离线数仓,那也不可能实时去算,你算30个和100个效率上也不会有区别,多算出一些,需要的时候取个top10不就得了