2

ユーザー生成コンテンツを含む Web サイトを構築しています。ホームページで、作成されたすべてのアイテムのリストを表示したいのですが、それらをビュー カウンターで並べ替えられるようにしたいと考えています。それは簡単に聞こえますが、複数のカウンターが必要です。前日、先週、先月、または全体で最もアクセスされたアイテムはどれか知りたいです。

私の最初のアイデアは、アイテムの DB テーブルに 4 つのカウンター列を作成することでした。デイリー、ウィークリー、マンスリー、オーバーオールのそれぞれに 1 つずつ、24 時間ごとにデイリー カウンター、7 日ごとにウィークリー カウンターなどをクリアする cron ジョブを作成します。

しかし、これに関する私の問題は、週間カウンターがクリアされた直後に、その週で最も閲覧されたアイテムを知りたい場合はどうなるかということです。

私が必要としているのは、古すぎるページビューごとに減少し、新しいページビューごとに増加する継続的なカウンターを作成する効率的な方法です。

現在、redis サーバーで解決策を考えていますが、まだ解決策がありません。

ここでは一般的なアイデアを探しているだけですが、参考までに、このアプリケーションを Ruby on Rails で開発しています。

4

3 に答える 3

3

タイムスタンプとユーザーIDまたは保存できるものだけを使用して、各ページのヒットを追跡することをお勧めします。データは使いやすい形式であるため、好きなようにカウンターを計算し、後で変更できます。 . エンティティ (ページ) のユーザー ID とタイムスタンプを含むテーブルが適切です。ページが要求されるたびに、それに追加するだけです。

挿入の数を減らすために、ソフトウェアでそれらをまとめてバッチ処理できます。ここで MySQL 用に複数行の挿入を作成すると、オーバーヘッドが節約されます。説明どおりに挿入を構築し、挿入まで保存するためにクラスが必要になるだけです。1 つのアイデアは、時間だけでなく、多数の行をバッチ処理するように修正することです。これにより、サーバーが行方不明になった場合に x 行のヒットのみを失うだけで済みます。

挿入の完全なバッチが完了した後にのみ実行できる MySQL トリガーがあり、これを使用してレポート テーブルを更新できるため、メインのヒット トラッキング テーブルを常にヒットする必要はありません。

また、これが非常に高いスループットである必要がある場合は、独自のシャードに分割し、Ajax 呼び出しを介してアクセスして、ヒット トラッキングを実行し、カウントを取得することができます。

于 2010-04-08T16:33:25.160 に答える
1

あなたができることは、訪問されたものと日付(タイムスタンプ)を保存することであり、何かが訪問されるたびにこれを行います。訪問したものを取得したい場合は、日付 (タイムスタンプ) の範囲内のものを選択し、それらを一緒に追加します。

また

各リンクには、訪問した日ごとにそれぞれの行があります。1 日に複数回訪問した場合は、既存の値に +1 が加算されます。

2 番目の例を使用して、週が、今日の 7 日前ではなく、日曜日から土曜日のようなものである場合、毎日ではなく毎週のストレージを実行できます。そのため、day という単語を week という単語に置き換えて、データ ストレージの量を減らします。

巨大なデータ ストアを避けたいと考えていることはわかりますが、これを機能させるためには、これよりも優れているとは思いません。 - 土曜日であり、今日の 7 日前ではありません。

いくつかのドキュメントを見た後、レジスサーバーの可能性があります。

SET link_id|date => "visit_count"

これは、使用したい文字または文字で区切られたものlink_idと一緒に、または何と呼んでも保存します。そのキー値には、.date|visit_count

この日にそのリンクにヒットを追加したいとします。返された値に +1をGET link_id|date追加し、visit_count上記の方法で保存します。

特定の日付のヒット数を取得したい場合は、GET link_id|date再度使用できます。

ruby-on-rails を使用してlink_iddatevisit_countを適切な値に置き換えます。

これがお役に立てば幸いです。

于 2010-04-08T16:36:05.130 に答える
0

できることは、ViewCounters というテーブルを作成することです。

「pageId」列、「day」列、「views」列があります。pageId は表示されているページに対応し、「日」は表示された日に対応します。

ページが表示されるたびに、その pageId と現在の日付を含む ViewCounters テーブルの行が検索されます (または、まだ存在しない場合は作成されます)。次に、その行の「ビュー」列を増やします。

これにより、新しいカウンターの作成と履歴へのアクセスに関して最大​​限の柔軟性が得られます。さらに、毎月、毎週、および毎日のカウンターのビュー カウントはすべて非常に安価に生成できます。

これのもう 1 つの大きな利点は、1 日 1 ページあたり 1 行のみであるということですが、これはそれほど悪くはありません。

于 2010-04-08T16:46:47.200 に答える