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

Pon*_*ono 13 redis node.js

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

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

情景A:

file1.js:

var redis = require('redis').createClient();
Run Code Online (Sandbox Code Playgroud)

file2.js

var redis = require('redis').createClient();
Run Code Online (Sandbox Code Playgroud)

情景B:

redis.js

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

module.exports = redis;
Run Code Online (Sandbox Code Playgroud)

file1.js

var redis = require('./redis');
Run Code Online (Sandbox Code Playgroud)

file2.js

var redis = require('./redis');
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Cod*_*son 5

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

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

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

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


rob*_*lep 1

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

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

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

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