主なことは、これらのカウンタを使用する理由と、近い将来これらが必要になる理由を正確に理解することです。 それらのエンティティを選択/ソート/グループ化する必要がありますか、それともまれな1回限りのレポート(たとえば、1日1回)だけが必要ですか? または、管理パネルまたはユーザーアカウントにこれらのカウンターを表示したいですか? これらの数値をリアルタイムで表示しますか、それとも1時間/ 1日のカットオフに制限できますか? これらと、場合によっては他の基準に応じて、カウンターのカウント方法と保存方法の選択は異なります。
クリック/訪問数
クリック/訪問をカウントするタスクは、さまざまな方法で解決できます。
- ページにアクセスするとき、またはURLにアクセスするときは、カウンターに+1を実行します。
- Webサーバーログを定期的に表示し、目的のURLへのヒット数をカウントします。
- 特別なURLを使用してリダイレクトを実行し、リダイレクトの前に+1を実行します(ただし、これはご存じのとおり、すべての場合に機能しません)。
- JavaScriptを使用して、何らかのイベントでカウンターURLにアクセスします。
- 十分な想像力がある他の方法。
この段階では、検索ロボットの訪問をカウントする必要があるかどうかを判断する必要があります。 内部ネットワークからの要求を読みたくない場合があります。 許可されたユーザーなどからのリクエストのみを考慮することも興味深いかもしれません。
また、計算の精度がどれほど重要であるか、1-2-3単位で間違いを犯す可能性があるかどうかを理解することも重要です。 多くはこれに依存できます。 精度が重要な場合は、パフォーマンスを無視できます。逆に、生産性が重要な場合(ページ送り速度など)、精度はわずかに無視できます。
カウンター収納
さまざまな方法でカウンターを保存することもできます。
- エンティティ/ページテーブルに直接数値フィールドとしてデータベース内で;
- データベース内で、カウンター用に特別に作成された別のテーブルに、また単純な数値フィールドとして。
- さまざまなカウンターをグループ化し、それらをシリアル化し、データベースのBLOBまたはvarcharフィールドに格納します。
- いくつかのNoSQLデータベースでは、たとえば、Id-> count;
- memcache + DBMSの組み合わせ。
- ファイル内。 すでに多くの人がいます。シリアル化された形式の単一のファイルで、エンティティごとにファイルを使用できます。 一般に、メーターを格納するための単純なDBMSの実装まで、多くのことを思いつくことができます。
人生の例
私たちの実践からの具体例を見てみましょう。 MySQLを使用していると言わなければなりません。
タスク:Webボット(Google、Yandex、Mail.Ru Search)を除く、Auto Mail.Ruプロジェクトの購入と販売セクションの発表ページの訪問数をカウントします。 ポータルAuto Mail.Ruで販売広告を公開している自動車販売店のすべての広告の表示回数の合計も考慮する必要があります。
重要なポイント:
- 計算の正確さは重要ですが、非常にまれな不可抗力の状況では、合計で200回を超える訪問は許可されません(これらは午前/午後/夕方のわずか数分での訪問です)。
- 訪問数でエンティティをソートする必要があります。
- 少なくとも30分ごとに1回、午前/午後/夕方にデータベースのカウンターを更新します。 これは、ソートの関連性とアカウントの訪問数の適切な表示に必要です。
最初は「額に」実装しようとしました。 エンティティテーブル(同様に自動車ディーラーテーブル)にviews_countフィールドを作成し、広告ページを表示するたびに更新しました(UPDATEを実行しました)
. .