2015-09-05 98 views
2

我使用Redis的客戶端的node.js的Node.js /讓Redis的異步調用

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

我加載DB在接下來的方式:

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模塊的請求被提供。

我該如何解決這個問題?爲什麼不是異步?

+1

API。但'循環' - 沒有。 –

+0

什麼是_「用結果做一些命令」_?什麼是'answers.length'? – robertklep

回答

3

如果你擔心的正常運行時間,那麼你應該使用ZSCAN

使用COUNT選項來獲得在每次調用更多的數據,但要記住:

雖然SCAN不提供有關數量的保證在每次迭代返回的元素,就可以使用COUNT選項

,並在每個結果使用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

正如stdob所說,您的代碼中唯一不是異步的部分是for循環部分。就個人而言,我會創建一個child process並運行數據庫查詢以及您決定對輸出執行的任何操作。如果這不適用於您的應用程序,那麼您可能需要延遲啓動程序30秒或以不同方式處理緩存。