我正在开发一个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)并在我拥有的所有模块之间共享此连接.每种解决方案的缺点/好处是什么?
提前致谢!
当我面对这样的问题时,我通常会考虑三个基本问题。
不一定按此顺序,因为它取决于场景,但我相信在这种情况下,所有这三个问题都支持选项 B。如果您需要修改 createClient 的选项,则需要在每个文件中编辑它们哪个使用它。其中选项 A 是每个使用 redis 的文件,选项 B 只是 redis.js。此外,如果出现更新或不同的产品并且您想替换 redis 将 redis.js 用作不同包甚至更新的 redis 客户端的包装器是可行的,从而大大减少转换时间。
全局通常是一件坏事,但在这个例子中 redis.js 不应该存储可变状态,所以在这种情况下有一个全局/单例没有问题。
Node 和 Redis 都可以很好地处理大量连接,所以这不是问题。
在您的情况下,您在应用程序启动时创建 Redis 连接,因此您设置的连接数量是有限的(从某种意义上说,在应用程序启动后,连接数量将保持不变)。
您希望重用相同连接的情况是在高度动态的情况下,例如使用 HTTP 服务器时,您需要为每个请求查询 Redis。为每个请求创建一个新连接会浪费资源(一直创建和销毁连接),并且为每个请求重用一个连接会更好。
至于我更喜欢这两种方案中的哪一种,我自己倾向于方案A。
| 归档时间: |
|
| 查看次数: |
3307 次 |
| 最近记录: |