我应该在文件/模块之间共享Redis连接吗?

时间:2013-05-17 19:18:30

标签: node.js redis

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

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

情景A:

file1.js:

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

file2.js

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

情景B:

redis.js

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

module.exports = redis;

file1.js

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

file2.js

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

哪种方法更好:在我介绍的每个新文件中创建新的Redis实例(方案A)或全局创建一个Redis连接(方案B)并在我拥有的所有模块之间共享此连接。每种解决方案有哪些缺点/好处?

提前致谢!

2 个答案:

答案 0 :(得分:4)

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

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

    Globals通常是一件坏事,但在这个例子中,redis.js不应该存储可变状态,所以在这种情况下有一个global / singleton没有问题。

答案 1 :(得分:1)

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

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

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

至于我喜欢的两个场景中的哪一个,我自己倾向于场景A.