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

标签 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 环境中的情况?例如,跟踪最后一个连接的用户(这实际上不需要 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_redis 中的多个对象的创建成本非常低。作为副作用,我认为让您重新使用它们会很有趣,但这显然只在某些情况下有用。每次需要新事务时,继续创建一个新的多对象。

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

关于Node.js、(Hi)Redis 和多命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970727/

相关文章:

javascript - Redis 队列将列表中的项目存储为 [object Object]

javascript - Node Express passport (JWT) - 授权后回调

eclipse - nodeclipse 中有单元测试集成吗?

node.js - 尽管成功 echo $variable,NodeJs/etc/environment 仍看不到文件更改

javascript - TypeError : Router. use() 需要中间件函数但得到一个对象

Heroku Spring Redis - SessionDestroyedEvent

具有 Multi-Tenancy 的 Spring Data Redis

c# - Redis MSET 相当于 SET 或 LIST?

node.js - 使用 Jade 渲染带动态链接的 iframe

nosql - Redis 在高负载时周期性地停止响应