web-dev-qa-db-ja.com

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

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

前提条件

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


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

  1. オブジェクトAが作成されます->データベースに保存し、キャッシュに保存します
  2. クライアントから要求されたオブジェクトA->キャッシュの存在を確認します。それ以外の場合は、データベースからフェッチしてキャッシュに保存します
  3. オブジェクトAが更新される->データベースに保存、キャッシュに保存

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


アプローチ2(レイジーキャッシュストア)

  1. オブジェクトAが作成されます->データベースに保存
  2. クライアントから要求されたオブジェクトA->キャッシュの存在を確認します。それ以外の場合は、データベースからフェッチしてキャッシュに保存します
  3. オブジェクトAが更新されます->データベースに保存し、キャッシュ内のキーを削除します

アプローチ2の方がメモリを意識しているようです。このアプローチでは、要求されたアイテムのみがキャッシュに入れられます。


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

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

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

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

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

Q1。アプローチ2は、パフォーマンスの向上はほとんどありませんが、memcachedにオブジェクトを送信しないため、パフォーマンスの点で優れています。

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

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

2
neo