アプリケーションを高速化する XNUMX つの方法は、データベースの隣にキャッシュ層を追加することです。 多くの場合、データベースからデータを読み取り、シリアル化し、キャッシュに保存するためのヘルパー メソッドを作成します。 NCache Entity Framework Core と統合して、数行のコードでエンティティをキャッシュします。 キャッシュアサイド戦略を実装する方法について説明します。 NCache およびEntity Frameworkコア。
Entity Framework Core には、組み込みのキャッシュ メカニズムがありません。 自分たちで巻き上げなければなりません。 しかし、 NCache には、クエリ結果を簡単にキャッシュするための便利な拡張メソッドのセットが含まれています。
この統合により、すべてのスケーラビリティとレプリケーション機能を活用します。 NCache Entity Framework アプリケーションで。
サンプルASPを作ってみましょう.NET Core Entity Framework Core クエリをキャッシュして、カタログ内の最高評価の映画 6.0 件を表示する 10 アプリケーション。
どのように登録します NCache Entity Framework Coreを使用した場合
始める前に必ず確認しましょう NCache インストールされています。 Enterprise または Professional エディションのいずれかが必要です。
ASP作成後.NET Core Web API アプリケーション、EntityFrameworkCore をインストールしましょう。NCache NuGet パッケージ。 Professional エディションを使用している場合は、EntityFrameworkCore をインストールします。NCache代わりに .Professional NuGet パッケージを使用します。
登録するために NCache Entity Framework を使用して、アプリケーションの Program.cs ファイルに次のように記述します。
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(); |
見た目は普通のASPです.NET Core Entity Framework Core を使用するアプリケーション (Configure() と ConfigureLogger() の XNUMX つのメソッドを除く) NCacheコンフィギュレーション。
Configure() メソッドを使用して、cacheId とデータベース タイプを指定します。 ここでは、demoCache (デフォルトのキャッシュ インスタンス) と、DependencyType.SqlServer を使用しています。 もちろん、設定ファイルからcacheIdを読み取る必要があります。
この例では、cacheId とデータベース タイプのみを使用していますが、次の値を渡すこともできます。 追加の構成オプション 再試行やタイムアウトなど。
そして、ConfigureLogger() は ASP からの基礎となるロギング抽象化をセットアップします。.NET Core.
Entity Framework Core の結果を挿入してキャッシュする方法 NCache
登録後 NCache Entity Framework Core に読み込み、ムービーのキャッシュを開始します。
Entity Framework Core の結果をキャッシュする
ベスト 10 の映画を読み取ってキャッシュする MoviesController クラスを作成しましょう。 NCache。 このような、
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 既存の Entity Framework Core メソッドに加えて、新しい拡張メソッドを導入します。
評価と公開年でソートされた 10 本の映画を取得する LINQ クエリの後に、新しいメソッド FromCacheAsync() を追加します。
FromCacheAsync()
LINQ クエリの結果をキャッシュして返します。 キャッシュにこの結果がない場合は、データベースに移動してキャッシュします。 キャッシュサーバーに接続できない場合は、 NCache データベースから結果を返します。 その後、結果をキャッシュに格納する再試行が繰り返されます。
FromCacheAsync() を使用するときは、CachingOptions パラメーターを渡して、 NCache クエリの結果を個別のエントリではなく全体としてキャッシュします。 がある より多くのオプション 有効期限と優先順位を指定します。
FromCacheAsyn() には同期の代替手段があります FromCache()
。 非同期バージョンとは異なり、FromCache() は新しい項目のキャッシュ キーを出力パラメーターとして返します。
LoadIntoCache と FromCacheOnly
FromCache() と FromCacheAsync() とは別に、 NCache LoadIntoCache() と FromCacheOnly() という別の XNUMX つのメソッドがあります。
LoadIntoCache() は、呼び出しごとにキャッシュされた結果を上書きします。 これは、呼び出しごとにキャッシュミスを伴う FromCache() と同様に機能します。 この方法は、頻繁に変更されるデータや、常にデータの新しいコピーが必要なシナリオに最適です。
FromCacheOnly() は基になるデータベースを呼び出しません。 常にキャッシュ サーバーに送信されます。 FromCacheOnly() は、Sum、Min、Max などの集計関数をサポートします。 しかし、それはまた、 いくつかの制限。 たとえば、FromCacheOnly() は、LINQ 式での複数の投影や結合をサポートしません。
もちろん、これら最後の XNUMX つの方法には非同期の代替手段もあります。
アイテムの挿入
LINQ クエリの結果をキャッシュした後、項目を挿入する方法を見てみましょう。
MoviesController
クラスで、ムービーを追加する新しいメソッドを作成しましょう。 このような、
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); } |
通常 SaveChangesAsync() で行うようにムービーを挿入した後、GetCache() でキャッシュへの参照を取得します。 次に、同じオブジェクト参照を使用して、CachingOptions を渡す Insert() で新しいムービーを挿入します。 優先度、クエリ識別子、有効期限を渡すこともできます。
キャッシュにすでにアイテムが含まれている場合に Insert() を使用すると、代わりにアイテムが更新されます。
SaveChangesAsync() を呼び出した直後に、新しい項目をキャッシュに挿入しました。データベースに再度アクセスして取得してキャッシュすることなく、新しい項目をキャッシュに挿入したことに注目してください。 これにより、挿入するオブジェクトごとにデータベースへの往復が XNUMX 回節約されます。
まとめ
それが私たちが使用できる方法です NCache Entity Framework Core アプリケーションで。 既存の LINQ クエリにいくつかの変更を加えることで、エンティティのキャッシュを開始できます。 Entity Framework 構成を拡張するだけで済みます。
FromCache() とその代替手段を使用してください。 この投稿ではアイテムをキャッシュして挿入しましたが、次のこともできます。 削除します キー名、クエリ識別子、またはオブジェクト参照によってキャッシュからアイテムを取得します。
複雑な LINQ クエリの場合は FromCache() を使用することを思い出してください。 頻繁に更新されるデータの場合は、LoadIntoCache() を使用しましょう。 読み取り専用データの場合は、FromCacheOnly()。
この投稿で採用したキャッシュアサイド戦略とは別に、 NCache は、リードスルーやライトスルーなどの他のキャッシュ戦略とパターンをサポートします。 そしてそれはASPと統合されています.NET Core セッション状態キャッシュをサポートするフレームワーク。
この記事で書いたコードに従うには、私の NCache デモ リポジトリ GitHubで。