Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js与redis:同步还是异步?_Node.js_Redis - Fatal编程技术网

node.js与redis:同步还是异步?

node.js与redis:同步还是异步?,node.js,redis,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

在我的应用程序(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操作中使用回调函数,这样可以吗?

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

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

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

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

MULTI?EXEC会阻塞Redis服务器,因此在您可以通过管道进行管理时不要使用它。我认为node_redis将支持流水线