2 Stimmen

Erstellung eines Trefferzählers über den Cache oder den Anwendungsbereich

Ich möchte einen Trefferzähler für meine ColdFusion-Anwendung erstellen. Ich möchte nicht, dass die Datenbank-Treffer-Tabelle bei jedem Seitenaufruf aktualisiert wird. Idealerweise möchte ich die Treffer im Anwendungsbereich oder im Cache in einer Art Struktur zusammenfassen und sie dann intermittierend speichern.

Ich habe bis jetzt zwei Ideen:.

Idee 1

  1. Erstellen Sie eine App- oder Cache-Struktur, um das Schlüssel-Wert-Paar pageId und pageHits zu speichern.
  2. Prüfen Sie bei jedem Seitenaufruf, ob ein pageId/ip address cookie vorhanden ist.
  3. a. Wenn sie vorhanden ist, unternehmen Sie nichts.
  4. b. Wenn dies nicht der Fall ist, setzen Sie ihn und aktualisieren Sie die Trefferstruktur in der App oder im Cache.

Problem: Ich weiß nicht, wie ich die Strukturdaten intermittierend/nach Ablauf einer bestimmten Zeit in die Datenbank bekommen kann. Geplantes Ereignis?

Idee 2

Keine Cookies; speichern pageId/ip address in ihrem eigenen Cache/App struct.

問題点 Ich bin mir nicht sicher, wie die Datenstrukturen/Arrays zum Speichern der Informationen strukturiert werden sollen. Scheint kompliziert mit Array-Schleifen und Struktur findet. Und ich habe immer noch das gleiche Problem wie Idee eins.

Irgendwelche Ratschläge, Ideen, Kritik? Insbesondere brauche ich Hilfe bei der Ausarbeitung der Datenstrukturen für Idee 2. Ich bin mehr an der Leistung als an der Datenintegrität interessiert und mit der CF9-Lösung zufrieden. Ich sollte hinzufügen, ich bin auf der Suche nach denormalisieren Daten in eine Seite hits Spalte für jede Seite id. Ich brauche keine normalisierten Datentabellen.

5voto

orangepips Punkte 9721

Der Versuch, diese Daten auf die von Ihnen beschriebene Weise zu erfassen, führt zu Skalierungsproblemen mit dem Ablauf des Cache, um OOM oder lange Iterationszeiten zu vermeiden, wenn die Anzahl der Einträge wächst und Sie schließlich in einer Datenbank persistieren wollen. Die Informationen, die Sie zusammenfassen möchten, werden bereits in Webserverprotokollen erfasst. Sie müssen nur einen Algorithmus schreiben, der weiß, wie und wann die Daten übergehen.

使用方法 log = fileRead('log.txt', 'read') und iterieren über line fileReadLine(log) in regelmäßigen Abständen über <cfschedule/> . Für jede Charge können Sie auf die bereits beschriebene Art und Weise und dann das verwenden, was Datenbankansatz für INSERT/UPDATE (normalerweise wird das Schlüsselwort MERGE verwendet, aber MySQL ist anders) basierend auf der IP-Adresse, wenn Sie das wollen. Wenn es sich um eine sehr stark frequentierte Website handelt, sollten Sie den Datentyp der IP-Adressenspalte in einen Integer-Datentyp umgewandelt, um Indexsuchen zu beschleunigen.

Update

Verwenden Sie den folgenden Code, um einen Datei-Objektverweis einzurichten:

<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>

Auf diese Weise wird der Bezug einmal hergestellt (d.h. fileOpen() ), das sich merkt, in welcher Zeile es sich befindet. Wenn dann <cfschedule/> auf diesen Code trifft, wird der vorhandene Verweis verwendet, falls vorhanden, und von dort aus weiter iteriert. Die Sperre sorgt dafür, dass der Algorithmus nur von einem Thread ausgeführt wird. Sie müssen sich also nicht um eine Zeitbeschränkung kümmern, sondern können ihn so lange wie nötig weiterlaufen lassen.

1voto

Henry Punkte 32409

Idee 1: Ja, <cfschedule> ist Ihr Freund

Idee 2: pageId/ip-Adresse speichern? Ich denke, dies ist besser, Set von Java zu verwenden, aber struct würde auch funktionieren, wenn Sie es einen leeren Wert zuweisen...

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

Wenn ich die Seite jedoch am Donnerstag erneut besuche, werde ich nicht gezählt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X