18

node.js アプリを開発していますが、Redis を大量に使用する必要があります。アプリはcluster8 つの CPU コアで実行されます。

現在、CPU ごとのすべてのワーカーで複数のモジュールが実行されているため、Redis への同時接続が 100 あります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) か、1 つの Redis 接続をグローバルに作成し (シナリオ B)、この接続をすべてのモジュールで共有します。各ソリューションの欠点/利点は何ですか?

前もって感謝します!

4

2 に答える 2

5

このような質問に直面したとき、私は通常、3 つの基本的な質問について考えます。

  1. どちらが読みやすいですか?
  2. より良いコードの再利用を可能にするのはどれですか?
  3. どちらがより効率的ですか?

シナリオに依存するため、必ずしもこの順序である必要はありませんが、この場合、これら 3 つの質問のすべてがオプション B を支持していると思います。createClient のオプションを変更する必要があった場合は、すべてのファイルでそれらを編集する必要があります。それを使用します。オプションAはredisを使用するすべてのファイルで、オプションBはredis.jsです。また、新しい製品や別の製品が出てきて、redis を置き換えたい場合は、redis.js を別のパッケージのラッパーにしたり、新しい redis クライアントでさえ変換時間を大幅に短縮することができます。

グローバルは一般的に悪いことですが、この例では redis.js は変更可能な状態を保存すべきではないため、このコンテキストでグローバル/シングルトンを使用しても問題はありません。

于 2014-10-11T23:02:44.410 に答える
1

Node と Redis はどちらも多くの接続を適切に処理できるため、問題はありません。

あなたの状況では、アプリケーションの起動時に Redis 接続を作成しているため、設定している接続の数は制限されています (アプリケーションの起動後、接続の数は一定になるという意味で)。

同じ接続を再利用したい状況は、非常に動的な状況です。たとえば、リクエストごとに Redis にクエリを実行する必要がある HTTP サーバーなどです。リクエストごとに新しい接続を作成するのはリソースの浪費であり (接続の作成と破棄を常に行う)、リクエストごとに 1 つの接続を再利用することが望ましいでしょう。

2 つのシナリオのどちらを好むかについては、私自身はシナリオ A の方に傾いています。

于 2013-05-17T19:44:33.917 に答える