18

我正在开发一个 node.js 应用程序,我需要大量使用 Redis。该应用程序将cluster在 8 个 CPU 内核上运行。

现在我有 100 个到 Redis 的并发连接,因为每个 CPU 的每个工作人员都有几个正在运行的模块require('redis').createClient()

情景一:

文件 1.js:

var redis = require('redis').createClient();

文件2.js

var redis = require('redis').createClient();

场景 B:

redis.js

var redis = require('redis').createClient();

module.exports = redis;

文件1.js

var redis = require('./redis');

文件2.js

var redis = require('./redis');

哪种方法更好:在我引入的每个新文件中创建新的 Redis 实例(场景 A)或在全局范围内创建一个 Redis 连接(场景 B)并在我拥有的所有模块之间共享此连接。每种解决方案的缺点/优点是什么?

提前致谢!

4

2 回答 2

5

当我面对这样的问题时,我通常会考虑三个基本问题。

  1. 哪个更具可读性?
  2. 哪个允许更好的代码重用?
  3. 哪个更有效率?

不一定按此顺序,因为它取决于场景,但我相信在这种情况下,所有这三个问题都支持选项 B。如果您需要修改 createClient 的选项,则需要在每个文件中编辑它们它使用它。选项A中的哪个是使用redis的每个文件,选项B只是redis.js。此外,如果出现了更新或不同的产品并且您想要替换 redis,将 redis.js 制作为不同包甚至更新的 redis 客户端的包装器是可行的,从而大大减少了转换时间。

全局变量通常是一件坏事,但在这个例子中,redis.js 不应该存储可变状态,所以在这个上下文中拥有一个全局/单例是没有问题的。

于 2014-10-11T23:02:44.410 回答
1

Node 和 Redis 都可以很好地处理大量连接,所以这不是问题。

在您的情况下,您在应用程序启动时创建 Redis 连接,因此您设置的连接数是有限的(从某种意义上说,在您的应用程序启动后,连接数将保持不变)。

您希望重用相同连接的情况是在高度动态的情况下,例如在 HTTP 服务器中,您需要为每个请求查询 Redis。为每个请求创建一个新连接将浪费资源(始终创建和销毁连接),并且为每个请求重用一个连接会更好。

至于我更喜欢​​这两个场景中的哪一个,我自己倾向于场景A。

于 2013-05-17T19:44:33.917 回答