今日は統合する方法を紹介します NCache 既存の Entity Framework Core アプリケーションに組み込むことで、次の利点が得られます。 高いパフォーマンスと拡張性。カバーすべきことがたくさんあるので、早速本題に入ります。
私たちが最初に持っているのはこれです Entity Framework コア アプリケーションのサンプル 私が持っているものは、Northwind SQL データベースを使用しています。ここに来ると、注文 ID 10249 と 10268 の間で注文を取得していることがわかります。また、米国からの顧客と製品 ID 10 と 20 の間で製品を取得していることがわかります。このサンプルが行っていることはこれだけです。先に進み、データベースから取得される結果を見てみましょう。完璧。したがって、これらの製品は 10 から 20 の間で取得され、これらの 11 の製品、米国からの 13 人の顧客、およびこれらの注文 ID 間での 20 件の注文が取得されることがわかります。
サンプルが実行されたので、作業しているデータベースを見てみましょう。ご覧のとおり、私たちは Northwind データベースを使用しています。これらは、顧客テーブルにすでに存在する顧客です。これで、サンプルの動作を確認できました。
さて、どのように統合できるかについて話しましょう NCache この既存の Entity Framework Core アプリケーションに追加します。 5 つの非常に簡単な手順を使用してこれを実行します。
したがって、最初のステップは、 NCache Entity Framework コア NuGet パッケージ アプリケーションに。したがって、このアプリケーションの NuGet パッケージを管理すると、すでに EntityFrameworkCore がインストールされていることがわかります。NCache に対応する NuGet パッケージ NCache 5.3 SP2。完璧。それでは、これで閉じさせていただきます。
次のステップを見てみましょう。したがって、次のステップでは、 NCache Entity Framework Core 名前空間 私たちのアプリケーションに。したがって、ここに来たら、「using Alachisoft.NCache.EntityFrameworkCore"。コンテキストに対しても同じことを行う必要があります。そこで、これをここに保存し、コンテキストに移動し、そこにも貼り付けて保存します。これで完璧です。
次のステップは、データベース コンテキスト内でキャッシュ構成を指定することです。ここで、下にスクロールすると、「OnCconfiguring」メソッドを探しています。これが OnCconfiguration メソッドです。そして、ここで私がやろうとしているのは、作業中のキャッシュを追加することです。つまり、ここでは「efcorecache」であり、「NCache「Configuration.Configure」で、私は SQL サーバーを使用しているので、このキャッシュと依存関係の種類を SQL サーバーにします。完璧です。
それが完了したら、次のステップはモデルをシリアル化可能にすることです。それで、モデルに進み、顧客に行き、[シリアル化可能] を追加するだけです。完璧です。これをコピーします。注文に移動してそこに貼り付け、保存し、商品内に貼り付けます。完璧です。これが完了したので、この従業員を見て、他のすべてのモデルをシリアル化可能としてマークしていることを示します。そのため、これ以上のモデルに対してこれを行う必要はありません。
これで、モデルがシリアル化可能としてマークされたので、5 番目のステップに進みます。そして、5 番目のステップが最も興味深いもので、実際の NCache Entity Framework のコア拡張メソッド 私たちのアプリケーション内で。さて、これはアプリケーション内に存在するデータのユースケースによって決まります。これらは 2 つのユースケースのうちの 1 つになる可能性があります。アプリケーションにはトランザクション データまたは参照データを含めることができます。
したがって、トランザクション データについて話す場合、およびトランザクション データの処理について話す場合、トランザクション データは、非常に頻繁に読み書きされることが予想されるデータです。このデータの良い例は、フライトの追跡記録です。したがって、1 日に発生するフライトは多数あり、すべてに何らかの違いがあるため、それらをデータベースに記録している場合は、常に新しいフライトを書き込むことになり、これはトランザクションのユースケースと考えることができます。 。したがって、アプリケーションでこの種のトランザクションのユースケースがある場合、そのような種類のデータに対しては、「FromCache」拡張メソッドを使用するのが理想的であると言えます。
FromCache 拡張メソッドが行うことは、初めて FromCache 拡張メソッドが機能することであり、エンティティがデータベースからフェッチバックされる通常の Entity Framework Core アプリケーションとまったく同じように動作します。ただし、現時点では、FromCache メソッドによってこれらのエンティティがキャッシュに設定されます。この利点は、次回これらのクエリを呼び出す必要があるとき、またはアプリケーションでそれらのエンティティが必要になったときに、最初の状態に戻る必要がないことです。データベースを使用してこれらのエンティティを取得する代わりに、それらのエンティティをキャッシュからすばやくフェッチして戻すことで、高いパフォーマンスの恩恵を受け、すべてのデータをアプリケーション内に取り込む準備がすぐに整います。
では、実際にこの実装を作成して、それがどのように機能するかを見てみましょう。それで、私たちのアプリケーションに戻って、ここで私がやろうとしていることは、注文を処理し、いくつかの注文キャッシュオプションを追加することです。これで、「new CachingOptions()」があるとします。 ' ここでは、'StoreAsType' を 'Collection' として定義するだけです。したがって、すべての注文を 10 つのコレクションとしてキャッシュに保存したいと考えています。また、これらを期限切れにしたいので、有効期限を追加して「SetSlidingExpiration」を実行します。10 分の「TimeSpan()」を追加して、これらの注文が XNUMX 分後に期限切れになるようにします。完璧です。それが完了したので、ここで下にスクロールして「.FromCache」拡張メソッドを追加し、「order_caching_options」を追加します。これで完璧です。ここでやるべきことはそれだけです。
var order_caching_options = new CachingOptions()
{
StoreAs = StoreAs.SeparateEntities
};
order_caching_options.SetSlidingExpiration(new TimeSpan(0, 10, 0));
//Orders
var order_resultset = context.Orders
.Where(o => o.OrderId >= 10249 && o.OrderId <= 10268)
.FromCache(order_caching_options)
.ToList();
Console.WriteLine($"Orders between 10249 and 10268 fetched: {order_resultset.Count}
\n--------------------------------------------------------------------------\n\n"
+ String.Format("{0,-25} {1,-40} {2,-10}", $"Order ID", $"Date", $"Shipper Name") + "\n");
order_resultset.ForEach(order =>
{
Console.WriteLine(String.Format("{0,-25} {1,-40} {2,-10}", $"{order.OrderId}", $"{order.OrderDate}", $"{order.ShipName}"));
});
実行する前に、キャッシュを見てみましょう。ここで、2 つのノードに「EFCoreCache」が設定されていることがわかります。モニターにアクセスすると、完全に接続されており、正常に実行されており、中には何も入っていない状態で正常に動作していることがわかります。そして、統計を見てみると、これは同じことを物語っています。これは、内部にアイテムがまったくなく、すぐに使用できる完璧な健全なキャッシュです。それでは、アプリケーションを実行して、得られる完璧な結果を見てみましょう。
アプリケーションが実行されたので、ここでこのコンソール ウィンドウを閉じるだけです。発生した追加でキャッシュ上に取得したリクエストが表示されます。下にスクロールすると、このカウントが表示されます。私たちのコレクションはキャッシュに取り込まれています。
ここで、「export-cachekeys」を実行すると、キャッシュに入力されたこのコレクションが表示されます。ここで、各注文を個別のエンティティとして追加したいとします。そこで、コレクションではなく 'StoreAs' タイプに 'SeparateEntities' を追加します。このアプリケーションを再度実行します。 。そして今度は、単一のコレクションの代わりに、それらの注文を別個のエンティティとして追加することになります。アプリケーションが実行されたので、アプリケーションを閉じると、発生したすべてのアクティビティと、さらに重要な追加内容を確認できます。この 16 と 4 の追加、そしてこのカウントは増加しました。
したがって、「統計」に移動すると、16 と 5 が表示されます。 ここで、キャッシュ キーを再度エクスポートします。キャッシュ カウントが 21 で、すべての注文が個別に入力されていることがわかります。エンティティをコレクションだけでなくキャッシュに追加します。これで完璧です。FromCache 拡張メソッドの使用方法はこれで終わりです。
ここで、参照データの処理方法と参照データとは何かについて説明します。参照データは、書き込まれるよりもはるかに頻繁に読み取られるタイプのデータです。したがって、これは多かれ少なかれかなり静的なデータです。たとえば、製品のカタログがあるとします。現在、製品はそれほど頻繁に変更されることは想定されていないため、データベースから一貫して読み取られる参照データとなり、変更されることはほとんどありません。また、参照データの場合は、参照データの作業セット全体をキャッシュに取り込み、その参照データをフェッチする場合にのみキャッシュから読み取ることをお勧めします。どうやってそれを行うのかをお見せしましょう。
したがって、最初のメソッド、または 2 番目の拡張メソッドは「LoadIntoCache()」拡張メソッドです。 LoadIntoCache() 拡張メソッドは、データの完全な作業セットをキャッシュにロードするために非常に強力です。したがって、これはデータベースに対してクエリを実行し、クエリ結果を取得して、クエリ結果全体をキャッシュに格納し、その結果をアプリケーションに返します。
また、これもデータをキャッシュに取り込むのに便利で、データが変更されることが予想されるたびに定期的に実行できます。したがって、データが 1 週間以内に変更されることが予想される場合は、1 週間後に再度実行して、キャッシュ内のデータを更新し続け、これらのエンティティに対してキャッシュからのみクエリを実行するときに部分的な結果を受け取らないようにすることができます。キャッシュのみからクエリを行うと言えば、「FromCacheOnly()」拡張メソッドを使用する方法になります。現在、FromCacheOnly() 拡張メソッドはキャッシュ内のデータのみを検索し、結果を取得するためにバックエンド データベースにアクセスすることはありません。これは非常に高速な拡張方法であり、クラスター化されたキャッシュからすべてのエンティティを受信し、データベースを調べる必要がないため、メモリ内キャッシュのパフォーマンス上のメリットを最大限に享受できます。
それでは、これらの拡張メソッドをアプリケーションに実装してみましょう。ただし、使用する前に完了しなければならない前提条件が 1 つあります。したがって、これらの参照データ拡張メソッドを使用するには、アプリケーション内でクエリ インデックスを定義する必要があります。これは 2 つの方法のいずれかで実行できます。ここで、「[QueryIndexable]」タグを追加することで、これらのクエリ インデックスを動的に作成できます。これにより、名前空間「NCache.Runtime.Caching」をアプリケーションに追加し、これを動的に実行しました。しかし、私はこれを別の方法でやります。したがって、ここでこれにコメントするつもりです。クラスター キャッシュに戻ったら、ここでわかるように、キャッシュ上にこれらのクエリ インデックスがすでに定義されていることを示すことができます。
したがって、これはすでに行っているので、アプリケーション内で動的に追加する必要はありません。これで、これが確立されました。ここで下にスクロールすると、コードがここにあります。これで行われることはすべて、コメントを解除するだけで、データベースから製品を取得することだけです。 「LoadIntoCache()」拡張メソッドを使用して、それらを別のエンティティとして保存します。これが行うことのすべてです。それでは、これを実行して、これが取得する完璧な結果を見てみましょう。
//Load ALL Products Into Cache
var products_caching_option = new CachingOptions
{
StoreAs = StoreAs.SeparateEntities
};
var all_products = (from products in context.Products
select products)
.LoadIntoCache(products_caching_option)
.ToList();
Console.WriteLine($"\n\nAll Products Loaded into cache : {all_products.Count}\n\n");
all_products.ForEach(product =>
{
Console.WriteLine(String.Format("{0,-25} {1,-40} {2,-10}", $"{product.ProductId}", $"{product.ProductName}", $"{product.UnitPrice}"));
});
したがって、これらの 77 個の製品がキャッシュにロードされていることがわかり、この数が急増していること、追加が行われたこと、および受信したリクエストが確認できます。統計に行くと、 42と57が見えます。
ここで、キャッシュ キーを再度エクスポートするだけです。これで完璧です。したがって、キャッシュ内にこれら 99 個のアイテムが表示され、製品の作業セット全体がキャッシュに取り込まれています。これで、キャッシュ内にワーキング セット全体ができたので、製品をクエリしていた場所に安全に戻ることができるので、これにコメントするだけです。製品を取得していた場所に「FromCacheOnly()」拡張メソッドを追加します。完璧です。それが完了したら、アプリケーションを再度実行するだけです。そして、アプリケーションが「FromCacheOnly()」拡張メソッドに対して取得した結果を見てみましょう。それでは行きます。
したがって、同じ数の製品 (11 個の製品) を取得したことがわかります。したがって、ここに完全な結果があることがわかり、このフェッチがキャッシュ内から行われたこと、およびこのアクティビティが意味する FromCacheOnly( ) 拡張メソッドが機能し、キャッシュから結果を取得しました。
これで、FromCacheOnly() および LoadIntoCache() 拡張メソッドについては終わりです。今、私たちはについて話すことができます EFコア固有 NCache API。 そう、 NCache これにより、キャッシュへのデータの挿入またはキャッシュからのデータの削除に必ずしも拡張メソッドを使用する必要がなくなります。 EF Core ライブラリを使用してコンテキストからキャッシュ ハンドルをフェッチし、そのキャッシュ ハンドルを使用して独立したエンティティを挿入したり、キャッシュから独立したエンティティを削除したりすることもできます。ここで 1 つ付け加えておきたいのは、これは NCache 内で利用可能な API NCache SDK であり、これは Entity Framework Core 専用または固有の API です。
そこで、これらの API を見て、それらがどのように動作するかを見てみましょう。したがって、これがそれらをどのように使用するかです。したがって、コンテキストからキャッシュをフェッチし、顧客に対してキャッシュ.インサートを実行し、出力文字列キャッシュ キーを提供するだけで、キャッシュにデータを挿入します。このキャッシュ キーは、Entity Framework Core API によって生成されます。そして、同じキャッシュ ハンドルを使用してデータを削除したり、キャッシュからアイテムを削除したりする場合は、たとえば、context.find を使用してキャッシュ内でそのデータを検索し、単に cache.Remove を実行することができます。
それでは、アプリケーションでこれらを実行してみましょう。したがって、ここでアプリケーションに戻って下にスクロールすると、顧客をキャッシュに追加するコードがここにあります。このコードのコメントを外します。上にスクロールすると、この顧客を作成するコンテキストからキャッシュを取得しているだけであることがわかります。それを別のエンティティとして保存し、変更を保存したいと考えています。このキャッシュを実行します。挿入して、この顧客をキャッシュに追加したことを書き込みます。それでは、実行して、これが何をするかを見てみましょう。
//Add Customer Using Cache Handle
Cache cache = context.GetCache();
var cust = new Customer
{
CustomerId = "HANIH",
ContactName = "Hanih Moos",
ContactTitle = "Sales Representative",
CompanyName = "Blauer See Delikatessen",
};
var options = new CachingOptions
{
StoreAs = StoreAs.SeparateEntities
};
context.Customers.Add(cust);
context.SaveChanges(true);
cache.Insert(cust, out string cacheKey, options);
Console.WriteLine($"Customer ID: {cust.CustomerId} -> Added to Cache");
したがって、この顧客がキャッシュに追加されたことがわかります。したがって、このアプリケーションを閉じると、これらのリクエストが実行された追加が表示され、小さなスランプが確認できるため、42 から 43 に変化しました。統計に移動すると、43 と 57 が表示されます。これで 100 が完了します。つまり、キャッシュ キーをエクスポートすると、その独立した顧客が表示されるので、準備完了です。したがって、キャッシュに追加した独立した個別のエンティティがわかります。パーフェクトです。
では、この顧客を削除してみましょう。したがって、この部分のコードにコメントを付けておきます。もう一度、ここで下にスクロールして、このコード部分のコメントを外します。このコード部分が行っていることは、同じ顧客名のキャッシュ内で顧客を検索することだけであり、その顧客が見つかった場合は、コンテキストから削除し、変更を保存してから、キャッシュから削除します。そして、それが完了したことを出力します。そうでない場合は、顧客が見つからなかったということになります。
//Remove Customer Using Cache Handle
Cache cache = context.GetCache();
Customer customerToRemove = context.Customers.Find("HANIH");
if (customerToRemove != null)
{
context.Customers.Remove(customerToRemove);
context.SaveChanges(true);
cache.Remove(customerToRemove);
Console.WriteLine($"Customer ID: {customerToRemove.CustomerId} -> Removed from Cache");
}
else
{
Console.WriteLine("could not find the customer within the cache");
}
Console.ReadLine();
それでは、このアプリケーションを実行して、結果を見てみましょう。完璧です。したがって、顧客がキャッシュから削除されたことがわかり、統計を見ると 43 から 42 に変化しており、モニターには同じことが表示され、完璧です。
それで、統計に戻って、 NCache PowerShell を使用して、キャッシュ キーをエクスポートします。完璧です。そして、キャッシュ内にその顧客がもう存在しないことがわかります。そして、これが、 NCache EF Core 固有の API。
これでこのデモンストレーションは終わりになります。本当にありがとうございました。あなたがしたい場合は ダウンロード NCache 弊社のダウンロード ページから、30 日間の無料試用版と完全な機能を備えた動作可能な製品を入手できます。今すぐそこへ連れて行きましょう。ここに来ると、これらが Windows 用と Linux 用にダウンロードできる .NET 用の製品であることがわかります。 NCache 用意されています。
また、あなたは試すことができます NCache で NCache 遊び場。また、実際に製品を触って、機能がどのように機能するかを確認することができます。それで、ここに行くと、 遊び場を試してみる このサンドボックス セッションを 30 分間開始して、いくつかのサンプルを実行し、.NET および Java サンプルがどのように実行され、どのように感じられるかを確認できることがわかります。
そして最後に、パーソナライズされた予約をすることができます NCache デモでは 1 時間の技術セッションを提供し、そこでディスカッションを行います。 NCache アーキテクチャと機能を確認し、お客様の環境内で見つかったユースケースに従ってそれらをマッピングします。そして、それを行うのは非常に簡単です。こちらの Web サイトにアクセスして、このパーソナライズされたライブ デモをスケジュールするだけです。 このページはこちら。そして、あなたがここに来たら、そのリクエストを送信することができます。私たちはそれを受け取り、何かをスケジュールします。以上で、このデモは終了です。ご覧いただきありがとうございます、素晴らしい一日をお過ごしください。さようなら。