简介
该算法才有类似滑动时间窗口的方式,每笔数据(MergeDataDO)流入后,会根据key1,key2判断是否是新数据或者已被计算过的数据,新数据则需要构造计算结果存储对象(MergeCalcResultDO),已被计算过的key则直接取出,继续进行聚合运算
public class MergeCalcuService {
@Resource
private MergeCacheService cacheService;
/**
* 处理聚合计算
* @param mergeDataDO 传入数据模型
* @return
*/
public MergeCalcResultDO calMergeData(MergeDataDO mergeDataDO) {
MergeCalcResultDO mergeCalcResultDO = null;
String key4GroupBy = mergeDataDO.getKey4GroupBy();
String key1 = "M1_" + key4GroupBy;
String key2 = "M2_" + key4GroupBy;
MergeCalcResultDO C1 = cacheService.get(key1);
MergeCalcResultDO C2 = cacheService.get(key2);
if (C1 == null || C2 == null) {
C1 = createCalc(mergeDataDO, 0);
C2 = createCalc(mergeDataDO, 1);
cacheService.put(key1, C1);
cacheService.put(key2, C2);
}
long time1, time2, time3, time4;
time1 = C1.getFirstTime();
time2 = C2.getFirstTime();
time3 = time2 + C2.getInterval() * 1000;
time4 = time3 + C2.getInterval() * 1000;
long nowtime = mergeDataDO.getCurrTime();
if (nowtime < time1) {
} else if (nowtime >= time1 && nowtime < time2) {
calcModule(mergeDataDO, C1);
if (C1.isFull()) {
MergeCalcResultDO tmpCalc = createCalc(mergeDataDO, 2);
mergeCalcResultDO = C1;
C1 = C2;
C2 = tmpCalc;
cacheService.put(key1, C1);
cacheService.put(key2, C2);
}
} else if (nowtime >= time2 && nowtime < time3) {
calcModule(mergeDataDO, C2);
if (C1.isFull()) {
MergeCalcResultDO tmpCalc = createCalc(mergeDataDO, 1);
mergeCalcResultDO = C1;
C1 = C2;
C2 = tmpCalc;
cacheService.put(key1, C1);
cacheService.put(key2, C2);
}
} else if (nowtime >= time3 && nowtime < time4) {
MergeCalcResultDO tmpCalc = createCalc(mergeDataDO, 0);
mergeCalcResultDO = C1;
C1 = C2;
C2 = tmpCalc;
cacheService.put(key1, C1);
cacheService.put(key2, C2);
calcModule(mergeDataDO, C2);
} else {
C1 = createCalc(mergeDataDO, 0);
C2 = createCalc(mergeDataDO, 1);
cacheService.put(key1, C1);
cacheService.put(key2, C2);
calcModule(mergeDataDO, C1);
}
return mergeCalcResultDO;
}
图解