Il caching distribuito è una tecnica essenziale nello sviluppo di applicazioni moderne per migliorare le prestazioni e ridurre il carico sui database o servizi. Con l'introduzione di .NET 9, Microsoft ha apportato miglioramenti significativi alla gestione della cache, introducendo il concetto di Hybrid Cache.
Prima di .NET 9, il caching distribuito veniva implementato utilizzando IDistributedCache, un'interfaccia che consente di memorizzare i dati in sistemi esterni come Redis. Il codice per recuperare un elemento può rassomigliare al seguente:
public class SomeService { private readonly IDistributedCache _cache; public SomeService(IDistributedCache cache) { _cache = cache; } public async Task<SomeInfo> GetSomeInfoAsync(string name, int id, CancellationToken token = default) { var key = $"{name}-{id}"; // composizione della chiave var bytes = await _cache.GetAsync(key, token); // interrogazione della cache SomeInfo info; if (bytes == null) { // esecuzione fallback in caso non esista l'elemento info = await DataSource.GetDataAsync(name, id, token); // serializzazione ed inserimento bytes = Serializer.Serialize(info); await _cache.SetAsync(key, bytes, token); } else { // Elemento trovato, deserializzazione info = Serializer.Deserialize<SomeInfo>(bytes); } return info; } }
Come notiamo questo metodo ha vari svantaggi:
- Necessità di serializzare e deserializzare manualmente i dati.
- Possibili ritardi nelle letture, poiché essendo una cache distribuita richiede operazioni di rete.
- Aumento del carico sulle infrastrutture di caching distribuite.
Con .NET 9, viene introdotto il concetto di Hybrid Cache, che combina i vantaggi del caching in memoria con quelli del caching distribuito, andando a rimuovere tutti gli svantaggi appena elencati.
Il codice convertito di presenta come segue:
public class SomeService { private readonly HybridCache _cache; public SomeService(HybridCache cache) { _cache = cache; } public async Task<SomeInfo> GetSomeInfoAsync(string name, int id, CancellationToken token = default) { return await _cache.GetOrCreateAsync( $"{name}-{id}", // composizione della chiave async cancel => await DataSource.GetDataAsync(name, id, cancel), // fallback token: token); } }
La differenza è sostanziale: la serializzazione viene gestita internamente, i dati vengono cercati prima nella memoria locale e, solo se non trovati, viene effettuata una richiesta alla cache distribuita, riducendo di conseguenza anche il carico sul servizio esterno.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Inference di dati strutturati da testo con Semantic Kernel e ASP.NET Core Web API
Gestire i dati con Azure Cosmos DB Data Explorer
Gestione CSS in Blazor con .NET 9
Gestire la cancellazione di una richiesta in streaming da Blazor
Eseguire i worklow di GitHub su runner potenziati
Simulare Azure Cosmos DB in locale con Docker
Sfruttare GPT-4o realtime su Azure Open AI per conversazioni vocali
Gestire eccezioni nei plugin di Semantic Kernel in ASP.NET Core Web API
Effettuare il refresh dei dati di una QuickGrid di Blazor
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Utilizzare una qualunque lista per i parametri di tipo params in C#