3

私の問題で私を助けてくれませんか。遅い mysql クエリがいくつかあるので、その結果を memcache にキャッシュしています。

私はこのようなことをします:

$data = get_from_cache();
if (! $data) {
   $data = get_from_mysql();
   set_cache($data);
}

問題。1 秒あたり約 10 件のリクエストがあることもあります。そのため、キャッシュが期限切れになると、この遅い mysql クエリを同時に開始する 5 ~ 10 個の get-request があります。

php でミューテックスを作成するためのパターン、またはこのようなものをお勧めして、mysql への遅い要求を 1 つだけ実行してください。

4

1 に答える 1

3

これはドッグパイル問題として知られています。戦略: Memcache Dog Pileを分割する では、次の 2 つのアプローチについて説明します。

解決策 1:

  • キャッシュ アイテムの有効期限を将来的に設定します。
  • 値でシリアル化された「実際の」タイムアウトを埋め込みます。たとえば、項目を 24 時間でタイムアウトするように設定しますが、組み込みのタイムアウトは 5 分後になる可能性があります。
  • キャッシュからの取得時に、古いタイムアウトが期限切れになっているかどうかを判断し、期限切れになったらすぐに未来の時間を設定して、データをそのまま復元します。これにより、リスクのウィンドウが閉じられます。
  • DB からデータをフェッチし、最新の値でキャッシュを更新します。

解決策 2:

  • memcached に 2 つのキーを作成します。有効期限が通常よりも少し長い MAIN キー + 期限が早く切れる STALE キーです。
  • get read STALE キーでも。stale の有効期限が切れている場合は、stale キーを再計算して再度設定します。
于 2013-06-10T15:08:07.433 に答える