【问题标题】:Node.js, (Hi)Redis and the multi commandNode.js、(Hi)Redis 和 multi 命令
【发布时间】:2011-06-25 15:18:36
【问题描述】:

我正在使用 node.js 和 redis 并通过此命令安装了hiredis 库

npm install hiredis redis

我在这里查看了多个示例:

https://github.com/mranney/node_redis/blob/master/examples/multi2.js

在第 17 行它说

// you can re-run the same transaction if you like

这意味着一旦命令执行完毕,内部的 multi.queue 对象就永远不会被清除。

我的问题是:您将如何处理 http 环境中的情况?例如,跟踪最后连接的用户(这实际上不需要 multi,因为它只执行一个命令但很容易遵循)

var http = require('http');
redis = require('redis');

client = redis.createClient()
multi = client.multi();

http.createServer(function (request, response) {
  multi.set('lastconnected', request.ip); // won't work, just an example
  multi.exec(function(err, replies) {
      console.log(replies);
  });
});

在这种情况下,multi.exec 将为第一个连接的用户执行 1 个事务,为第 100 个用户执行 100 个事务(因为内部的 multi.queue 对象永远不会被清除)。

选项 1: 我应该在 http.createServer 回调函数中创建多对象,这会在函数执行结束时有效地杀死它吗?就 CPU 周期而言,创建和销毁该对象的成本是多少?

选项 2: 另一个选项是创建一个新版本的 multi.exec(),类似于 multi.execAndClear(),它会在 redis 执行时清除队列 一堆命令。

你会选择哪个?我想选项 1 更好——我们正在杀死一个对象而不是挑选其中的一部分——我只是想确定一下,因为我对 node 和 javascript 都是全新的。

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    node_redis 中的多对象创建起来非常便宜。作为副作用,我认为让你重新使用它们会很有趣,但这显然只在某些情况下有用。每次你需要一个新事务时都创建一个新的多对象。

    要记住的一件事是,只有当您确实需要所有操作在 Redis 服务器中以原子方式执行时,才应该使用 multi。如果您只是想有效地批量处理一系列命令以节省网络带宽并减少您必须管理的回调数量,只需一个接一个地发送单个命令。 node_redis 会自动将这些请求按顺序“流水线化”到服务器,并且将按顺序调用各个命令回调(如果有)。

    【讨论】:

    • 你能举个例子解释一下吗?
    • 解释同上。文档说它排空了队列。鉴于您可以重新运行 exec 并让它重复命令,这非常令人困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2020-10-15
    • 2015-10-24
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多