2010-04-27 5 views
8

Dato che è uno di the hard things in computer science, qualcuno sa come impostare una strategia di memorizzazione nella cache plug-in?Schema di memorizzazione nella cache plug-in generalizzato?

Quello che sto pensando mi permetterebbe di scrivere un programma con un minimo di pensiero su ciò che deve essere memorizzato nella cache (ei usano una specie di schema di caldaia, schema di basso/nessun costo che non compila nulla in nessun luogo dove posso voglio caching) e poi quando le cose vanno avanti e so dove ho bisogno di fare il caching, posso aggiungerlo senza fare cambiamenti di codice invasivi.

Come un'idea del tipo di soluzione che sto cercando; Sto lavorando con lo D programing language (ma a metà strada del C++ andrebbe bene) e mi piace il modello.

+1

Caching che tipo di cose? Dove? Così com'è, la domanda non ha senso. –

+0

La domanda ha perfettamente senso per me, Neil. Forse questo dovrebbe essere etichettato come "programmazione generica"? –

+1

@Neil. * Memorizzazione nella cache del valore di ritorno di una funzione. * A parte ciò, non si fanno ipotesi: potrebbe essere una funzione pura, potrebbe non esserlo. Potrebbe caricare dati da un DB o da una pagina Web, o solo dal disco locale o semplicemente calcolarlo al volo. Potrebbe anche essere qualcosa che non può essere memorizzato nella cache (l'unico modo per sapere se il valore è scaduto è quello di ottenere di nuovo il valore) oppure no. Una soluzione deve essere in grado di gestire qualsiasi e tutte le precedenti in qualsiasi combinazione. – BCS

risposta

0

Potrebbe interessarti come Drizzle fa questo genere di cose con diversi backend di memorizzazione e memorizzazione nella cache. In breve, fornisce un'interfaccia che può essere utilizzata da un'applicazione madre per interagire con MySQL, memcached, ecc.

+0

Ciò potrebbe essere di interesse, ma stavo pensando più a un interno di un'applicazione. – BCS

0

Non sono sicuro di quale misura debba essere "generalizzata" e "plug-in", ma se lo può permettere refactoring di utilizzo dei tuoi cache (funzione che sostituisce le chiamate con l'uso diretto di una variabile), quindi prendere in considerazione la seguente:

//works for any CopyConstructible type of cache and any function 
//which result should be cached 
//(the arguments of the function have to be properly binded) 
/** 
* caching + lazy initialization 
* we shouldn't allow copying of lazy<T>, because every copy initializes its own cache 
* and this is not what intended most of the time 
* T must be CopyConstructible 
*/ 
template<class T> 
class lazy: private boost::noncopyable 
{ 
public: 
    lazy(boost::function0<T> _creator) 
     : creator(_creator) {} 
    /** 
    * aka is_cashed 
    */ 
    bool is_initialized() 
    { 
     return val; 
    } 
    operator T&() 
    { 
     if(!val) 
      val = creator(); 
     return *val; 
    } 
    T& operator*() 
    { 
     if(!val) 
      val = creator(); 
     return *val; 
    } 
    /** 
    * resets cache to update it next time it is used 
    */ 
    void reset() 
    { 
     val.reset(); 
    } 
private: 
    boost::function0<T> creator; 
    boost::optional<T> val; 
}; 
//usage 
    //initialize caching and updating strategy 
    lazy<WebPage> cached_page(boost::bind(&Server::getPage, server)); 
    server->OnPageUpdate = boost::bind(&OnPageUpdate, cached_page); 
    ..... 

    //use cached_page everywhere as if it were regular variable of WebPage type 
    showPage(cached_page); 
//-------------- 
void OnPageUpdate(lazy<WebPage>& page) 
{ 
    page.reset(); 
} 

Se si desidera rimuovere l'inizializzazione pigra, quindi modificare in modo che si crea la cache nel costruttore e nel metodo reset().

Problemi correlati