Frage

Ich habe einen FAFC gebaut, der als dynamischer, alternder Cache für fast alles gedacht ist, was es wert ist, geändert zu werden. LDAP -Abfragen, Funktionsergebnisse, Arrays, Ojekte, Sie nennen es. Was auch immer Zeit oder Ressourcen braucht, um zu berechnen und wird mehr als einmal benötigt. Ich möchte ein paar Dinge tun können:

  • Teilen Sie den FAX zwischen Anwendungen
  • Definieren Sie den Umfang des Cache (nur Server / Anwendung / Sitzung / Aktuelle Anforderung).
  • Verwenden Sie gleichzeitig unterschiedliche Cache -Instanzen in derselben Anfrage
  • Seien Sie unabhängig von CFCs mit der Cache -Komponente
  • Im Allgemeinen an den gesunden Menschenverstand halten (Entkopplung, Einkapselung, Orthogonalität, Verriegelung)

Ich würde natürlich eine andere Cache -Instanz für jede eigenständige Aufgabe verwenden, aber ich möchte in der Lage sein, denselben FCKW -Bereich über Anwendungen hinweg zu verwenden. Der Cache selbst ist (was sonst) eine Struktur, privat für die Cache -Instanz. Wie würde ich das Caching und Sperren richtig implementieren, wenn sich das Zielfernrohr selbst ändern kann?

Zum Sperren verwende ich benannte Schleusen ('CacheRead', 'CacheWrite') Derzeit ist dies sicher, aber es ist seltsam. Warum sollte ich eine serverweite Sperre für beispielsweise nur für einen Sitzungsvorgang wünschen? (Ja, vielleicht das ist akademisch, aber trotzdem.)

Wenn ich den Anwendungsbereich als Referenz eingeben, wenn ich das Caching der Anwendungsebene möchte, scheint es auch falsch zu sein. Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Ich verstehe Ihren Wunsch, die tatsächliche Umfangsstruktur zu vermeiden, an die Sie einreichen möchten, aber Ihre Alternativen sind begrenzt. Das erste, was mir in den Sinn kommt, ist nur den Namen (eine Zeichenfolge) des Bereichs, in dem Ihr Cache gespeichert wird, und die Bewertung. Die Bewertung ist von Natur aus ineffizient und sollte vermieden werden. Trotzdem war ich neugierig, wie es erreicht werden könnte. Ich habe Ihren Code nicht, also habe ich gerade einen Dirt-dankten "Speicher" -Ftraktion CFC (übersprungenes Caching übersprungen, da dies für das, was ich testen möchte, irrelevant ist):

cache.cfc:

<cfcomponent>
    <cfset variables.cacheScope = "session" /><!--- default to session --->
    <cfset variables.cache = ""/>

    <cfscript>
    function init(scope){
        variables.cacheScope = arguments.scope;
        return this;
    }

    function cacheWrite(key, value){
        structInsert(evaluate(variables.cacheScope),arguments.key,arguments.value,true);
        return this;
    }

    function cacheRead(key){
        if (not structKeyExists(evaluate(variables.cacheScope), arguments.key)){
            return "";
        }else{
            variables.cache = evaluate(variables.cacheScope);
            return variables.cache[arguments.key];
        }
    }   
    </cfscript>
</cfcomponent>

Und eine Ansicht, um es zu testen:

<!--- clear out any existing session vars --->
<cfset structClear(session)/>
<!--- show empty session struct --->
<cfdump var="#session#" label="session vars">
<!--- create storage object --->
<cfset cacher = createObject("component", "cache").init("session")/>
<!--- store a value --->
<cfset cacher.cacheWrite("foo", "bar")/>
<!--- read stored value --->
<cfset rtn = cacher.cacheRead("foo")/>
<!--- show values --->
<cfdump var="#rtn#">
<cfdump var="#session#" label="session vars">

Off Topic: Ich schreibe gerne meine Setterfunktionen, um "dies" zurückzugeben, damit ich Methodenaufrufe wie JQuery ketten kann. Ein Teil der Ansicht könnte genauso leicht geschrieben werden wie:

<cfset rtn = createObject("component", "cache")
    .init("session")
    .cacheWrite("foo", "bar")
    .cacheRead("foo")/>

Es ist interessant, dass dies möglich ist, aber ich würde es wahrscheinlich nicht in der Produktion verwenden, da die Gemeinkosten der Bewertung bewertet werden. Ich würde sagen, dass dies genügend Grund ist, den Bereich, in den Sie einspeichern möchten, ein gültiger Grund ist.

Wenn Sie sich immer noch darum kümmern (und vielleicht zu Recht so?), Sie könnten einen weiteren FCKW erstellen, der das Lesen und Schreiben des gewünschten Bereichs abtrennt und diese in Ihren Caching CFC als Speicherort übergeben (eine aufgabe für gut geeignete Aufgabe für gut geeignet für Kalter Frühling), Auf diese Weise, wenn Sie sich jemals dazu entschließen, den Cache in einen anderen Bereich zu verschieben, müssen Sie 300 Seiten nicht mit Ihrem Cache -CFC bearbeiten, der in "Sitzung" übergibt, und stattdessen können Sie 1 CFC oder Ihre Coldspring -Konfiguration bearbeiten.

Ich bin mir nicht ganz sicher, warum Sie jedoch ein einzelnes Caching haben möchten, wenn Sie den Antragsumfang haben. Wenn das, was Sie suchen, eine Möglichkeit ist, etwas für die aktuelle Anfrage zu leiten und kurz darauf zu sterben, kann das Anfragenbereich möglicherweise das sein, was Sie wollen. Das Zwischenspeichern ist normalerweise wertvoller, wenn es mehrere Anfragen umfasst.

Andere Tipps

Okay - da ich Ihre Frage anfänglich missverstanden habe, habe ich meine vorherige Antwort gelöscht, dass ich keine weitere Verwirrung verursachte.

Um Ihre Frage zum Sperren zu beantworten:

Namensschlösser sollten in Ordnung sein, weil sie nicht immer denselben Namen haben müssen. Sie können sie dynamisch benennen, je nachdem, auf welchen Cache Sie zugreifen. Wenn Sie auf ein Element der privaten Struktur zugreifen müssen, können Sie so etwas wie die benannte Sperre als Namen verwenden.

Auf diese Weise hätte ein Schloss nur einen Effekt, wenn etwas versuchte, mit Namen auf denselben Cache zuzugreifen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top