【问题标题】:node.js with redis: synchronous or asynchronous?node.js 与 redis:同步还是异步?
【发布时间】:2011-11-05 13:32:07
【问题描述】:

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

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • MULTI?EXEC 阻塞了redis-server,所以当你可以通过流水线管理时不要使用它。我认为 node_redis 会支持流水线
      【解决方案3】:

      我没有使用过redis,但是如果它有效(如果它不调用未定义的函数)并且它应该是异步的,那么你可以使用它。但是如果更新有错误,那你就没法处理了,这样子。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-03-01
          • 1970-01-01
          • 2015-02-23
          • 1970-01-01
          • 2015-05-16
          • 2017-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多