我正在开发一个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)并在我拥有的所有模块之间共享此连接。每种解决方案有哪些缺点/好处?
提前致谢!
答案 0 :(得分: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.