2011-11-03 141 views
3

在我的应用程序(节点/快递/ redis的),我使用一些代码在同一时间更新DB几项:node.js与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(); 
}); 

我能肯定所有这些行动将在该方法返回之前执行?我关心的是异步处理。因为我不在数据库操作中使用回调函数,这会好吗?

回答

2

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

+0

多?EXEC块Redis的服务器,所以不要用它当u可与流水线管理。我认为node_redis将支持流水线 –

0

我还没有和Redis的工作,但是,如果这个工程(如果你没有调用未定义功能),它应该是异步的,那么你可以使用它。但是,如果在更新时出现错误,那么您无法通过这种方式处理它。

0

不,你不能肯定是否所有这些行动成功完成,因为你的Redis服务器可能会崩溃。要加快速度,您可以将您的所有更新命令到一个与流水线(做你的Redis的驱动程序支持, ?),然后通过回调获得整个操作的成功或失败并继续。

6

尽管所有命令都是异步发送和响应解析的,但请注意,所有回调都是按顺序调用的。所以,你可以使用最后Redis的命令的回调发送给客户端的响应,然后你就会知道,所有的Redis命令已响应之前执行。

+0

谢谢,我不知道订单被保留。 – Luc