分散キャッシュは、.NET アプリケーションのパフォーマンスとスケーラビリティを向上させる一般的な方法となっています。 そのため、開発者は分散キャッシュにますます多くのデータをキャッシュしています。 ただし、これにはいくつかの課題も伴います。 重要な課題の XNUMX つは、キャッシュ内のデータが常にデータベースと同期していることを確認することです。 これは、キャッシュがデータベースにすでに存在するデータのコピーを保持しているためです。
データベース内の同じデータを更新する複数のアプリケーションがあり、そのすべてが分散キャッシュにアクセスできるわけではない場合、キャッシュ内のデータが古く、データベース内の対応するデータとは異なるという状況が発生します。 また、これは一部の参照タイプのデータでは問題ないかもしれませんが、トランザクション データでは明らかに許容できません。 参照データは頻繁に読み取られるが、あまり頻繁に変更されないもの (製品カタログなど) であり、トランザクション データは頻繁に読み取られ、変更されるもの (顧客データやアカウント データなど) です。
NCache 詳細 キャッシュ依存関係ドキュメント NCache ドキュメント
分散キャッシュがデータベースと確実に同期されるようにするにはどうすればよいでしょうか?
答えは SqlCacheDependency
。 これは ASP.NET キャッシュ (System.Web.Caching) の一部であり、SQL ステートメントでデータベース内のデータセットを指定し、データベース内のデータセットが変更されるたびに SQL Server 2005/2008 から .NET イベント通知を受け取ることができます。 。
NCache 内部に組み込まれています SqlCacheDependency
目的で キャッシュと SQL Server 2005/2008 または Oracle データベースの同期。 あなたへ、 NCache は、SqlDependency と呼ばれる同様のインターフェイスを提供します。これを使用すると、キャッシュされたアイテムを構成する特定のテーブル内の XNUMX つ以上の行を表す SQL ステートメントを指定できます。 NCache その後内部で使用します SqlCacheDependency
これらの行に対してデータベースとのリンクを確立します。
したがって、アプリケーションのいずれかによってデータベース内のデータが更新されると、SQL Server は .NET イベント通知を発行します。 NCache 対応する項目をキャッチし、分散キャッシュから削除します。 これにより、同じデータの XNUMX つの異なるコピーが存在するというデータの不整合の問題が解決されます。 これは、アプリケーションが次回同じデータを必要とするときに、そのデータがキャッシュ内に見つからず、データベースから最新のコピーを取得し、そのデータもキャッシュする必要があるためです。 こちらです、 NCache キャッシュ内のデータがデータベース内のデータと常に一致していることを保証します。
以下は、SqlDependency を使用したソースコードの例です。 NCache 内部的に使用するもの SqlCacheDependency
:
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 48 49 50 51 52 |
public class Program { // A standard Load method that loads a single row from database public Customer LoadCustomer(Customer cust) { String key = "Customer:CustomerID:" + cust.CustomerID; Customer cust2 = (Customer)NCache.Cache.Get(key); if (cust2 != null) return cust2; CustomerFactory custFactory = new CustomerFactory(); // Load a single customer from the database // SELECT * FROM Customers WHERE CustomerID = 'ALFKI' custFactory.Load(cust); // Create a SqlCacheDependency for this item CacheItem item = new CacheItem(cust); item.Dependency = SqlDependencyFactory(connectionString, "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'"); // Store item in the cache along with SqlCacheDependency NCache.Cache.Insert(key, item); return cust; } // A query method public List<Customer> FindCustomers(String city) { String key = "List<Customer>:City:" + city; List<Customer> custList = (List<Customer>)NCache.Cache.Get(key); if (custList != null) return custList; CustomerFactory custFactory = new CustomerFactory(); // Load a list of customers from database based on a criteria // SELECT * FROM Customers WHERE City = 'San Francisco' custList = custFactory.FindByCity(city); // Create a SqlCacheDependency for this list of customers CacheItem item = new CacheItem(custList); item.Dependency = SqlDependencyFactory.(connectionString, "SELECT CustomerID FROM Customers WHERE City = '" + city + "'"); // Store list of customers in the cache along with SqlCacheDependency NCache.Cache.Insert (key, item); return custList; } } |
SQLへのキャッシュの依存関係 Oracle DBキャッシュの依存関係 カスタムキャッシュの依存関係
要約すると、SqlDependency 機能は NCache キャッシュをデータベースと同期し、データの整合性を維持できます。 キャッシュからの古いデータを使用することを心配することなく、すべてのデータのキャッシュを開始できるようになりました。 そしてもちろん、キャッシュするデータが増えるほど、アプリケーションのパフォーマンスとスケーラビリティが向上します。
だから、完全に機能する60日間の試用版をダウンロードしてください NCache Enterprise 自分で試してみてください。