nodejs выполняет команды redis с задержкой - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу выполнить несколько redis операций из приложения nodejs с некоторой заданной задержкой между каждым выполнением.

Я использую node_redis клиент. Версия узла v8.10.0

Я думал о его реализации, как показано ниже:

function func(id1, max){
    for(i=0; i < max; i++){       
        client.incr(id1, (error, value) => {
            if(error){
                console.log("redis incr failed : " + error);
                return error;
            }
            console.log("updated value : " + value);
        });
        sleep.sleep(1);
    }
    client.quit();
return("incr value ended for : " + id);    
}

func(id1, max);

Но тогда в этом случае полный redis incr происходит с натяжкой, и обратный вызов (console.log("updated value : " + value")) происходит с задержкой. Примечание: для sleep в приведенном выше коде я использую пакет sleep . Я также попробовал следующее решение (найдено после поиска в Google):

var delay = 1000; //1 second

for (var i = 0; i < max; i++) {
    setTimeout(() => {
        client.incr(id, (error, value) => {
            if(error){
                console.log("redis incr failed : " + error);
                return error;
            }
            console.log("updated value : " + value);
        });
    }, delay);
}

Но он также ведет себя так же, как и выше.

Afaik, это вызвано тем, что nodejs synchronous и (я думаю) node_redis клиент async.

TL; DR То, что я хочу сделать, это увеличивать ключ каждые n секунд в redis с помощью nodejs.

Заранее спасибо! PS: я новичок в nodejs.

1 Ответ

0 голосов
/ 01 ноября 2018

Это потому, что цикл for выполняется и помещает все обратные вызовы в очередь обратного вызова с задержкой в ​​1 с. Так что просто измените цикл for на это.

let delay = 1000; //1 second

for (let i = 0; i < max; i++) {
    setTimeout(() => {
        client.incr(id, (error, value) => {
            if(error){
                console.log("redis incr failed : " + error);
                return error;
            }
            console.log("updated value : " + value);
        });
    }, delay);
    delay += 1000;
}

Также, пожалуйста, избегайте использования var и начинайте использовать синтаксис ES6, который поддерживает const и let и безопасен при подъеме.

...