Cache nelle applicazioni con le nuove API del .NET Framework 4.0

di Cristian Civera, in .NET Framework,

Fin dalla prima versione di ASP.NET è presente un motore di cache che permette di memorizzare informazioni in base ad una chiave e a regole che mantengono i valori in vita in funzione del carico di memoria, alle priorità o a dipendenze. Questo motore è stato reso più versatile dandogli una struttura a provider, ma mantiene il suo difetto principale: è inserito in System.Web e appartiene al runtime di ASP.NET.

Con il .NET Framework 4.0 è stato quindi inserito un nuovo assembly, di nome System.Runtime.Caching, che nel suo omonimo namespace contiene classi per effettuare cache anche al di fuori dell'ambito web. La classe base astratta ObjectCache rappresenta un motore di cache la cui unica implementazione, MemoryCache, lavora appunto in memoria, permettendo però di sfruttare anche altri motori, come quelli distribuiti. Rispetto alla cache di ASP.NET le istanze di cache possono essere molteplici, ma è possibile accedere a quella predefinita mediante la proprietà statica Default. Ecco quindi di seguito come è possibile controllare e inserire valori nella cache:

string key = "test";

// Aggiungo in cache se la chiave non c'è
if (!MemoryCache.Default.Contains(key, null))
  MemoryCache.Default[key] = DateTime.Now;

// Leggo il valore
Console.WriteLine(MemoryCache.Default[key]);

Le API che si hanno a disposizione sono molto complete, supportano in modo completo LINQ to Object e permettono anche operazioni atomiche di scrittura e lettura degli elementi:

// Aggiungo in cache il valore se non c'è e ottengo il valore
// già presente in cache
DateTime date = (DateTime)MemoryCache.Default.AddOrGetExisting(key, DateTime.Now, ObjectCache.InfiniteAbsoluteExpiration, null);
Console.WriteLine(date);

Ogni elemento ha inoltre delle policy che permettono di stabilire le regole di scadenza dell'elemento, di tipo sliding o assoluto, una priorità e i ChangeMonitor da utilizzare per invalidare l'elemento. Di quest'ultimo esistono implementazioni basate su altre chiavi, su file o su SQL Server. Ecco quindi come inserire una chiave monitorizzando il file .config dell'applicazione:

// Policy con dipendenza sul file
CacheItemPolicy policy = new CacheItemPolicy {
  AbsoluteExpiration = DateTime.Now.AddMinutes(10),
  SlidingExpiration = ObjectCache.NoSlidingExpiration,
  Priority = CacheItemPriority.Default,
  ChangeMonitors = {
    new HostFileChangeMonitor(new List<String> {
      AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
    })
  }
};
MemoryCache.Default.Add("test", DateTime.Now, policy, null);

Oltre alla multi istanza della cache, della struttura a provider del repository e del monitor, ogni elemento può essere allocato in regioni, anche se il provider in memoria non le supporta.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi