分散キャッシングは、アプリケーションのパフォーマンスを向上させ、スケーラビリティを提供するため、時間の経過とともに一般的になってきました。 また、高速でスケーラブルな方法が必要なため、人々はますます多くのデータをキャッシュにキャッシュしています。 アプリケーションのパフォーマンスが向上すると、クライアント アプリケーションの数が増加します。 ただし、複数のクライアントがデータ ソースとの間でデータを配置およびフェッチする場合、データベースとキャッシュが同期しなくなる可能性が高くなります。 この問題に対処するために、ほとんどの人は Time to Live (TTL) または 絶対有効期限. この有効期限により、指定された時間が経過すると、指定されたキャッシュ アイテムが自動的に削除されます。 よく使われていますが、このメカニズムは、キャッシュ内でデータが変更されない期間についての経験に基づいた推測です。
この期間中にデータが変更される可能性が低いと確信している場合、またはデータの機密性が高くない場合、つまり古い古いデータをキャッシュから読み取る余裕がある場合は、次を使用できます。 期限切れ. しかし、データがビジネス上の機密性が高く、キャッシュから不正確なデータを読み取る余裕がない場合、古いデータは多大なコストがかかります。 この状況では、古いデータにアクセスすることは、取るべきではないリスクです。
NCache 詳細 データの有効期限の種類 NCache ドキュメント
同期しています NCache SQLServerを使用
.NET アプリケーションで発生する上記の状況を回避するには、キャッシュが常にデータベースと同期していることを確認する必要があります。 そして、この正確な目的のために、 NCache と呼ばれるデータベース同期機能を提供します。 SQLの依存関係 これにより、キャッシュを SQL Server データベースと同期させておくことができます。 SQL 依存関係は、クエリ通知を使用して、データセットで変更が発生した場合にキャッシュをデータベースと同期します。
NCache 詳細 SQLの依存関係 NCache ドキュメント
SQL Server でのクエリ通知
クエリ通知は、データベース内のデータセットが変更されたときにすべてのデータベース クライアントに通知する SQL Server の機能です。 NCache サーバーは、この機能を使用して SQL Server クライアントになり、SQL Dependency を通じて SQL Server に登録します。
このように、SQL Server は通知します NCache データベース内の特定のデータが変更されたとき。 と NCache キャッシュされたアイテムとデータベースの対応するデータセットのマッピングを保持します。 これとともに、 NCache キャッシュされたアイテムを無効にすることができるため、アプリケーションが次に必要とするときにデータベースから新しいコピーがフェッチされます。
NCache クライアント API を通じて SQL 依存関係 API を提供します。 ただし、キャッシュされたアイテムを NCache.
NCache 詳細 SQLの依存関係 SQLServer環境のセットアップ
同期 NCache SQL Serverの場合:簡単な例
.NET ベースのオンライン ショッピング システムがあり、数百のクライアントが同時にアクセスするさまざまな検索可能なアイテムがあるとします。 ショッピング ポータルはクリスマスの日にオープンし、在庫全体が 40% 割引になります。 アプリケーション サーバーはデータベース内の製品の単価を更新しますが、キャッシュはこの変更を認識しません。
クライアントがキャッシュからアイテムにアクセスする場合、これらのアイテムの古いコピーは割引なしで引き続き利用できます。 顧客が製品を検索すると、古い単価のクリスマスが表示されます。その結果、顧客はビジネスに不満を感じ、不満を抱くようになります。
しかし、あなたが使用する場合、 NCache 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 29 |
// Creating connection string to get connected with database. string connectionString = "Server=SERVERNAME; Database=NORTHWIND; UserId=USERID; Password=PASSWORD;"; // Getting products from database. List products = FetchProductFromDB(); // Creating dictionary of CacheItems. Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>(); foreach(Product product in products) { string productKey = $"Product: {product.ProductID}"; // Creating an SQL dependency on the unit price of product. Whenever the Unitprice changes, the product is removed from the cache. string query = $"Select UnitPrice from dbo.Products where ProductID = {product.ProductID}"; // Creating dependency on all the products. SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query); CacheItem productItem = new CacheItem(product); // Adding Dependency to product item productItem.Dependency = dependency; } // Adding CacheItems in cache cache.Add(productKey, productItem); |
あなたが使用する必要がある理由 NCache SqlCacheDependency SQL サーバーとデータを同期する方法は簡単です。 キャッシュ データが古くなることはなく、データの整合性の問題に直面することなく、自信を持ってあらゆる種類のデータを配置してフェッチできます。
NCache 詳細 SqlCacheDependency NCache ドキュメント
ReadThruプロバイダーを介したキャッシュアイテムの自動リロード
キャッシュされたアイテムを無効にする代わりに、対応するデータがデータベースで変更されたときにキャッシュが自動的にリロードするようにする場合は、 IReadThruProvider インターフェース NCache。 今、いつでも NCache そのアイテムをキャッシュから削除する代わりに、SQL Server から更新通知を受け取ります。 NCache ReadThruプロバイダーを呼び出して、データベースから更新されたデータをフェッチします。
データをキャッシュに挿入する前に、次のコード行を追加します。 NCache データの自動同期を処理します。
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add sql dependency to it CacheItem item = new CacheItem(product); item.Dependency = sqlDependency; // Resync if enabled, will automatically resync cache with SQL server item.ResyncOptions = new ResyncOptions(true); // Add cache item in the cache with SQL Dependency and Resync option enabled cache.Insert(key, item); |
NCache 詳細 データ ソース プロバイダー リードスルー NCache ドキュメント
SQL依存関係のパラメータ化されたクエリ
データベースの変更が多すぎると、キャッシュされたアイテムを頻繁に無効にする必要があります。 データ無効化ごとに、SELECT クエリを指定する必要があります。 これは、SQL Server がこの SQL クエリを実行する前にコンパイルする必要があることを意味します。 これにより、クエリのコンパイルに非常に長い時間がかかるため、パフォーマンスが低下します。
このパフォーマンスの問題に対処するには、 NCache では、実行時にパラメータ値を指定するパラメータ化された SQL クエリを使用でき、これらの値は実行ごとに変化します。 ここでは、SQL クエリ自体が最初の実行時にコンパイルされ、再コンパイルする必要がなくなります。これにより、多くの時間が節約され、パフォーマンスが向上します。
アプリケーションでパラメーター化されたクエリを使用するには、通常の選択クエリを記述する代わりに、次のクエリを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Creating Param to be passed in stored procedure dictionary. SqlCmdParams paramProductID = new SqlCmdParams { Type = CmdParamsType.Int, Value = product.ProductID }; // Creating stored procedure params. Dictionary<string, SqlCmdParams> parameter = new Dictionary<string, SqlCmdParams>(); parameters.Add("@ProductID", paramProductID); CacheItem productItem = new CacheItem(product); /*Creating an SQL dependency on the unit price of the product. Whenever the unit price changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query, SqlCommandType.Text, parameters); // Adding Dependency to the product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache 詳細 SqlCacheDependency SqlCacheDependency
ストアド プロシージャ ベースの SQL 依存関係
多くの組織は、アプリケーションで使用されるすべての SQL クエリをストアド プロシージャの形式でデータベース内に保持することを好みます。 これらのストアド プロシージャはすべてプリコンパイルされており、動的 SQL クエリよりもはるかに高速に実行されるため、これによりパフォーマンスが向上します。 第 XNUMX に、すべてのデータベース アクセス SQL クエリを XNUMX か所に保持できるため、SQL クエリを更新する場合に変更が困難な各アプリケーション内に散らばることはありません。
これらの組織の場合、 NCache はストアド プロシージャ ベースの SQL 依存関係をサポートしており、動的 SQL クエリやパラメータ化された SQL クエリを指定する代わりに、ストアド プロシージャ呼び出しを指定できます。
次の SQL クエリは、ProductID をパラメーターとして使用してプロシージャを作成します。 このストアド プロシージャをアプリケーションで使用して、キャッシュをデータベースと同期させることができます。
1 2 3 4 |
create PROCEDURE sp_GetUnitPriceByProductID @ProductID int as Select UnitPrice from dbo.Products where ProductID = @ProductID; |
.NETアプリケーションでこのストアドプロシージャを呼び出すには、次のコードスニペットを使用します。
1 2 3 4 5 6 7 8 9 10 11 |
// Specifying stored procedure, created in database. string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID"; /*Creating an SQL dependency on the unit price of product. Whenever the unitprice changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters); // Adding Dependency to product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
まとめ
使用していない場合 NCache ASP.NET ベースのアプリケーションのプライマリ データ ソースとして、次のように使用を開始します。
- NCache は、データの自動再調整にクライアントの干渉を必要としないインメモリ ソリューションであり、アプリケーションを非常に柔軟にします。
- 実行時に必要な数のサーバーを追加できるため、.NET アプリケーションに最もスケーラブルなソリューションを提供できます。
ASP.NET アプリケーションを使用しているが、使用しているデータベースが通知をサポートしていない場合は、 NCache と呼ばれるメソッドを提供します。 ポーリングベースの依存関係.