2011-11-03 186 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