0

ほとんどの場合、データベースの結果をキャッシュするためにMemCacheを使用します。私はこれまでキャッシュを作成して実行したことがないので、すでにキャッシュを実行している人に聞いてみるのは良い考えだと思いました。私が書いているシステムには、ある時点で同時実行スクリプトが実行されている可能性があります。これは私がやろうと計画していることです:

  1. バナー交換システムを書いています。
  2. バナーに関する情報はデータベースに保存されます。
  3. さまざまなサイトがあり、さまざまなトラフィックがあり、それらのバナーのコードを生成するphpスクリプトをロードしています。(バナーがクライアントのサイトに表示されるように)
  4. バナーが初めて表示されるとき、それはmemcacheでキャッシュされます。
  5. バナーには、たとえば1時間のキャッシュライフタイムがあります。
  6. 1時間ごとに、キャッシュが更新されます。

このタスクで見られる潜在的な問題は、ステップ4と6です。たとえば、トラフィックの多い100のサイトがある場合、スクリプトで複数のインスタンスが同時に実行されている可能性があります。キャッシュの有効期限が切れたときにキャッシュが一度再生成され、データが完全な状態になることをどのように保証できますか?

4

1 に答える 1

2

キャッシュの有効期限が切れたときにキャッシュが一度再生成され、データが完全な状態になることをどのように保証できますか?

私が採用しているキャッシングへのアプローチは、より良い言葉がないため、「怠惰な」実装です。つまり、誰かが再びそれを必要とすることを期待して、一度取得するまで何かをキャッシュしません。そのアルゴリズムがどのようになるかの擬似コードは次のとおりです。

// returns false if there is no value or the value is expired
result = cache_check(key)

if (!result)
{
    result = fetch_from_db()

    // set it for next time, until it expires anyway
    cache_set(key, result, expiry)
}

これは、キャッシュをインテリジェントに使用し、すべての情報が同じではないことを理解している限り、使用したい目的に非常に適しています。たとえば、架空のユーザーコメントシステムでは、新しいユーザーが記事にコメントを投稿するたびにキャッシュを無効にできるため、有効期限は必要ありません。次にコメントが読み込まれると、コメントは再キャッシュされます。ただし、一部の情報(気象データが頭に浮かぶ)は、データの更新にユーザー入力に依存していないため、手動で有効期限を取得する必要があります。

その価値については、memcacheはクラスター環境でうまく機能し、そのような設定を行うのは難しいことではないので、必要なものに簡単に拡張できるはずです。

于 2011-04-14T00:16:41.337 に答える