2012-03-14 14 views
3

大規模なRESTサービスのMemcacheサポートを有効にすることを検討しています。しかし、私はこれらのキーバリューストアのための最善のアプローチに関するいくつかの質問があります。RESTサービスとMemcache

セットアップ:すべてのAPI関数を含む

  • 選択するための機能を有するデータベースラッパー、更新等
  • A RESTフレームワーク(のgetUser、のcreateUser等)

私の頭では理想的なアプローチはMemcacheをデータベースラッパーに統合することです。たとえば、すべてのSQLクエリでmd5ハッシュが得られ、キャッシュに保存されます(これはほとんどのオンラインリソースが示唆しています)。ただし、このアプローチには明らかに問題があります。検索クエリがキャッシュされていて、検索結果のユーザーの1人がキャッシュされた結果の後に更新されている場合、次の要求に反映されません(キャッシュ)。

私はそれを見るように私はこれをhandelingのいくつかの方法があります場合は

  • は、RESTの各機能(のgetUser、のcreateUserなど)のための枠組みとすることにより、明示的なハンドルにキャッシュなどの更新をするMemcacheを実装しますユーザーは更新されます。これは冗長コードに終わる可能性があります。
  • キャッシュされた値の有効期限が非常に短く、一部の要求に古いキャッシュされた値が表示されることがあります。
  • データベースラッパーでMemcacheのより高度な実装を行うことで、どの部分(ユーザーなど)を更新するかを特定することができます。検索要求。

あなたは私に次のうちのいずれか、または完全な別のアプローチをとることができますか? ありがとうございます。

+2

私は興味があります、あなたはHTTPキャッシングを使ってみましたか? memcacheがあなたにHttpキャッシングができないことを教えてくれるものがありますか? –

答えて

2

ウェブアプリケーションのキャッシュを有効にすることは、軽く行うことではありません。

多分あなたは既にそれをやっているかもしれません...ビジネスニーズやフォークキャスト(例:1000要求/秒を受け入れる必要があります)に基づいて目標を立て、次にあなたのシステムが適切にストレステストをしてから何かを変更してボトルネックを特定し始めます。

私は通常、このような(Facebookから)HXProfとしてプロファイリングツールを使用します。データベースが最善のアプローチではないかもしれませんミラーするために、すべてのデータをキャッシュ

キャッシュに割り当てることができるサイズを確認します。あなたのアーキテクチャがあなたのmemcacheに100MBしか割り当てることができないならば、それはキャッシュするものとそれをキャッシュする期間に関するあなたの決定に影響します。

最高のキャッシュは永遠にキャッシュすることです。しかし、私たちは皆、データが変化することを知っている。まず、頻繁に要求されるデータをキャッシュし、フェッチするために最も多くのリソースを必要とします。

あなたは、改善が得られないものを改善するために常に作業していないことを確認してください。

アーキテクチャーを深く理解していないと、誰でもあなたのニーズに最適なキャッシング戦略を推奨することは危険です。

Webサービスのリスル出力をキャッシュしてください。 (@Darrelが話している何)例えばリバースプロキシを使用するか、出力バッファリングを使用して...

あなたはキャッシングについて考える前に、データベースのクエリを最適化します。 PHP Opキャッシュ(APCなど)を使用していることと、標準的な方法であることを確認してください。

あなたがデータをキャッシュして提供されてから古い/古いデータを防ぎたい場合は、トリックは、あなたのデータを識別することである(多分主キー?)とするときに、データが更新または削除された場合、その識別情報のキャッシュを削除または更新します。

<?php 
// After inserting into DB, you can also put it in the cache 
$memcache->set($userId, $userData); 

// After updating or deleting the user, you update or delete the data 
$memcache->delete($userId); 

多くのサイトで古いデータが表示されます。私がstackoverflowで、私の評判が高まって、私がstackoverflowのチャットに入ったとき、示された評判は私の古い評判です。チャットシステムに古い評判データがあり、私の評判が私がチャットできるほどに増加していたことをまだ知りませんでしたので、20の評判(チャットに必要な評判)が得られたら、さらに5分間チャットできませんでした。一部のデータは失効することがありますが、他のタイプのデータは失効することはありません。データをキャッシュするときに考慮してください。

結論は、あなたのアプローチは、すべて私が上記の話を要因に依存して有効であることができます。実際には、キャッシュするさまざまな種類のデータすべてに対して、それらの組み合わせを使用できます。また、古いデータを表示することが許容される期間もあります。評判(またはすべてのユーザーにとって常に変化するデータ)は短期間だけキャッシュする必要がありますが、頻繁に変更されないため、カテゴリや国のリストは長時間キャッシュされる可能性があります。

+0

詳細なフィードバックをいただきありがとうございます。それは多くの助けになりました! –