车迟斗法抢夺匹配修改

back_recharge
lvxinran 2020-10-31 04:54:46 +08:00
parent 74ccf05238
commit 66c2308952
2 changed files with 73 additions and 18 deletions

View File

@ -855,6 +855,16 @@ public class RedisUtil {
}
return null;
}
public Set<String> getReverseZset(String key,long start,long end){
for (int i = 0; i < MAX_TRY_TIMES; i++) {
try {
return redisTemplate.opsForZSet().reverseRange(key, start, end);
} catch (Exception e) {
TimeUtils.sleep(FAILED_SLEEP);
}
}
return null;
}
public Set<ZSetOperations.TypedTuple<String>> getZsetreverseRangeWithScores(String type,String key, long start, long end){
String rkey = getKey(type, key);

View File

@ -23,10 +23,7 @@ import config.SWorldBossSetting;
import manager.STableManager;
import org.springframework.data.redis.core.ZSetOperations;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.*;
public class GetCarChallengeListHandler extends BaseHandler {
@Override
@ -51,6 +48,8 @@ public class GetCarChallengeListHandler extends BaseHandler {
guildInfo.getMembers().values().forEach(integers ->members.addAll(integers));
String key = RedisUtil.getInstence().getKey(RedisKey.CAR_DEALY_RANK, "");
int zsetSize = RedisUtil.getInstence().getZsetSize(key);
List<ZsetTypedTupleWithRank> beforeList = new ArrayList<>(5);
List<ZsetTypedTupleWithRank> afterList = new ArrayList<>(5);
if(myRank == -1){
int start = zsetSize - matchNums;
if(start<0){
@ -59,26 +58,72 @@ public class GetCarChallengeListHandler extends BaseHandler {
int end=-1;
process(start,end,members,matchNums,infos);
}else{
//取前面
int topStart = myRank - matchSection[0];
if(topStart<0){
topStart=0;
int i = myRank-1;
int j = myRank+1;
while(i>0||j<=zsetSize){
if(i>0){
// Set<String> beforeSet = RedisUtil.getInstence().getReverseZset(key, i - 1, i);
Set<ZSetOperations.TypedTuple<String>> beforeScore = RedisUtil.getInstence().getZsetreverseRangeWithScores(RedisKey.CAR_DEALY_RANK, "", i-1 , i-1);
ZSetOperations.TypedTuple<String> beforeNext = beforeScore.iterator().next();
if(!members.contains(Integer.parseInt(beforeNext.getValue()))){
if(beforeList.size()<matchSection[0]){
beforeList.add(new ZsetTypedTupleWithRank(beforeNext,i));
}else if(j>zsetSize&&afterList.size()<matchSection[1]){
afterList.add(new ZsetTypedTupleWithRank(beforeNext,i));
}
}
if(beforeList.size()<matchSection[0]||(j>=zsetSize&&afterList.size()<matchSection[1])){
i--;
}
}
if(j<=zsetSize){
// Set<String> afterSet = RedisUtil.getInstence().getReverseZset(key, j - 1, j);
Set<ZSetOperations.TypedTuple<String>> afterScore = RedisUtil.getInstence().getZsetreverseRangeWithScores(RedisKey.CAR_DEALY_RANK, "", j-1 , j-1);
ZSetOperations.TypedTuple<String> afterNext = afterScore.iterator().next();
if(!members.contains(Integer.parseInt(afterNext.getValue()))){
if(afterList.size()<matchSection[1] ){
afterList.add(new ZsetTypedTupleWithRank(afterNext,j));
}else if(i==0&&beforeList.size()<matchSection[0]){
beforeList.add(new ZsetTypedTupleWithRank(afterNext,j));
}
}
if(afterList.size()<matchSection[1]||(i<=0&&beforeList.size()<matchSection[0])){
j++;
}
}
if(beforeList.size()+afterList.size()>=matchSection[1]+matchSection[0]) {
break;
}
}
int topEnd = myRank;
process(topStart,topEnd,members,matchNums,infos);
int downStart = myRank;
if(downStart<0){
downStart=0;
}
int downEnd = myRank+matchSection[1];
process(downStart,downEnd,members,matchNums,infos);
beforeList.addAll(afterList);
// infos.addAll(beforeList);
// //取前面
// int topStart = myRank - matchSection[0];
// if(topStart<0){
// topStart=0;
// }
// int topEnd = myRank;
// process(topStart,topEnd,members,matchNums,infos);
// int downStart = myRank;
// if(downStart<0){
// downStart=0;
// }
// int downEnd = myRank+matchSection[1];
// process(downStart,downEnd,members,matchNums,infos);
}
int myscore = 0;
if(myRank!=-1){
myscore = RedisUtil.getInstence().getZSetScore(RedisKey.CAR_DEALY_RANK, "", String.valueOf(uid)).intValue();
}
Family.GetCarChallenegListResponse.Builder builder = Family.GetCarChallenegListResponse.newBuilder().setMyRank(myRank).setMyScore(myscore);
for(ZsetTypedTupleWithRank typedTupleWithRankitem: infos){
for(ZsetTypedTupleWithRank typedTupleWithRankitem: beforeList){
ZSetOperations.TypedTuple<String> item = typedTupleWithRankitem.getItem();
int challenegUid = Integer.parseInt(item.getValue());
int rank = typedTupleWithRankitem.getRank();
@ -112,7 +157,7 @@ public class GetCarChallengeListHandler extends BaseHandler {
int rank=start+1;
Set<ZSetOperations.TypedTuple<String>> zsetreverseRangeWithScores = RedisUtil.getInstence().getZsetreverseRangeWithScores(RedisKey.CAR_DEALY_RANK, "", start, end);
for(ZSetOperations.TypedTuple<String> item : zsetreverseRangeWithScores){
if(members.add(Integer.parseInt(item.getValue()))){
if(!members.contains(Integer.parseInt(item.getValue()))){
infos.add(new ZsetTypedTupleWithRank(item,rank));
}
rank++;