【问题标题】:Should I share Redis connection between files/modules?我应该在文件/模块之间共享 Redis 连接吗?
【发布时间】:2014-10-12 07:02:44
【问题描述】:

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

现在我有 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)并在我拥有的所有模块之间共享此连接。每种解决方案的缺点/优点是什么?

提前致谢!

【问题讨论】:

  • 也许连接池可以同时满足这两种情况?
  • @akonsu 你能举个那个连接池的例子吗

标签: node.js redis


【解决方案1】:

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

  1. 哪个更具可读性?
  2. 哪个可以更好地重用代码?
  3. 哪个效率更高?

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

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

【讨论】:

    【解决方案2】:

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

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

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

    至于这两个场景我更喜欢哪一个,我自己倾向于场景A。

    【讨论】:

    • 这是一个很好的观点,但如果您将节点实例扩展到 10 个正在运行的实例并且每个实例有 2 个连接,那么您将创建 20 个连接,那么方法 A 在扩展时效率会很低
    • @PirateApp 假设所有这些连接都将被使用,为什么它会效率低下? :)
    • 这就是为什么 :) medium.com/@stockholmux/…
    • @PirateApp 打开连接当然很昂贵,但维护打开的连接却不是。我也同意每个进程打开 20 个连接是愚蠢的,但我没有看到打开 2 个的问题。事实上,打开多个连接可能有充分的理由,例如,如果您的应用程序需要能够切换数据库或者如果它使用阻塞操作。
    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 2020-10-22
    • 2011-06-02
    • 2016-12-09
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多