今日、Webアプリケーションは、頻繁に使用されるデータをキャッシュしてコストのかかるデータベーストリップを削減することにより、パフォーマンスとスケーラビリティを向上させるために分散キャッシュをますます使用しています。 分散キャッシュは、複数のキャッシュサーバーにまたがって同期し、線形に拡張できるようにします。 優れた分散キャッシュには通常、キャッシュ依存機能があり、何かが変更に依存したときにキャッシュされたアイテムを期限切れにすることができます。 キャッシュの依存関係は、キーベース、ファイルベース、またはデータベースベースにすることができます。 したがって、本質的には、キャッシュ内の別のアイテム(キーベース)、ファイルシステム内のファイル(ファイルベース)、またはSQL Serverデータベース内の行またはデータセット(データベース)に依存するようにキャッシュされたアイテムを指定できます。 -ベース)。 また、これらのソースのいずれかのデータが変更されると、「依存関係の有効期限が切れた」ため、キャッシュされたアイテムは自動的にキャッシュから削除されます。 これにより、キャッシュされたデータを常に最新かつ正確に保つことができます。
これはすべてうまくいきますが、キャッシュされたアイテムを上記以外のデータソースのデータに依存させたい場合はどうでしょうか。 たとえば、データの変更を提供するRSSフィード(Rich Site Summary)があるとします。 また、このフィードを読み取る独自のプログラムがあり、RSSフィードに表示されるデータの変更に基づいて、特定のキャッシュされたアイテムを期限切れにします。 データソースが「カスタム」である他の多くの同様の状況があります。 したがって、これらの状況を処理するには、優れた分散キャッシュにより、キャッシュされたアイテムに独自のカスタムキャッシュ依存関係を実装する柔軟性が提供され、カスタムデータソースのデータが変更されたときに期限切れになる可能性があります。
NCache そのようなを提供します カスタムキャッシュの依存関係 特徴。 NCache は、あらゆる種類の.NETアプリケーション用の強力な分散キャッシュです。 と、 NCache 独自のカスタム依存関係を実装できます。 カスタム依存関係を簡単に実装できることを示しましょう NCache 下。 実行する必要のある手順は次のとおりです。
- を使用して追加 Alachisoft.NCache.Runtime.Dependencies; カスタム依存関係の実装への参照。
- NCache すべての依存関係の基本クラスであるExtensibleDependencyという名前の拡張可能な抽象クラスを提供します。 ExtensibleDependencyからカスタム依存関係クラスを継承してから、そのHasChangedプロパティをオーバーライドする必要があります。 このプロパティがtrueを返す場合、アイテムに依存するアイテムはキャッシュから期限切れになります。
これは、カスタム依存関係の実装の完全な例です。指定された製品の使用可能なユニットが100未満の場合、依存関係の変更がトリガーされます。
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using Alachisoft.NCache.Runtime.Dependencies; [Serializable] public class CustomDependency : ExtensibleDependency { private string _connString; private int _productID; public override bool Initialize(){ return false; } public CustomDependency(int productID, string connStr) { _connString = connStr; _productID = productID; } internal bool DetermineExpiration() { if (GetAvailableUnits(_productID) < 100) return true; return false; } internal int GetAvailableUnits(int productID) { OleDbDataReader reader=null; OleDbConnection connection= new OleDbConnection(_connString); connection.Open(); int availableUnits=-1; try { OleDbCommand cmd = connection.CreateCommand(); cmd.CommandText = String.Format(CultureInfo.InvariantCulture, "Select UnitsInStock From Products" + " where ProductID = {0}", productID); reader = cmd.ExecuteReader(); if (reader.Read()) { availableUnits = Convert.ToInt32(reader["UnitsInStock"].ToString()); } reader.Close(); return availableUnits; } catch (Exception) { return availableUnits; } } public override bool HasChanged { get { return DetermineExpiration(); } } } |
- カスタム依存関係を実装し、 NCache サービスの場合、必要なのは、必要に応じて、この依存関係をアプリケーションの依存キャッシュアイテムに登録することだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using Alachisoft.NCache.Web.Caching; //add namespace //Add following code in your application Cache _cache = NCache.InitializeCache("myCache"); string connString = "Provider=SQLOLEDB;Data Source=localhost; User ID=sa;password=;Initial Catalog=Northwind"; CustomDependency hint = new CustomDependency(123, connString); _cache.Add("Product:1001", "Value", new CacheDependency(hint), Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 10), Alachisoft.NCache.Runtime.CacheItemPriority.Default); |
これで、カスタムデータソースのデータが変更されたときに、 NCache 依存するキャッシュアイテムをキャッシュから自動的に期限切れにします。 NCache はカスタム依存関係コードを実行する責任があるため、独自の個別のプログラムを実装し、信頼できるプロセスでホストすることを心配する必要はありません。 アプリケーション固有のシナリオで試してみてください。