2017-08-09 8 views
0

nginxにLuaコードが埋め込まれています。このコードでは、私はRedisキャッシュから小さなデータを取得します。今私はそれがngx.sharedの構造を使用して(すでに何らかの意味でキャッシュされている)このデータをキャッシュするのが良い練習であるならば、私は疑問に思う?このようにして賛否両論はありますか?ngx.sharedにRedisデータをキャッシュするのがよい方法ですか?

ドキュメント ngx.sharedに述べたように
local cache = ngx.shared.cache 
local cached_key = cache:get("cached_key") 
if cached_key == nil then 
    ... get data from Redis 
    cache:set("cached_key", cached_key) 
end 
+0

質問はかなり曖昧です。 「ngx.shared.cache」のgoogle検索では、文字通り10件未満の結果が返されます。適切なMLでこれを尋ねる方がよいでしょう。 – cnst

+0

この場合のキャッシュは自分自身の変数名なので、 'ngx.shared.cache'を検索する意味はありません。問題はむしろ概念的です。現実世界の練習では、パフォーマンスを向上させるためにRedis(またはmemcached)データをnginxキャッシュにキャッシュします。 – Jacobian

答えて

2

はnginxのサーバーのすべての労働者の間で共有スペースです:擬似コードでは、私のようなものを持っていることを期待しています。

リストされている操作はすべてアトミックなので、ngx.sharedで2つの操作を順番に使用すると、race conditionsのことだけを気にする必要があります。この場合は、ngx.semaphoreを使用して保護する必要があります。

長所:あなたはRedisのサーバーへのリクエスト/レスポンスのループを避けるためngx.sharedを使用して

  • は、データへの高速アクセスを提供します。
  • ngx.semaphoreが必要な場合でも、データへの高速アクセスが期待できます(ただしベンチマークはありません)。

短所:

  • 、ローカルキャッシュが現在のRedisの値を反映していないようngx.sharedキャッシュは、不正確なデータを提供します。これは必ずしも重要なポイントではありません。従業員に使用されている値とRedisに格納されている値の間にはいつでも差があるためです。
  • ngx.sharedに格納されているデータが矛盾する可能性があります。例えば、x=truey=falseを格納できますが、Redisではxyは常に同じ値を持っています。ローカルキャッシュの更新方法によって異なります。
  • Redisに送信されるたびにキャッシュ内の値を更新することで、キャッシュを処理する必要があります。これは、redis関数をラップすることで簡単に行うことができます。 redis.getを呼び出すたびに更新を処理すると、あなた(または誰か)になるので、バグを予期してください。
  • また、読み取りを処理する必要があります。ngx.cacheに値が見つからない場合は、自動的にRedisから読み取る必要があります。 cache.getを呼び出すたびに読み込みを処理すると、バグが発生する可能性があります。になります。

最後の2つの点については、小さなラッパーモジュールを簡単に書き込むことができます。結論として

:あなたは常にアップに常にあなたのRedisのデータのキャッシュを持つことができるよう

  • サーバーがngx.sharedを使用して、一つまたは複数の労働者で、インスタンスを1つだけ実行されている場合は、面白いです-日付。
  • サーバーが複数のインスタンスを実行し、常に最新のキャッシュを持つことが必須の場合、または整合性に問題がある場合は、ngx.sharedを使用してキャッシュする必要はありません。
  • いずれの場合でも、データのサイズが大きくなる可能性がある場合は、メモリ消費量が大きすぎる前にデータを消去する方法を用意してください。クリーニングを提供できない場合は、ngx.sharedを使用しないでください。

また、何度も何度もそれをINGのgetを回避するために、ひいては効率を改善するために、local変数内にキャッシュされた値を格納することを忘れないでください。

+0

ありがとうございました!非常に有益な情報です! – Jacobian

関連する問題