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

我正在开发一个node.js应用程序,我需要沉重的Redis使用。 该应用程序将跨8个CPU核心进行cluster

现在我有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'); 

哪种方法更好:在我介绍的每个新文件(schemeA)中创build新的Redis实例,或者在全局范围内创build一个Redis连接(schemeB),并在我拥有的所有模块之间共享此连接。 每个解决scheme的缺点/好处是什么?

提前致谢!

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

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

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

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

Node和Redis都可以处理很多连接,所以这不是问题。

在你的情况下,你在你的应用程序启动时创build了Redis连接,所以你设置的连接数是有限的(从你的应用程序启动之后,连接数是固定的)。

您希望重复使用相同连接的情况处于高度dynamic的情况下,例如使用HTTP服务器,您需要为每个请求查询Redis。 为每个请求创build一个新的连接将浪费资源(始终创build和销毁连接),并为每个请求重用一个连接将是更可取的。

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