2015-09-05 4 views
2

Я использую REDIS клиента в node.jsNode.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 не обслуживается.

Как я могу перенести эту проблему? Почему нет асинхронного?

+1

API из Redis асинхронно. Но «цикл для» - нет. –

+0

Что такое _ «делать некоторые команды с результатом» _? Что такое 'replies.length'? – robertklep

ответ

3

Если вы беспокоитесь о времени безотказной работы, то вы должны использовать ZSCAN

Используйте параметр COUNT, чтобы получить больше информации о каждом вызове, но помните:

Хотя SCAN не дает гарантии о количестве элементов, возвращаемых на каждой итерации, можно эмпирически регулировать поведение SCAN с помощью опции COUNT

И в каждом результате использования функции setImmediate в Ite перейти к следующему 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 секунд или обработать кеш по-разному.

Смежные вопросы