6

投稿が表示された回数を追跡するアプリを実装しています。しかし、私は追跡するための「スマートな」方法を維持したいと思います。つまり、ユーザーがブラウザーを更新したからといって、ビューカウンターを増やしたくないということです。

そのため、IPとユーザーエージェント(ブラウザー)が一意である場合にのみ、ビューカウンターを増やすことにしました。これは今のところ機能しています。

しかし、それから私は思った。Youtubeの場合、この方法でそれを行っており、数千または数百万の再生回数を持ついくつかのビデオがあります。これは、データベース内のビューテーブルにIPとユーザーエージェントが過剰に入力されることを意味します。

これは、彼らのビデオテーブルがビュー用のカウンターキャッシュを持っているという仮定に私をもたらします(すなわちviews_count)。これは、ユーザーがビデオをクリックすると、IPとユーザーエージェントが保存されることを意味します。さらに、ビデオテーブルのカウンターキャッシュ列が増加します。

ビデオがクリックされるたび。Youtubeは、ビューテーブルをクエリし、エントリの数をカウントする必要があります。これはパフォーマンスに大きく影響しませんか?

これは彼らがそれを行う方法ですか?それとももっと良い方法はありますか?

4

3 に答える 3

2

クライアント側のブラウザのフィンガープリントを利用して、ビュー数を一意に識別します。このライブラリは大きな注目を集めているようです。

https://github.com/Valve/fingerprintJS

また、カウントに関係する場合は、Redisを使用することをお勧めします。アトミックインクリメントコマンドは使いやすく、競合状態によってカウントが混乱することがないことを保証します。

これは、カウンターをインクリメントするために使用するコマンドです。

http://redis.io/commands/incr

この場合の鍵は、クライアントから送信されたブラウザの指紋ハッシュです。次に、特定のuser_idに関連付けられていることがわかっているすべてのブラウザーフィンガープリントのリストを含むRedis「セット」を作成できます(セットのキーはuser_idになります)。

最後に、本当に必要な場合は、cronジョブまたはその他の非同期プロセスを実行して、各ユーザーのビューカウントをリレーショナルデータベースのカウンターキャッシュフィールドにダンプします。

また、user_id、ブラウザーの指紋、およびタイムスタンプをリレーショナルデータベース(mysql?)に格納し、それらを定期的に(おそらく、cronを介して)ユーザーテーブルにカウンターキャッシュするというアプローチを取ることもできます。

于 2013-09-05T09:04:00.073 に答える
1

すべてのIPとブラウザを保存する場合は、十分なDBストレージ容量があることを確認し、インデックスを追加します。これで完了です。そうでない場合は、railsセッションを使用して、ユーザーがアクセスしたビデオのリストを保存し、ユーザーが新しいビデオにアクセスしたときにのみ、ビデオのview_count属性をインクリメントできます。

于 2011-09-28T19:46:15.327 に答える
1

まず第一に、afaik、youtubeはBigTableを使用しているので、カウントのクエリについて心配する必要はありません。とにかくデータベースの正確な構造はわかりません。

リレーショナルモデルを使用していると仮定して、列view_countを作成しますが、更新のたびに更新しないでください。訪問者を記録し、定期的にキャッシュを更新します。

また、IP、ブラウザ、日付、およびこれが一意のビューであるかどうかを検出するために使用しているその他の情報からハッシュを生成でき、データ全体を保存することはできません。

また、セッション/ Cookieを使用して、表示されているビューを記録できます。有効期限が切れるので、そのようなメモリの問題にはなりません-1回のセッションで何千ものビデオを視聴している人はいないと思います

于 2011-09-28T20:02:36.417 に答える