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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Eseguire script pre e post esecuzione di un workflow di GitHub
- Creare una libreria CSS universale: Cards
- Migliorare l'organizzazione delle risorse con Azure Policy