4

私は写真ホスティング Web サイトを持っており、写真のビューを追跡したいと考えています。大量のトラフィックが発生するため、ヒットごとに MySQL の列をインクリメントすると、オーバーヘッドが大きくなりすぎます。

私は現在、Memcache を使用してシステムを実装していますが、それはほとんど単なるハックです。

写真が表示されるたびに、Memcache の photo-hits_uuid キーをインクリメントします。さらに、uuid を含む行を、同じく Memcache に格納されている無効化配列に追加します。ときどき無効化配列をフェッチし、その中の行を循環して、ヒットした写真を MySQL にプッシュし、それらの Memcache キーをデクリメントします。

このアプローチは機能し、MySQL を直接使用するよりも大幅に高速ですが、より良い方法はありますか?

4

3 に答える 3

2

私はいくつかの調査を行いましたが、Redis が私の解決策のようです。それは本質的に、より多くの機能を備えた Memcache のようです。

于 2010-01-21T02:28:18.157 に答える
0

このソリューションのために、サーバーにアクセス ログを保持していると思います。

  1. ログを最後にチェックした時間を追跡します。
  2. 約 n 秒ごとに (n は、ログがローテーションされる場合にかかる時間よりも短い)、最新のログ ファイルをスキャンし、最後のチェック時刻の後のタイムスタンプが見つかるまで、すべてのヒットを無視します。
  3. 各画像がアクセスされた回数をカウントします。
  4. データベースに格納されているカウントに各カウントを追加します。
  5. 次回のために、最後に処理したログ エントリのタイムスタンプを保存します。
于 2010-01-21T01:42:39.733 に答える
0

私が使っている方法があります。

方法 1: (ファイルのサイズ) 誰かがページにアクセスするたびに、ファイルに 1 バイト追加します。次に、x 秒ほど (600 に設定) した後、ファイル内のバイト数をカウントし、ファイルを削除してから、MySQL データベースに更新します。これにより、複数のサーバーがキャッシュ サーバー内の小さなファイルに追加する場合のスケーラビリティも可能になります。fwrite を使用してファイルに追加すると、そのキャッシュ ファイルを読み取る必要がなくなります。

方法 2: (数値をファイルに保存) 別の方法として、ヒット数をテキスト ファイルに保存する方法もありますが、2 つのプロセスが同時に更新された場合、データがオフになる可能性があるため、この方法を使用しないことをお勧めします (おそらく方法 1)。

方法 1 を使用します。これは、ファイル サイズが大きくなりますが、高速であるためです。

于 2010-01-21T01:34:40.463 に答える