Domanda

Ho creato un CFC progettato per fungere da cache dinamica e obsoleta destinata a quasi tutto ciò che vale la pena memorizzare nella cache. Query LDAP, risultati di funzioni, matrici, espulsioni, il nome. Qualunque cosa richieda tempo o risorse per calcolare ed è necessario più di una volta. Mi piacerebbe poter fare alcune cose:

  • condividi il CFC tra applicazioni
  • definisce l'ambito della cache (solo server / applicazione / sessione / richiesta corrente)
  • utilizza diverse istanze di cache contemporaneamente, nella stessa richiesta
  • essere indipendente dai CFC usando il componente cache
  • generalmente aderiscono al buon senso (disaccoppiamento, incapsulamento, ortogonalità, blocco)

Ovviamente utilizzerei un'istanza di cache diversa per ogni attività distinta, ma vorrei essere in grado di utilizzare lo stesso CFC tra le applicazioni. La cache stessa è (cos'altro) un Struct, privato all'istanza della cache. Come implementare correttamente la memorizzazione nella cache e il blocco quando l'ambito stesso è soggetto a modifiche?

Per il blocco, utilizzo i blocchi con nome ( 'CacheRead' , 'CacheWrite' ) al momento, questo è sicuro ma mi sembra strano. Perché dovrei desiderare un blocco a livello di server per, diciamo, un'operazione di sola sessione? (Sì, forse questo è accademico, ma comunque.)

Passare nell'ambito dell'APPLICAZIONE come riferimento quando voglio anche la memorizzazione nella cache a livello di applicazione sembra la cosa sbagliata da fare. C'è un modo migliore?

È stato utile?

Soluzione

Comprendo il tuo desiderio di evitare di passare alla struttura dell'ambito reale che desideri memorizzare nella cache, ma le tue alternative sono limitate. La prima cosa che viene in mente è semplicemente passare il nome (una stringa) dell'ambito in cui si desidera archiviare la cache e valutarla. Per sua natura, la valutazione è inefficiente e dovrebbe essere evitata. Detto questo, ero curioso di sapere come potesse essere realizzato. Non ho il tuo codice, quindi ho appena creato un semplice "spazio di archiviazione" astrazione CFC (ignorato il caching, poiché è irrilevante per quello che voglio testare) qui:

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>

E una vista per testarlo:

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

Fuori tema: mi piace scrivere le mie funzioni setter per restituire " questo " [come visto sopra] in modo da poter concatenare chiamate di metodo come jQuery. Parte della vista potrebbe essere stata facilmente scritta come:

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

È interessante che ciò sia possibile, ma probabilmente non lo userei in produzione a causa dei costi generali di Valutare. Direi che questo è un motivo sufficiente per passare l'ambito in cui desideri memorizzare nella cache.

Se ne sei ancora infastidito (e forse giustamente?), potresti creare un altro CFC che estrae la lettura e la scrittura dall'ambito desiderato e passarlo nel tuo CFC nella cache come posizione di archiviazione (un'attività adatta per ColdSpring ), in questo modo se decidi di spostare la cache in un altro ambito, non devi modificare 300 pagine tutte usando la tua cache CFC passando in " session " per init e invece puoi modificare 1 CFC o la tua configurazione ColdSpring.

Non sono del tutto sicuro del motivo per cui dovresti avere la memorizzazione nella cache a richiesta singola, quando hai l'ambito della richiesta. Se quello che stai cercando è un modo per memorizzare nella cache qualcosa per la richiesta corrente e farla morire poco dopo, l'ambito della richiesta potrebbe essere quello che desideri. La memorizzazione nella cache di solito è più preziosa quando si estende su più richieste.

Altri suggerimenti

Okay - da quando ho frainteso la tua domanda inizialmente ho cancellato la mia risposta precedente per non creare ulteriore confusione.

Per rispondere alla tua domanda sul blocco:

I blocchi con nome dovrebbero andare bene perché non devono sempre avere lo stesso nome. Puoi nominarli in modo dinamico a seconda della cache a cui stai accedendo. Quando è necessario accedere a un elemento della struttura privata, è possibile fare qualcosa come fare in modo che il blocco denominato usi la chiave come nome.

In questo modo, l'unica volta che un blocco avrebbe effetto è se qualcosa stesse provando ad accedere alla stessa cache per nome.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top