带redis的node.js:同步还是异步?

时间:2011-11-03 09:28:51

标签: node.js redis

在我的应用程序(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 个答案:

答案 0 :(得分:6)

虽然发送了所有命令并且异步解析了响应,但有用的是要注意回调都是按顺序调用的。因此,您可以使用最后一个Redis命令的回调将响应发送到客户端,然后您知道在响应之前已经执行了所有Redis命令。

答案 1 :(得分:2)

使用MULTI / EXEC命令创建命令队列并连续执行。然后使用回调发回一致的响应(成功/失败)。 请注意,必须使用Redis的AOF来避免这种情况 - 在发生崩溃的情况下 - db状态与逻辑不一致,因为队列中只有一部分命令被执行:即MULTI / EXEC在执行时不是事务性的。这是一个有用的reference

答案 2 :(得分:0)

我没有使用过redis,但是如果这个工作(如果它不调用未定义的函数)并且它应该是异步的,那么你可以使用它。但是如果更新时出错,那么你就无法以这种方式处理它。

答案 3 :(得分:0)

不,您无法确定所有这些操作是否成功完成,因为您的redis服务器可能会崩溃。为了加快速度,您可以将所有更新命令组合成一个带有流水线的命令(您的redis驱动程序是否支持该命令? ),然后通过回调获得整个操作的成功或失败并继续..