Node.js,(Hi)Redis和多命令

时间:2011-02-11 15:20:23

标签: node.js redis

我正在玩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环境中的情况?例如,跟踪最后连接的用户(这不需要多个,因为它只执行一个命令,但很容易遵循)

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更好 - 我们正在杀死一个对象而不是挑选它的一部分 - 我只是想确定,因为我对节点和javascript都是全新的。

1 个答案:

答案 0 :(得分:13)

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

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