データベースはの不可欠な部分です .NET 大量のデータセットを効率的にフェッチして操作できるアプリケーション。 ただし、トランザクションの多いデータを処理する場合、データベースは.NETアプリケーションのパフォーマンスを低下させます。 これは、データベースを複数のマシンにスケールアウトできないためです。データベース層専用のサーバーマシンをXNUMXつだけ持つことができ、それ以上追加することはできません。 したがって、データベースはパフォーマンスのボトルネックになります。 この問題を解決するために、次のような分散キャッシュソリューションを使用します。 NCache データベースへの不必要で費用のかかる移動を軽減するため。
NCache 詳細 ダウンロード NCache エディションの比較
データベースをキャッシュする方法は?
データベースのキャッシュは、思ったよりもはるかに簡単です。 次のようなキャッシュにキャッシュ層を組み込む必要があります NCache アプリケーションとデータベース層の間で、データベースデータがキャッシュから提供されるようにします。 簡単にするために、キャッシュ使用のXNUMXつの最も一般的なパターンを要約しました。 それらは以下に簡単に説明されています:
1.オブジェクトキャッシング
この戦略では、データがキャッシュに存在しない場合は、データベースからデータをフェッチしてから、次のようにキャッシュに挿入することをお勧めします。 NCache。 後続の呼び出しは、後でキャッシュから処理されます。 古いデータに関する問題については、次のように追加します 期限切れ キャッシュアイテム データベースから更新できるようにします。
次のコードは、Customerのインスタンスが存在する場合はキャッシュからフェッチします。 それ以外の場合は、データベースからフェッチし、後続の呼び出しでキャッシュヒットが発生するようにキャッシュに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var key = "Customer:1001"; // Get Customer from cache if it exists var customer = cache.Get<Customer>(key); // If customer does not exist in cache if (customer == null) { // Fetch from database customer = GetCustomerFromDB(1001); // Create sliding expiration of 15 seconds. Cache removes item after this time var expiration = new Expiration (ExpirationType.Sliding, TimeSpan.FromSeconds(15.0)); var cacheItem = new CacheItem(customer) { Expiration = expiration }; // Insert the item with expiration into cache cache.Insert(cacheKey, cacheItem); } |
NCache 詳細 データキャッシングドキュメント NCache プログラマーガイド
2.参照データをキャッシュし、SQLクエリを使用して検索します
読み取られるだけで頻繁に変更されないデータは、参照データと呼ばれます。 .NETアプリケーションがデータを繰り返し読み取り、データベースにデータを書き込むことはめったにありません。 キャッシュ(のような NCache)は、参照データに使用すると、そのようなデータで最も高速に動作するため、より強力になります。
参照データ全体をキャッシュしてから使用することを強くお勧めします キャッシュを検索するSQLクエリ データベースに行く代わりにそれのために。 参照データセット全体(たとえば、すべての顧客)をキャッシュしない場合、一部のデータはデータベースにのみ存在するため、キャッシュに対するSQLクエリは無効な結果を返すことに注意してください。
すでにお持ちの場合 キャッシュをプリロードしました すべての参照データを使用して、次の例でそれを検索する方法を説明します。
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 |
// Pre-Requisite: All customer instances have already been added into cache var customerName = "John Smith"; // Write SQL query for cache var query = "SELECT $Value$ FROM Northwind.Model.Customer WHERE Name = ?"; // Create the query command that cache understands from the query var queryCommand = new QueryCommand(query); // Provide the parameters for the query queryCommand.Parameters.Add("Name", customerName); // Execute the query on cache var reader = cache.SearchService.ExecuteReader(queryCommand, true); var customer; // If a valid projection was made in the query if (reader.FieldCount > 0) { while (reader.Read()) { customer = reader.GetValue<Customer>(1); // Perform operation according to business logic } } |
NCache 詳細 SQLキャッシングドキュメント データキャッシングドキュメント
3.キャッシュ内のXNUMX対多の関係の処理
ほとんどの場合、データにはその間の関係が含まれています。 たとえば、Northwindデータベース(Microsoftが使用)のコンテキストでは、「Orders」テーブルは「Customers」テーブルに関連付けられています。 これらのエンティティは、.NETアプリケーションのドメイン内の関連エンティティと見なされます。 次のようなキャッシュを使用する NCache、キャッシュ内でこれらのエンティティを関連付けることもできます。
これは 関連するすべてのエンティティをタグ識別子に関連付ける そのため、顧客の各注文を個別に取得する代わりに、タグIDを介してキャッシュを検索することにより、XNUMX回の呼び出しで顧客のすべての注文を取得できます。 与えられたサンプルコードは、この動作を実現する方法を示しています。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
var cacheKey = "Customer:1001"; var tagName = "Customer:1001_Orders"; // Check if customer exists in cache var cachedCustomer = cache.Get<Customer>(cacheKey); // If customer does not exist in cache if (cachedCustomer == null) { // Fetch from database var customer = GetCustomerFromDb(1001); // Insert customer into cache cache.Insert(cacheKey, customer); // Fetch orders of the customer from database var relatedOrders = GetRelatedOrdersFromDb(customer); // Create a tag for all orders of the customer var tag = new Tag(tagName); foreach (Order order in relatedOrders) { var orderCacheKey = $"Customer:1001_Order:{order.OrderID}"; // Create a cache item and set the tag identifier var orderCacheItem = new CacheItem(order) { Tags = new[] { tag } }; // Insert the tagged cache item into cache cache.Insert(orderCacheKey, orderCacheItem); } } else { // Item exists in the cache // Create a tag to fetch the related orders var tagIdentifier = new Tag(relatedEntityIdentifier); // Fetch the related orders based on the tag identifier var cachedOrders = cache.SearchService.GetByTag<Order>(tagIdentifier); } |
NCache 詳細 タグ付きデータドキュメントをキャッシュする データキャッシングドキュメント
4.データベースクエリ結果のキャッシュ(トランザクションデータ)
ほとんどの場合、データベースからのデータはクエリ結果セットの形式で返されます。 この戦略では、結果セット全体をキャッシュに挿入して、連続するクエリがキャッシュから提供されるようにすることをお勧めします。 同じ基準のクエリは、常に同じ結果セットを参照します。 したがって、クエリコマンド自体を結果セットの一意の識別子と見なし、キャッシュ内のキーとして使用できます。
次のコードは、クエリ結果セットをコレクションとしてキャッシュする方法を示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Query to select East Coast Customers var query = "SELECT * FROM Northwind.Model.Customer WHERE Region = ‘EastCoast’"; // Create cache key based on the query var key = query; // Fetch the entities based on query var resultSet = cache.Get<IList<Customer>>(key); // If data against query not found in cache if (resultSet == null) { // Fetch the result set from database var customers = GetCustomersFromDb(query); // Convert the result set into a collection var cacheReadyCustomers = customers.ToList(); // Add result set to cache against query cache.Insert(cacheKey, cacheReadyCustomers); } |
NCache 詳細 データキャッシングドキュメント SQLキャッシングドキュメント
まとめ
ご覧のとおり、.NETアプリケーションでデータベースを次のようなキャッシュでキャッシュします。 NCache とても簡単です。 アプリケーションの使用パターンに基づいて、データをキャッシュし、データベースに対して行うかのようにクエリを介してデータをフェッチできます。
また、 NCache インメモリ分散キャッシングソリューションです。 データベースを使用するときに発生するすべての問題はデータベースで処理され、標準要件などを備えたキャッシュのすべての実装が含まれています。