node.js с redis: синхронный или асинхронный? - PullRequest
3 голосов
/ 03 ноября 2011

В моем приложении (node ​​/ express / redis) я использую некоторый код для одновременного обновления нескольких элементов в БД:

app.put('myaction', function(req, res){
    // delete stuff
    db.del("key1");
    db.srem("set1", "test");

    // Add stuff
    db.sadd("set2", "test2");
    db.sadd("set3", "test3");
    db.hmset("hash1", "k11", "v11", "k21", "v21");
    db.hmset("hash2", "k12", "v12", "k22", "v22");
    // ...

    // Send response back
    res.writeHead(200, {'content-type': 'application/json'});
    res.write(JSON.stringify({ "status" : "ok" }));

    res.end(); 
});

Могу ли я быть уверен, что ВСЕ эти действия будут выполнены дометод возвращает?Моя забота - асинхронная обработка.Поскольку я не использую функцию обратного вызова в действиях db, это будет хорошо?

Ответы [ 4 ]

6 голосов
/ 05 ноября 2011

Хотя все команды отправляются и ответы анализируются асинхронно, полезно отметить, что все обратные вызовы вызываются по порядку.Таким образом, вы можете использовать обратный вызов последней команды Redis для отправки ответа клиенту, и тогда вы узнаете, что все команды Redis были выполнены до ответа.

2 голосов
/ 03 ноября 2011

Используйте команду MULTI / EXEC, чтобы создать очередь ваших команд и выполнить их подряд. Затем используйте обратный вызов для отправки связного ответа обратно (успех / неудача). Обратите внимание, что вы должны использовать AOF Redis, чтобы избежать - в случае сбоя - состояния db не согласовано с вашей логикой, потому что была выполнена только часть команд в очереди: то есть MULTI / EXEC не является транзакционной после выполнения. Это полезная ссылка .

0 голосов
/ 03 ноября 2011

Нет, вы не можете быть уверены, что все эти действия завершатся успешно, потому что ваш сервер Redis может произойти сбой. Чтобы ускорить процесс, вы можете сгруппировать все свои команды обновления в одну с конвейерной передачей (поддерживает ли ваш драйвер Redis это?), затем получите успешный или неудачный результат всей операции с помощью обратного вызова и продолжайте ..

0 голосов
/ 03 ноября 2011

Я не работал с Redis, но если это работает (если вы не вызываете неопределенную функцию) и оно должно быть асинхронным, тогда вы можете использовать его.Но если при обновлении произошла ошибка, вы не сможете ее обработать, таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...