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
Utilizzare noopener e noreferrer nei link HTML
Utilizzo del persistent state di Blazor nel prerendering
Impostare il tipo di supporto dei campi Json in Entity Framework con Sql Server
Evitare la compressione degli artefatti in un workflow di GitHub
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Le cron expression di un workflow di GitHub
Semplificare i deployment con le label in Azure Container App
Impostare automaticamente l'altezza del font tramite CSS
Analizzare il contenuto di una issue con GitHub Models e AI
Raggruppare risorse in .NET Aspire
Definire il metodo di rilascio in .NET Aspire
Ottimizzare le API in ASP.NET con Feature Flags


