Node.js / make redis调用异步

时间:2015-09-05 09:38:24

标签: node.js asynchronous redis

我在node.js中使用redis客户端

    var db = require("redis");
    var dbclient = db.createClient();

我以下一种方式加载数据库:

 dbclient.zrange("cache", -1000000000000000, +1000000000000000, function(err, replies){
                logger.info("Go to cache");
                for (var i=0; i < replies.length; i++){
                     (function(i){
                     // Do some commands with the result
                     })(i)
               }
    })

我注意到我的应用程序启动时需要30秒。用于执行数据库查询。在这段时间内,Express模块没有提供任何其他请求。

我该如何解决这个问题?为什么没有异步?

3 个答案:

答案 0 :(得分:3)

如果您担心正常运行时间,那么您应该使用ZSCAN

使用COUNT选项获取每次通话的更多数据,但请记住:

  

虽然SCAN不保证每次迭代返回的元素数量,但可以使用COUNT选项凭经验调整SCAN的行为

在每个结果中使用setImmediate函数迭代到下一个SCAN。

var cursor = '0';

function doscan(){
    dbclient.zscan("cache", cursor, "COUNT", "100", function(err, replies){
                logger.info("Go to cache");

                // Update the cursor position for the next scan
                cursor = res[0];

                if (cursor === '0') {
                    return console.log('Iteration complete');
                } else {
                    for (var i=0; i < replies.length; i++){
                         (function(i){
                         // Do some commands with the result
                         })(i)
                    }
                    setImmediate(function() { doscan() });
                }
    })
}

答案 1 :(得分:1)

正如stdob所说,代码中唯一不同步的部分是for循环部分。就个人而言,我会创建一个child process并运行数据库查询以及您决定对输出做的任何事情。如果这对您的应用程序不起作用,您可能只需要延迟启动程序30秒或以不同方式处理缓存。

答案 2 :(得分:1)