共有キャッシュ-無効化のベストプラクティス


14

キャッシュオブジェクトを無効化/更新するためのより良いアプローチは何か知りたいです。

前提条件

  • リモートmemcachedサーバーを持つ(複数のアプリケーションのキャッシュとして機能する)
  • すべてのサーバーはAzure(アフィニティリージョン、同じデータセンター)によってホストされます
  • キャッシュオブジェクトのサイズは200バイトから50キロバイトまでの範囲です


アプローチ1(できるだけ早くキャッ​​シュに保存)

  1. オブジェクトAが作成されます->データベースに保存し、キャッシュに保存します
  2. クライアントによって要求されたオブジェクトA->キャッシュの存在をチェック、そうでなければデータベースからフェッチしてキャッシュに保存
  3. オブジェクトAが更新されます->データベースに保存、キャッシュに保存

アプローチ1はより簡単なようです。何かが作成されたら、できるだけ早くキャッ​​シュに入れてください。誰かに関係なくそれが必要になります。


アプローチ2(遅延キャッシュストア)

  1. オブジェクトAが作成されます->データベースに保存
  2. クライアントによって要求されたオブジェクトA->キャッシュの存在をチェック、そうでなければデータベースからフェッチしてキャッシュに保存
  3. オブジェクトAが更新されます->データベースに保存、キャッシュのキーを削除

アプローチ2は、より多くのメモリを認識しているようです。このアプローチでは、リクエストされたアイテムのみがキャッシュに保存されます。


質問1:パフォーマンスを考慮して、より良いアプローチは何でしょうか?メモリもCPUもまだカウントされません。

質問2:私の考えは一種の時期尚早な最適化ですか?

質問3:他に考えはありますか?他のアプローチ?

回答:


12
  1. それは依存するという以外は答えられませんどのアプローチがあなたの場合に最適になるかを決定する多くの要因があります。例えば:作成されたオブジェクトが作成された直後に取得されるのは正常ですか?更新とアクセスの比率はどのくらいですか?
  2. Re。キャッシュが必要であると判断する:データなしで最適化する場合は、技術的に時期尚早な最適化です。技術的に言うと、経験/従来の知恵から、何らかのキャッシュが必要になると言われることがあります。Re。キャッシュが最適に機能する方法を決定します。はい、間違いなく時期尚早な最適化です。
    • 最適化は、多くの場合、最適なソリューションを見つけることではありません。次のようになります。
      1. システムのボトルネックを見つけます。
      2. 最小限の作業で最大の違いを生むことができる場所を見つけてください。
      3. 最小限の作業をしてください!
      4. まだ十分速いですか?そうでない場合は、#1に進みます。
      5. できた!
    • 正直なところ、どちらのアプローチも複雑に聞こえます。両方を実装して、どちらが最適かを確認してみませんか?
    • アプローチ#2のステップ3は、「オブジェクトAが更新される->データベースに保存、キャッシュのエントリを更新する」に変更できます。

バケタ、答えてくれてありがとう。ありがたいです。
lurkerbelow

@lurkerbelow喜んでお手伝いします。
vaughandroid

2

memcachedは独自のポリシーでオブジェクトを管理します。キャッシュされたオブジェクトは、誰もアクセスしないか、memcachedのメモリが不足すると期限切れになります。したがって、memcached内のオブジェクトは、オブジェクトの作成時にメモリ不足が原因で無効化され続けるため、最初のアプローチはお勧めできません。

Q1。アプローチ2は、パフォーマンスの面では改善されませんが、memcachedにオブジェクトを送信しないため、パフォーマンスの点で優れています。

Q2。言うのは難しいです。ボトルネックを知っていると仮定し、それが時期尚早ではないアプローチをドラフトします。

Q3。memcachedのみでのキャッシュなど、他のアプローチもあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.