【问题标题】:nodejs execute redis commands with delaynodejs延迟执行redis命令
【发布时间】:2019-04-05 05:47:52
【问题描述】:

我想从nodejs 应用程序执行几个redis 操作,每次执行之间有一些给定的延迟。

我正在使用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 包。 我还尝试了以下解决方案(谷歌搜索后发现):

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 我想要做的是,使用nodejsredis 中每n 秒增加一个键。

提前致谢! PS:我是nodejs的初学者。

【问题讨论】:

    标签: node.js asynchronous redis sleep


    【解决方案1】:

    这是因为for循环执行并将所有回调放入回调队列,延迟为1s。所以只需将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,并开始使用支持constlet的ES6语法,并且是安全的。

    【讨论】:

    • 这行得通。但是还是不明白添加delay += 1000 是如何解决这个问题的? for 循环本身的延迟不是在每次迭代中都增加 1 秒吗?
    • 这是因为 JavaScript 的事件循环是如何工作的。 for 循环是同步的,而 setTimeout 是异步的。 setTimeout 不会延迟 for 循环的执行。它只是将要执行的回调推送到事件循环的回调队列中,然后继续执行 for 循环。一旦 for 循环完成执行,它将开始执行回调队列中的代码。我建议您阅读 JavaScript 的事件循环,以清楚了解您的 JS 代码是如何执行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 2014-06-22
    • 1970-01-01
    • 2018-09-19
    • 2018-09-12
    相关资源
    最近更新 更多