请教各位这段代码有没有问题,该如何写
发布于 7 年前 作者 im-here 2567 次浏览 来自 问答

需求是:根据目标积分从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 回复

你的 val 没有合并前一个 val,这样如果每次都不够 20 条,那不都需要取到 0 才结束了?

你这个判断有问题

if (temp_min) min = temp_min;

有问题,如果 score 等于 1000 ,然后1000 - 0,不够20条数据的话。 min-=100; min 等于0,结合上面那个判断,temp_min并不会赋值给min,min等于score-100,一直循环

@zbinlin max一直没变,只是减小了min,min一直在不断的减小,所以实际上是合并了的。

@mabu233 我代码没贴全,上面为了方便所以就那样写了。我修正了下上面的代码

回到顶部