Monday, October 5, 2009

Caching - Data caching

Il Data caching è il sistema di caching più flessibile, ma anche quello dove bisogna scrivere più codice per implementarlo.

Il concetto alla base del Data caching è molto semplice: inserire in una speciale collezione di oggetti (Cache), tutti quegli oggetti che per esser creati utilizzano un certo quantitativo di risorse.
Questa collection è simile alla collection Application, comunque esistono un paio di differenze:

  • Thread-Safe: a differenza dell'Application non avremo bisogno di attivare un sistema di lock/unlock sulla collection Cache quando andremo a rimuovere/aggiungere oggetti, pur essendo anche questa a scope globale.
  • Scavenging: gli oggetti verranno rimossi automaticamente quando risulteranno scaduti, o quando cambieranno, o quando a cambiare sarà una sua dipendenza, o quando le risorse a disposizione del server saranno troppo basse.
    Questo farà si che, non dovremo noi preoccuparci delle risorse del sistema. Ma dovremo stare attenti a controllare se, l'oggetto che stiamo richiedendo, esiste ancora prima di utilizzarlo, altrimenti potremmo incappare in un NullReferenceException.
     
  • Dependencies: gli oggetti possono essere collegati a files, tabelle di database o qualsiasi altro tipo di risorsa.
    Se la risorsa cambia, l'oggetto in Cache sarà automaticamente ritenuto invalido e rilasciato.
 

Aggiungere un oggetto

Come nella collection Application aggiungere un oggetto in Cache è alquanto semplice:
Cache["key"] = new Int32();
Questo però è il metodo meno utile, in quanto non da la possibilità di specificare quanto tempo l'oggetto deve esser tenuto in cache.
Per questo motivo tornerà utile il metodo Cache.Insert()
Tale metodo offre 4 overloads. Il più complicato, nonchè il più utile, è il seguente:

Cache.Insert(key, 
value,
dependencies,
absoluteExpiration,
slidingExpiration,
priority,
onRemoveCallback);


protected void Page_Load(object sender, EventArgs e)
{
Cache.Insert("key", new object(), null, DateTime.MaxValue, TimeSpan.FromMinutes(10), CacheItemPriority.Normal, onRemoveCallback);
}

private void onRemoveCallback(string key, object value, CacheItemRemovedReason reason)
{
throw new NotImplementedException();
}



  • key e value: rispettivamente identificano la chiave e il valore dell'oggetto da tenere in cache.
  • dependencies: identifica le dipendente, se ne ha, dell'oggetto. Se non esistono dipendenze basterà settare il valore a null.
  • absoluteExpiration e slidingExpiration: identificano il tempo di vita dell'oggetto.
    Mentre absoluteExpiration settiamo una data specifica per l'oggetto dovrà essere rimosso, ciò può tornarci utile per delle previsioni del tempo o offerte da visualizzare per un periodo conosciuto; slidingExpiration identifica il tempo di vita dell'oggetto prima che possa essere rimosso, utile magari quando vogliamo salvare una ricerca per un periodo limitato di tempo o i dati di un prodotto in catalogo.
    Quando vogliamo attivare absoluteExpiration dovremo settare slidingExpiration con il valore:
    TimeSpan.Zero
    Se, invece, ci interesserà attivare slidingExpiration dovremo settare il valore di absoluteExpiration a:
    DateTime.MaxValue

  • priority: ha effetto solamente se ASP.NET avrà bisogno di attivare il processo di scavenging, prima descritto.
    Quando ASP.NET troverà degli oggetti non usati in cache, prima di rimuoverli, controllerà la priorità settata.
    Solitamente si setta una priorità alta per quegli oggetti che prendono più tempo per essere ricostruiti.
    I valori possibili sono:

    • High - l'oggetto verrà rimosso per l'ultimo rispetto agli altri
    • AboveNormal
    • Normal
    • BelowNormal
    • Low - l'oggetto verrà rimosso per primo rispetto agli altri.
    • NotRemovable - l'oggetto non verrà cancellato durante il processo di scavenging

  • onRemoveCallback: è un delegate che verrà chiamato ogni qual volta un oggetto viene rimosso dalla cache.
    Utile per notificare all'applicazione se un oggetto non è più disponibile.
     

No comments:

Post a Comment