需求是:根据目标积分从redis有序集合里取出一定数量低于给定积分的数据,假如给定积分是1000分,每次递减100分,那么就先取1000-900之间的数据。假如要求取20条,如果第一次没取够,则再减100,即第二次就取1000-800之间的,以此类推,直到取够20条或积分减到0则停止取。 我现在实现的代码如下,但是代码好像有问题,因为更新该代码后服务器的CPU一直高居不下。目前还在测试是不是该段代码导致的。 大家帮忙看看,代码是不是有问题,或者这样的逻辑应该怎么写
var getEnemy = function (score, key, temp_min) {
var max = score,
min = score - 100;
if (!isEmpty(temp_min)) min = temp_min;
if (min < 0) min = 0;
return cache.zrevrangebyscore(key, max, min)
.then(function (val) {
//未取够20条且还未到最低分数,扩大范围继续取
if(val.length<20&&min>0){
min-=100;
return getEnemy(score, key, min);
} else return val;
});
};
var isEmpty = function (obj) {
return (obj == null || typeof obj == "undefined" || obj.length == 0)
};
回复 (4)
Z
你的 val 没有合并前一个 val,这样如果每次都不够 20 条,那不都需要取到 0 才结束了?
M
你这个判断有问题
if (temp_min) min = temp_min;
有问题,如果 score 等于 1000 ,然后1000 - 0,不够20条数据的话。 min-=100; min 等于0,结合上面那个判断,temp_min并不会赋值给min,min等于score-100,一直循环
I
引用 zbinlin你的 val 没有合并前一个 val,这样如果每次都不够 20 条,那不都需要取到 0 才结束了?
@zbinlin max一直没变,只是减小了min,min一直在不断的减小,所以实际上是合并了的。
I
引用 mabu233你这个判断有问题 if (temp min) min = temp min; 有问题,如果 score 等于 1000 ,然后1000 0,不够20条数据的话。 min =100; min 等...
@mabu233 我代码没贴全,上面为了方便所以就那样写了。我修正了下上面的代码
参与回复
登录后即可参与回复。登录