はnginxのサーバーのすべての労働者の間で共有スペースです:擬似コードでは、私のようなものを持っていることを期待しています。
リストされている操作はすべてアトミックなので、ngx.shared
で2つの操作を順番に使用すると、race conditionsのことだけを気にする必要があります。この場合は、ngx.semaphore
を使用して保護する必要があります。
長所:あなたはRedisのサーバーへのリクエスト/レスポンスのループを避けるためngx.shared
を使用して
- は、データへの高速アクセスを提供します。
ngx.semaphore
が必要な場合でも、データへの高速アクセスが期待できます(ただしベンチマークはありません)。
短所:
- 、ローカルキャッシュが現在のRedisの値を反映していないよう
ngx.shared
キャッシュは、不正確なデータを提供します。これは必ずしも重要なポイントではありません。従業員に使用されている値とRedisに格納されている値の間にはいつでも差があるためです。
ngx.shared
に格納されているデータが矛盾する可能性があります。例えば、x=true
とy=false
を格納できますが、Redisではx
とy
は常に同じ値を持っています。ローカルキャッシュの更新方法によって異なります。
- Redisに送信されるたびにキャッシュ内の値を更新することで、キャッシュを処理する必要があります。これは、redis関数をラップすることで簡単に行うことができます。
redis.get
を呼び出すたびに更新を処理すると、あなた(または誰か)がになるので、バグを予期してください。
- また、読み取りを処理する必要があります。
ngx.cache
に値が見つからない場合は、自動的にRedisから読み取る必要があります。 cache.get
を呼び出すたびに読み込みを処理すると、バグが発生する可能性があります。はになります。
最後の2つの点については、小さなラッパーモジュールを簡単に書き込むことができます。結論として
:あなたは常にアップに常にあなたのRedisのデータのキャッシュを持つことができるよう
- サーバーが
ngx.shared
を使用して、一つまたは複数の労働者で、インスタンスを1つだけ実行されている場合は、面白いです-日付。
- サーバーが複数のインスタンスを実行し、常に最新のキャッシュを持つことが必須の場合、または整合性に問題がある場合は、
ngx.shared
を使用してキャッシュする必要はありません。
- いずれの場合でも、データのサイズが大きくなる可能性がある場合は、メモリ消費量が大きすぎる前にデータを消去する方法を用意してください。クリーニングを提供できない場合は、
ngx.shared
を使用しないでください。
また、何度も何度もそれをINGのget
を回避するために、ひいては効率を改善するために、local
変数内にキャッシュされた値を格納することを忘れないでください。
質問はかなり曖昧です。 「ngx.shared.cache」のgoogle検索では、文字通り10件未満の結果が返されます。適切なMLでこれを尋ねる方がよいでしょう。 – cnst
この場合のキャッシュは自分自身の変数名なので、 'ngx.shared.cache'を検索する意味はありません。問題はむしろ概念的です。現実世界の練習では、パフォーマンスを向上させるためにRedis(またはmemcached)データをnginxキャッシュにキャッシュします。 – Jacobian