2

ColdFusion アプリのヒット カウンターを作成したいと考えています。ページ ヒットごとにデータベース ヒット テーブルを更新したくありません。理想的には、ヒットをアプリ スコープに集約するか、キャッシュをある種の構造体に集約し、それらを断続的に保存したいと考えています。

私はこれまでのところアイデアを持っています:.

アイデア1

  1. pageId と pageHits のキーと値のペアを格納するアプリまたはキャッシュの構造体を作成します。
  2. 各ページ ヒットで、pageId/IP アドレス Cookie の存在を確認します。
  3. を。存在する場合は、何もしません。
  4. b. そうでない場合は、それを設定し、アプリまたはキャッシュのヒット構造体を更新します。

問題:構造体データをデータベースに断続的に/一定時間経過後に取得する方法がわかりません。イベント予定?

アイデア2

クッキーはありません。pageId/IP アドレスを独自のキャッシュ/アプリ構造体に保存します。

問題情報を格納するためにデータ構造体/配列を構造化する方法がわかりません。配列ループと構造体の検索が複雑に見えます。そして、私はまだアイデア1と同じ問題を抱えています。

アドバイス、アイデア、批判はありますか?特に、アイデア 2 のデータ構造を理解する助けが必要です。データの整合性よりもパフォーマンスに関心があり、CF9 のみのソリューションに満足しています。すべてのページIDのページヒット列にデータを非正規化しようとしていることを追加する必要があります。正規化されたデータ テーブルは必要ありません。

4

2 に答える 2

5

説明した方法でこのデータをキャプチャしようとすると、キャッシュの有効期限に関するスケーリングの問題が発生し、最終的にデータベースに永続化したいときにエントリ数が増加するため、OOM または長い反復時間を回避できます。集約する情報は、Web サーバーのログに既にキャプチャされています。これらの解析は単純な作業です。必要なのは、これらのロールオーバーの方法とタイミングを認識するアルゴリズムを作成することだけです。

を介して定期的に使用log = fileRead('log.txt', 'read')および反復します。バッチごとに、既に説明した方法で、IP アドレスに基づいてINSERT/UPDATE (通常は MERGE キーワードを使用しますが、MySQL は異なります)に任意のデータベース アプローチを使用できます。トラフィックが非常に多いサイトの場合は、IP アドレス列のデータ型を整数データ型に変更して、インデックス ルックアップを高速化することを検討してください。line fileReadLine(log)<cfschedule/>

アップデート

次のコードを使用して、ファイル オブジェクト参照をセットアップします。

<cflock name="logparser" type="exclusive" timeout="1" throwontimeout="false">
    <cfif NOT structKeyExists(application, "logFile")>
        <cfset application.logFile =
            fileOpen('/path/to/log.txt', 'read')>
    </cfif>
    <cfloop condition="NOT FileisEOF(application.logFile)">
        <!--- replace with an appropriate algorithm --->
        <cfoutput>
            #fileReadLine(application.logFile)#
            <br />
        </cfoutput>
    </cfloop>
</cflock>

これを行うと、参照が 1 回 (つまり ) セットアップされ、fileOpen()それがどの行にあるかが追跡されます。次に、<cfschedule/>このコードを再度ヒットすると、既存の参照が存在する場合はそれを使用し、そこから前方に反復します。ロックにより、1 つのスレッドのみがアルゴリズムを実行することが保証されます。そのため、時間の制約について心配する必要はなく、必要な限り実行し続けることができます。

于 2011-05-31T17:42:46.017 に答える
1

アイデア 1: はい、<cfschedule>あなたの友達です

アイデア 2: pageId/IP アドレスを保存しますか? これは Java から Set を使用する方が良いと思いますが、空の値を割り当てると struct も機能します...

pageIDs["1"]["192.0.0.1"] = "";
hitsOfPage1 = structCount(pageIDs[1]));

しかし、再度 tmr にアクセスすると、カウントされませんか?

于 2011-05-31T17:23:50.060 に答える