asp.net-core
caching
Ricerca…
introduzione
Il caching aiuta a migliorare le prestazioni di un'applicazione mantenendo una copia dei dati facilmente accessibile. Aspnet Core è dotato di due astrazioni di caching facili da usare e da testare.
Memory Cache memorizzerà i dati nella memoria cache del server locale.
Distributed Cache conserverà la cache dei dati in una posizione centralizzata accessibile dai server nel cluster. Viene fornito con tre implementazioni fuori dalla scatola: In memoria (per unità di test e dev locale), Redis e Sql Server.
Utilizzo della cache InMemory nell'applicazione ASP.NET Core
Per utilizzare una cache di memoria nell'applicazione ASP.NET, aggiungere le seguenti dipendenze al file project.json
:
"Microsoft.Extensions.Caching.Memory": "1.0.0-rc2-final",
aggiungere il servizio cache (da Microsoft.Extensions.Caching.Memory) al metodo ConfigureServices nella classe Startup
services.AddMemoryCache();
Per aggiungere elementi alla cache nella nostra applicazione, utilizzeremo IMemoryCache
che può essere iniettato in qualsiasi classe (ad esempio Controller) come mostrato di seguito.
private IMemoryCache _memoryCache;
public HomeController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
Get restituirà il valore se esiste, ma restituisce altrimenti null
.
// try to get the cached item; null if not found
// greeting = _memoryCache.Get(cacheKey) as string;
// alternately, TryGet returns true if the cache entry was found
if(!_memoryCache.TryGetValue(cacheKey, out greeting))
Usa il metodo Set per scrivere nella cache. Set accetta la chiave da utilizzare per cercare il valore, il valore da memorizzare nella cache e un set di MemoryCacheEntryOptions
. MemoryCacheEntryOptions
consente di specificare la scadenza della cache assoluta o scorrevole basata sul tempo, la priorità di memorizzazione nella cache, i callback e le dipendenze. Uno dei seguenti esempi
_memoryCache.Set(cacheKey, greeting,
new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromMinutes(1)));
Caching distribuito
Per sfruttare la cache distribuita, è necessario fare riferimento a una delle implementazioni disponibili:
Ad esempio, registrerai l'implementazione di Redis come segue:
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedRedisCache(options =>
{
options.Configuration = "ServerAdress";
options.InstanceName = "InstanceName";
});
}
Richiedere la dipendenza IDistributedCache
dove ne hai bisogno:
public class BooksController { private IDistributedCache distributedCache; public BooksController(IDistributedCache distributedCache) { this.distributedCache = distributedCache; } [HttpGet] public async Task<Books[]> GetAllBooks() { var serialized = this.distributedCache.GetStringAsync($"allbooks"); Books[] books = null; if (string.IsNullOrEmpty(serialized)) { books = await Books.FetchAllAsync(); this.distributedCache.SetStringAsync($"allbooks", JsonConvert.SerializeObject(books)); } else { books = JsonConvert.DeserializeObject<Books[]>(serialized); } return books; } }