Eine Möglichkeit, unsere Anwendungen zu beschleunigen, besteht darin, neben unserer Datenbank eine Caching-Ebene hinzuzufügen. Oft schreiben wir Hilfsmethoden, um Daten aus unserer Datenbank zu lesen, sie zu serialisieren und in unserem Cache zu speichern. NCache lässt sich in Entity Framework Core integrieren, um unsere Entitäten mit wenigen Codezeilen zwischenzuspeichern. Sehen wir uns an, wie Sie eine Cache-Aside-Strategie implementieren NCache und Entity Framework Core.
Entity Framework Core verfügt nicht über einen integrierten Caching-Mechanismus. Wir müssen unsere eigenen rollen. Aber, NCache verfügt über eine Reihe praktischer Erweiterungsmethoden zum einfachen Zwischenspeichern unserer Abfrageergebnisse.
Mit dieser Integration nutzen wir alle Skalierbarkeits- und Replikationsfunktionen von NCache in unseren Entity Framework-Anwendungen.
Lassen Sie uns ein Beispiel-ASP erstellen.NET Core 6.0-Anwendung zum Zwischenspeichern einer Entity Framework Core-Abfrage, um die 10 am besten bewerteten Filme in einem Katalog anzuzeigen.
Wie man sich anmeldet NCache mit Entity Framework Core
Bevor wir beginnen, stellen wir sicher, dass dies der Fall ist NCache Eingerichtet. Wir benötigen entweder eine Enterprise- oder eine Professional-Edition.
Nach dem Erstellen eines ASP.NET Core Web-API-Anwendung, installieren wir den EntityFrameworkCore.NCache NuGet-Paket. Wenn wir eine Professional-Edition verwenden, installieren wir den EntityFrameworkCore.NCache.Professionelles NuGet-Paket stattdessen.
Registrieren NCache Mit Entity Framework schreiben wir in die Datei Program.cs unserer Anwendung:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using Alachisoft.NCache.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => { var config = builder.Configuration; var connectionString = config.GetConnectionString("Default"); // Configure NCache with Entity Framework // We need a cacheId and database type NCacheConfiguration.Configure(cacheId: "demoCache", DependencyType.SqlServer); NCacheConfiguration.ConfigureLogger(); options.UseSqlServer(connectionString); }); builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.Run(); |
Das sieht aus wie ein normaler ASP.NET Core Anwendung, die Entity Framework Core verwendet, mit Ausnahme von zwei Methoden: configure() und configureLogger() von NCacheKonfiguration.
Mit der Methode „Configure()“ geben wir die CacheId und den Datenbanktyp an. Wir verwenden demoCache, die Standard-Cache-Instanz, und DependencyType.SqlServer. Natürlich sollten wir die Cache-ID aus einer Konfigurationsdatei lesen.
In diesem Beispiel verwenden wir nur eine Cache-ID und einen Datenbanktyp, können aber auch übergeben zusätzliche Konfigurationsmöglichkeiten wie Wiederholungsversuche und Zeitüberschreitungen.
Und configureLogger() richtet die zugrunde liegende Protokollierungsabstraktion von ASP ein.NET Core.
So fügen Sie Entity Framework Core-Ergebnisse ein und zwischenspeichern sie NCache
Nach der Registrierung NCache In Entity Framework Core lesen wir, um mit dem Zwischenspeichern unserer Filme zu beginnen.
Zwischenspeichern von Entity Framework Core-Ergebnissen
Erstellen wir eine MoviesController-Klasse, um die 10 besten Filme zu lesen und zwischenzuspeichern NCache. So was,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using Alachisoft.NCache.EntityFrameworkCore; using Microsoft.AspNetCore.Mvc; namespace Movies.Controllers; [ApiController] [Route("[controller]")] public class MoviesController : ControllerBase { private readonly DatabaseContext _database; public MoviesController(DatabaseContext database) { _database = database; } [HttpGet] public async Task<IEnumerable> Get() { return await _database .Movies .OrderByDescending(m => m.Rating) .ThenBy(m => m.ReleaseYear) .Take(10) .FromCacheAsync(new CachingOptions { StoreAs = StoreAs.Collection }); } } |
NCache bringt neue Erweiterungsmethoden zusätzlich zu den vorhandenen Entity Framework Core-Methoden.
Nach einer LINQ-Abfrage zum Abrufen von 10 Filmen, sortiert nach Bewertung und Erscheinungsjahr, fügen wir eine neue Methode hinzu: FromCacheAsync().
FromCacheAsync()
speichert das Ergebnis unserer LINQ-Abfrage zwischen und gibt es zurück. Wenn unser Cache dieses Ergebnis nicht hat, geht er in die Datenbank und speichert es dann zwischen. Wenn wir keine Verbindung zu unserem Cache-Server herstellen können, NCache gibt das Ergebnis aus unserer Datenbank zurück. Dann wird es immer wieder versuchen, den Cache mit unserem Ergebnis zu füllen.
Bei Verwendung von FromCacheAsync() übergeben wir einen CachingOptions-Parameter, der dies mitteilt NCache um das Ergebnis unserer Abfrage als Ganzes statt einzelner Einträge zwischenzuspeichern. Es gibt mehr Optionen Abläufe und Prioritäten festzulegen.
FromCacheAsyn() hat eine synchrone Alternative FromCache()
. Im Gegensatz zur asynchronen Version gibt FromCache() den Cache-Schlüssel des neuen Elements als Ausgabeparameter zurück.
LoadIntoCache und FromCacheOnly
Abgesehen von FromCache() und FromCacheAsync(), NCache verfügt über zwei weitere Methoden: LoadIntoCache() und FromCacheOnly().
LoadIntoCache() überschreibt die zwischengespeicherten Ergebnisse bei jedem Aufruf. Es funktioniert wie FromCache() mit einem Cache-Miss bei jedem Aufruf. Diese Methode eignet sich am besten für häufig geänderte Daten und Szenarien, in denen wir immer eine neue Kopie unserer Daten benötigen.
FromCacheOnly() ruft nicht die zugrunde liegende Datenbank auf. Es geht immer zum Cache-Server. FromCacheOnly() unterstützt Aggregationsfunktionen wie Sum, Min und Max. Aber das hat es auch einige Einschränkungen. Beispielsweise unterstützt FromCacheOnly() nicht mehrere Projektionen oder Joins im LINQ-Ausdruck.
Natürlich gibt es auch für diese beiden letzten Methoden asynchrone Alternativen.
Elemente einfügen
Nachdem wir die Ergebnisse unserer LINQ-Abfragen zwischengespeichert haben, sehen wir uns an, wie Elemente eingefügt werden.
Im MoviesController
Klasse, schreiben wir eine neue Methode zum Hinzufügen eines Films. So was,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// In the same MoviesController.cs file [HttpPost] public async Task Post([FromBody] AddMovie request) { var newMovie = new Movie( name: request.Name, releaseYear: request.ReleaseYear, rating: request.Rating); _database.Movies.Add(newMovie); await _database.SaveChangesAsync(); var options = new CachingOptions { StoreAs = StoreAs.SeperateEntities }; Cache cache = _database.GetCache(); cache.Insert(newMovie, out _, options); } |
Nachdem wir wie üblich mit SaveChangesAsync() einen Film eingefügt haben, erhalten wir mit GetCache() einen Verweis auf unseren Cache. Dann fügen wir mit derselben Objektreferenz einen neuen Film ein, wobei Insert() die CachingOptions übergibt. Wir können auch eine Priorität, eine Abfrage-ID und Ablaufzeiten übergeben.
Wenn wir Insert() verwenden und der Cache bereits ein Element enthält, wird es stattdessen aktualisiert.
Beachten Sie, dass wir das neue Element direkt nach dem Aufruf von SaveChangesAsync() in unseren Cache eingefügt haben, ohne erneut zur Datenbank zu gehen, um es abzurufen und dann zwischenzuspeichern. Dadurch wird für jedes Objekt, das wir einfügen möchten, ein Roundtrip zu unserer Datenbank eingespart.
Zusammenfassung
So können wir verwenden NCache in unseren Entity Framework Core-Anwendungen. Mit ein paar Änderungen an unseren vorhandenen LINQ-Abfragen können wir mit dem Zwischenspeichern unserer Entitäten beginnen. Wir müssen lediglich unsere Entity Framework-Konfiguration erweitern
und verwenden Sie FromCache() und seine Alternativen. In diesem Beitrag haben wir Elemente zwischengespeichert und eingefügt, aber das können wir auch entfernen Elemente aus unserem Cache anhand eines Schlüsselnamens, einer Abfrage-ID oder einer Objektreferenz.
Denken Sie daran, dass wir für komplexe LINQ-Abfragen FromCache() verwenden. Für häufig aktualisierte Daten verwenden wir LoadIntoCache(). Und für schreibgeschützte Daten FromCacheOnly().
Abgesehen von der Cache-Aside-Strategie, die wir in diesem Beitrag verfolgt haben, NCache unterstützt andere Caching-Strategien und -Muster wie Read-Through und Write-Through. Und es lässt sich in das ASP integrieren.NET Core Framework zur Unterstützung des Session State Caching.
Um dem Code zu folgen, den wir in diesem Beitrag geschrieben haben, überprüfen Sie my NCache Demo-Repository auf GitHub.