2012-01-19 14 views
8

リクエストURIとクエリキャッシュに基づいてnginxを使用してキャッシュキーを生成しています。キャッシュキーが見つからない場合は、直接memcacheをチェックしてPHP-FPMからページを提供します。私の問題は、多くのURLがさまざまな順序で入ってくるクエリー文字列オプションを持っていて、レスポンスごとに2つ以上の別々のキャッシュキーが生成されるということです。可変パラメタを使用したNginxキャッシング

私のキャッシュ設定のようなものです:

http://example.com/api/2.2/events.json?id=53&type=wedding&sort=title&limit=10 
http://example.com/api/2.2/events.json?id=53&limit=10&type=wedding&sort=title 
http://example.com/api/2.2/events.json?id=53&limit=10&sort=title&type=wedding 
:だから、異なる順序でクエリ文字列のparamsでこれらのように入ってくるURLが同じタイプの複数の可能なキャッシュキーを生成してしまう

set $cache_key "$uri?$args"; 

n!可能性...

最後に、memcacheは、クエリ文字列パラメータの順序が異なるため、キャッシュされたコンテンツの潜在的なn!-1複製コピーがあるため、より速くいっぱいになることがよくあります。これを避けるためにキャッシュキーを設定する前にアルファベット順に並べ替える方法はありますか?この問題をうまく解決する他の方法はありますか?

答えて

2

キャッシュキーの生成に重要なパラメータがわかっている場合は、手動で指定できます。あなたの例に基づいて、私は次の例を書いた:

set $cache_key "$uri?id=$arg_id&type=$arg_type&sort=$arg_sort&limit=$arg_limit"; 

それとも、おそらくあなたは、リンクを自分で作成している、ここで例http://wiki.nginx.org/Configuration#Embedded_Perl_examples

+0

問題は、それぞれ独自のパラメータセットを持つ多数のAPI呼び出しが多数存在することです。それらのうちのいくつかは 'limit'のようにグローバルになっていますが、そのほとんどはAPI呼び出しに依存しています。埋め込みPerlのリンクをありがとう - 私は他のソリューションを待っている間にそれをチェックします。 –

0

を参照してください。埋め込まれたPerlを使用して、キャッシュキーを生成します独自の関数を書くことができ、それらをnginxで並べ替えるのではなく、ページの生成時に一貫した順序で出力されるように書き直すことができますか?

+0

はい、できますが、このAPIは複数のモバイルアプリやJSウィジェットで消費されますが、その中にはサードパーティ製のものもありますので、どこでも実施することは非常に難しいです。 –

+0

これは部分的にうまくいくが、変数を使って詳細を知ることができる。可能なすべてのキーでキャッシュキーを$ uri?type = $ arg [type]&sort = $ arg [sort]&limit = $ arg [limit]等に設定しますか? – preinheimer

+0

特定の '$ arg [somekey]'が現在のリクエストに存在しない場合はどうなりますか?このアプローチは、nginxが存在しないクエリパラメータキーについて何らかのエラーをスローしない場合にのみ機能します。 –

関連する問題