Entity Framework Core は、古典的な .NET Entity Framework データ オブジェクト リレーショナル マッピング エンジンの最新バージョンです。 EF Core は、軽量でクロスプラットフォームになるように再設計され、書き直されました。 EF Core を使用してアプリケーション データベースにアクセスすると、負荷のピーク時にデータベースの応答時間が遅れることがあります。 これにより、あなたの環境が大幅に損なわれます EF Core アプリケーションのパフォーマンス。 アプリケーションのトランザクション負荷が増大するにつれて、より多くのアプリケーション サーバーを使用してアプリケーション層を線形に拡張することで、リクエストの負荷に対応できます。 ただし、増加した負荷に対処するためにデータベース サーバーを追加することはできません。
ここには、次のような分散キャッシュが配置されます。 NCache が登場します。 頻繁にアクセスされるデータをキャッシュして、応答時間を短縮できます。 キャッシュの分散性 NCache Entity Framework Core では、キャッシュを作成することで、極端なトランザクション負荷の下でも最適なパフォーマンスを保証します。 線形にスケーラブル のためにペンを持つ時間も見つけています。
Entity Framework Coreでのキャッシュの使用
NCache 拡張メソッドを通じて Entity Framework Core でのキャッシュの統合を提供します。 次の結果セットをキャッシュできます。 LINQクエリ トランザクション データであっても参照データであっても。 次の拡張メソッドが提供されています。 NCache EFコア用。
LINQ クエリ結果のキャッシュ – FromCache()
XNUMX 月のハワイ行きの航空券を取得したい航空会社の Web サイトの例を考えてみましょう。 結果セットはより頻繁にフェッチされるため、キャッシュすることをお勧めします。
FromCache()
拡張メソッドは、最初にキャッシュ内のクエリ結果を確認します。クエリ結果がキャッシュに存在しないか、古くなっている場合は、データベースからフェッチされてキャッシュにも追加され、将来のリクエストに対する応答時間が短縮されます。
使い方 NCacheを使用すると、クエリ結果セットを別個のエンティティまたは単一のコレクションとして保存できます。 結果セットを変更するにはデータベースから完全に更新する必要があるため、結果セットをコレクション全体としてキャッシュに保存することがここでは合理的です。
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 詳細 Entity Framework Core Cache EFコアを構成する NCache
すべての参照データを含むキャッシュのプリロード – LoadIntoCache()
キャッシュを参照データの信頼できるプライマリ データ ソースとして使用するには、最初に参照データ全体がキャッシュ内にある必要があります。 これがないと、クエリはキャッシュを検索するだけであるにもかかわらず、一部のデータがデータベース内に存在する可能性があるため、キャッシュに対するクエリから正しい結果は期待できません。
EF Core アプリケーションの参照データを読み込む NCache リクエストへのアクセスが大幅に高速化されます。 LoadIntoCache()
データベースから LINQ クエリ結果セットをフェッチし、データをキャッシュにロードします。
これは、どのように LoadIntoCache()
内部で動作します:
e-ストアの製品カタログの例を見てみましょう。 各製品を個別のエンティティとして保存すると、あらゆる種類のクエリの組み合わせに使用できるようになり、単一の製品をさらに高速に取得できるようになります。
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 詳細 Entity Framework Core Cache NCache LINQ API ドキュメント
LINQ を使用してキャッシュ内の参照データを検索 – FromCacheOnly()
参照データに対して LINQ クエリを実行する場合は、参照データ全体をキャッシュにロードする必要があります。 それ以外の場合、一部のデータがデータベース内に存在し、このシナリオでは LINQ クエリがデータベースを検索しないため、LINQ クエリは無効になります。 これは、データベースに対して LINQ クエリを実行し、その結果セットをキャッシュする場合とは異なります。
次のアーキテクチャは、EF Core を介したクエリの実行を示しています。 NCache 今:
たとえば、特定の製品 ID を持つ製品のフェッチは、キャッシュへのアクセスのみであるため、はるかに高速になりました。
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(); } |
関連リンク: Entity Framework Core Cache NCache LINQ API ドキュメント
キャッシュ内の EF Core エンティティの変更 – GetCache()
EF Core を使用すると、データベース内のエンティティを追加および更新できます。 したがって、キャッシュをデータベースと同期し、キャッシュ内にすでに存在するエンティティに必要な変更を加えるには、 NCache は、キャッシュ上で直接追加、更新、および削除操作を実行できるキャッシュ ハンドルを提供します。
たとえば、EF Core に別の顧客を追加する場合は、呼び出してデータベースに顧客を追加した後、 SaveChanges()
データベース コンテキストで、呼び出してキャッシュ コンテキストを取得できます。 GetCache()
呼び出し Insert()
返されたキャッシュ インスタンスについて。
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); } |
関連リンク: Entity Framework Core Cache NCache キャッシュクラスのドキュメント EF Core アプリのスケール - ウェビナー
締結思考
EF Core にキャッシュを組み込む NCache シンプルかつ柔軟です。 NCache は、キャッシュのパフォーマンスを損なうことなく、レプリケーションによって 100% の稼働時間とデータの信頼性を実現することで、マルチサーバー環境で適切に機能する分散キャッシュ フレームワークを提供します。 したがって、Entity Framework Coreでのキャッシュ NCache パフォーマンスとスケーラビリティのギャップを埋め、効率性を高めます。
良い記事です。通常、私は Azure Cache を使用していました Redis データをディスクではなくメモリに保存することで、優れたスループットと遅延パフォーマンスを実現します。 価格は非常に安く、パフォーマンスの点では応答時間に大きな価値をもたらします。
とにかく、複雑なトピックを平易な言葉で説明するための素晴らしい努力。