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

nig*_*owl 8 redis node.js

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

npm install hiredis redis
Run Code Online (Sandbox Code Playgroud)

我看了这里的多个例子:

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

在第17行,它说

// you can re-run the same transaction if you like
Run Code Online (Sandbox Code Playgroud)

这意味着一旦命令完成执行,内部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);
  });
});
Run Code Online (Sandbox Code Playgroud)

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

选项1:我是否应该在http.createServer回调函数中创建多对象,这会在函数执行结束时有效地终止它?创建和销毁这个对象的CPU周期有多贵?

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

你会选择哪个选项?我认为选项1更好 - 我们正在杀死一个对象而不是挑选它的一部分 - 我只是想确定,因为我对节点和javascript都是全新的.

Mat*_*ney 13

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

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

  • 你能用一个例子解释一下吗? (2认同)