在我的应用程序(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动作中使用回调函数,这样会好吗?
答案 0 :(得分:6)
虽然发送了所有命令并且异步解析了响应,但有用的是要注意回调都是按顺序调用的。因此,您可以使用最后一个Redis命令的回调将响应发送到客户端,然后您知道在响应之前已经执行了所有Redis命令。
答案 1 :(得分:2)
使用MULTI / EXEC命令创建命令队列并连续执行。然后使用回调发回一致的响应(成功/失败)。 请注意,必须使用Redis的AOF来避免这种情况 - 在发生崩溃的情况下 - db状态与逻辑不一致,因为队列中只有一部分命令被执行:即MULTI / EXEC在执行时不是事务性的。这是一个有用的reference。
答案 2 :(得分:0)
我没有使用过redis,但是如果这个工作(如果它不调用未定义的函数)并且它应该是异步的,那么你可以使用它。但是如果更新时出错,那么你就无法以这种方式处理它。
答案 3 :(得分:0)
不,您无法确定所有这些操作是否成功完成,因为您的redis服务器可能会崩溃。为了加快速度,您可以将所有更新命令组合成一个带有流水线的命令(您的redis驱动程序是否支持该命令? ),然后通过回调获得整个操作的成功或失败并继续..