Entity Framework Core è una versione moderna del classico motore di mappatura relazionale degli oggetti dati di .NET Entity Framework. EF Core è stato riprogettato e riscritto per renderlo leggero e multipiattaforma. Quando si usa EF Core per accedere al database dell'applicazione, è possibile che il tempo di risposta del database venga ritardato durante i picchi di caricamento. Questo compromette drasticamente il tuo Prestazioni dell'applicazione EF Core. Man mano che il carico delle transazioni dell'applicazione aumenta, è possibile soddisfare i carichi delle richieste scalando linearmente il livello dell'applicazione con più server delle applicazioni. Tuttavia, non è possibile aggiungere più server di database per gestire l'aumento del carico.
È qui che una cache distribuita come NCache entra in gioco. È possibile memorizzare nella cache i dati a cui si accede di frequente per migliorare i tempi di risposta. La natura distribuita della memorizzazione nella cache NCache for Entity Framework Core garantisce prestazioni ottimali con carichi di transazione estremi creando la cache linearmente scalabile troppo.
Utilizzo della memorizzazione nella cache in Entity Framework Core
NCache fornisce l'integrazione per la memorizzazione nella cache in Entity Framework Core tramite i metodi di estensione. È possibile memorizzare nella cache i set di risultati di LINQ query sia che si tratti di dati transazionali o di dati di riferimento. I seguenti metodi di estensione sono forniti da NCache per EF Core.
Memorizzazione nella cache dei risultati della query LINQ – FromCache()
Prendiamo un esempio del sito web di una compagnia aerea che vuole recuperare voli per le Hawaii a luglio. Il set di risultati viene recuperato più frequentemente, quindi memorizzarlo nella cache sarebbe una buona idea.
FromCache()
Il metodo di estensione controlla prima il risultato della query nella cache, se non esiste nella cache o è diventato obsoleto, viene recuperato dal database e aggiunto anche alla cache, con conseguente tempi di risposta più rapidi per le richieste future.
utilizzando NCache, puoi archiviare il set di risultati della query come entità separate o come raccolta singola. Salvare il set di risultati nella cache come un'intera raccolta è ragionevole in questo caso poiché qualsiasi modifica nel set di risultati richiederebbe l'aggiornamento completo dal database.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using (var context = new FlightRecordsContext()) { var options = new CachingOptions { // To store as collection in cache StoreAs = StoreAs. Collection }; var resultSet = (from flight in context.Flights where flight.Destination == "Hawaii" && flight.Month == "July" select flight).FromCache(options).ToList(); } |
NCache Dettagli Entity Framework Core Cache Configura EF Core con NCache
Precarica cache con tutti i dati di riferimento – LoadIntoCache()
Per utilizzare la cache come origine dati principale e affidabile per i dati di riferimento, tutti i dati di riferimento devono essere prima nella cache. Senza questo, non puoi aspettarti risultati corretti dalle tue query sulla cache perché alcuni dei dati potrebbero essere nel database mentre la query sta solo cercando nella cache.
Caricamento dei dati di riferimento dell'applicazione EF Core in NCache rende l'accesso alla richiesta molto più veloce. LoadIntoCache()
recupera il set di risultati della query LINQ dal database e carica i dati nella cache.
Questo è il modo LoadIntoCache()
funziona sotto il cofano:
Procediamo con un esempio di catalogo prodotti di un e-store. L'archiviazione di ogni prodotto come entità separata lo rende disponibile per tutti i tipi di combinazioni di query e recuperi ancora più rapidi di un singolo prodotto.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using (var context = new NorthwindContext()) { var options = new CachingOptions { // To store the result as separate entities in cache StoreAs = StoreAs.SeperateEntities }; var resultSet = (from product in context.Products select product).LoadIntoCache(options); } |
NCache Dettagli Entity Framework Core Cache NCache Documenti API LINQ
Cerca i dati di riferimento nella cache con LINQ – FromCacheOnly()
È necessario caricare l'intero dato di riferimento nella cache se si desidera eseguire query LINQ su di esso. In caso contrario, le query LINQ non sono valide perché alcuni dati risiedono nel database e le query LINQ non eseguono ricerche nel database in questo scenario. Ciò è diverso eseguendo query LINQ sul database e memorizzando nella cache il loro set di risultati.
L'architettura seguente illustra l'esecuzione della query tramite EF Core su NCache adesso:
Ad esempio, il recupero del prodotto con un ID prodotto specifico ora è molto più veloce poiché il viaggio è solo nella cache:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using (var context = new NorthwindContext()) { var options = new CachingOptions { // To store the result as collection in cache StoreAs = StoreAs.Collection }; var resultSet = (from product in context.Products where product.ProductID == MatchingProductID select product).FromCacheOnly(); } |
Link correlati: Entity Framework Core Cache NCache Documenti API LINQ
Modifica di entità EF Core nella cache – GetCache()
EF Core consente di aggiungere e aggiornare entità nel database. Quindi, per sincronizzare la cache con il database e apportare le modifiche necessarie alle entità già esistenti nella cache, NCache fornisce un handle della cache che consente di eseguire operazioni di aggiunta, aggiornamento e rimozione direttamente sulla cache.
Ad esempio, se vuoi aggiungere un altro cliente in EF Core, dopo averlo aggiunto al database chiamando SaveChanges()
nel contesto del database, puoi ottenere il contesto della cache chiamando GetCache()
e chiama Insert()
sull'istanza cache restituita.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using (var database = new NorthwindContext()) { var cust = new Customers { CustomerId = "HANIH", ContactName = "Hanih Moos", ContactTitle = "Sales Representative", CompanyName = "Blauer See Delikatessen" }; var options = new CachingOptions { QueryIdentifier = new Tag("CustomerEntity"), Priority = Runtime.CacheItemPriority.Default }; Cache cache = database.GetCache(); //get NCache instance cache.Insert(cust, out string cacheKey, options); } |
Link correlati: Entity Framework Core Cache NCache Documenti di classe nella cache Webinar sulle app di EF Core di scalabilità
Riflessioni conclusive
Incorporando la memorizzazione nella cache in EF Core NCache è semplice e flessibile. NCache fornisce un framework di caching distribuito che funziona bene in ambienti multi-server, offrendoti il 100% di uptime e affidabilità dei dati mediante la replica, senza compromettere le prestazioni della cache. Quindi la memorizzazione nella cache in Entity Framework Core con NCache colma le lacune in termini di prestazioni e scalabilità e lo rende altamente efficiente.
Buon articolo, di solito ho usato la cache di Azure per Redis per ottenere prestazioni di throughput e latenza superiori archiviando i dati in memoria anziché su disco. In termini di prezzo molto basso e in termini di prestazioni aggiunge un grande valore ai tempi di risposta.
Ad ogni modo, un grande sforzo per spiegare il complesso argomento in parole semplici.