ASP.NET Webアプリケーション、.NET Webサービスアプリケーション、およびその他の.NETサーバーアプリケーションは、速度を落とすことなく極端なトランザクション負荷を処理する必要があります。 それらのアプリケーション層は直線的に拡張されますが、データストレージおよびデータベース層は拡張されないため、ボトルネックになります。 その結果、アプリケーション全体を拡張することはできません。
元々、次のような単純なメモリ内分散Key-Valueストア Memcached 以降 Redis このスケーラビリティの問題を解決するために、Unix/Linux プラットフォームに導入されました。 主に、アプリケーション層と同様に線形のスケーラビリティを提供し、データベースのボトルネックを取り除いたため、すぐに非常に人気がありました。
NCache 詳細 NCache ドキュメント NCache クライアントAPI
KeyValueStoreの制限
しかし、その人気にもかかわらず、これらのソリューションは本質的に非常に単純で基本的なものであり、実際のアプリケーションが直面する多くの問題を実際に解決するものではありませんでした。 これらのソリューションが非常に弱い分野には、次のようなものがあります。
- 高可用性の欠如
- キャッシュを最新の状態に保つインテリジェントな方法の欠如
- SQL クエリの欠如
- サーバー側のキャッシュ コードの欠如 (例: リードスルー)
たとえば、高可用性は Memcached そのサードパーティは、そのための高可用性「フィックスイン」の開発を開始しました。 ただし、基盤となるアーキテクチャは高可用性を実現するように設計されていないため、これらのソリューションは本質的にかなり制限されたままでした。 Redis 同じ可用性の問題がありましたが、後でデータレプリケーションやフェイルオーバーサポートなどの高可用性機能を組み込むために製品を再設計しました。 しかし、次のようなすべてのKey-Valueストア製品にはまだ大きな穴があります Memcached & Redis。 ここで、分散キャッシュソリューションが役に立ちました。
.NET分散キャッシュを2としてnd 生成キーバリューストア
のような.NET分散キャッシュ NCache 一方、上記のすべての制限に対処するために、初日から設計されました。 つまり、本質的には、 NCache 2ですnd 次のような元のKeyValueストアへの生成 Memcached & Redis. NCache は、.NETで人気のある10年前の分散キャッシュです。
動的キャッシュクラスターとデータレプリケーション
のような分散キャッシュ NCache クラスタ内のすべてのキャッシュサーバーからのすべてのCPUおよびメモリリソースをプールする自己修復動的キャッシュクラスタがあります。 同時に、 NCache さまざまな キャッシングトポロジ さまざまなデータ分散およびレプリケーション戦略を使用します。 これにより、 NCache 高可用性を損なうことなく線形にスケーリングします。 また、キャッシュサーバーがダウンしても、データの損失は発生せず、キャッシュクラスターは実行を継続し、キャッシュを使用するすべてのアプリケーションも中断することなく継続します。
キャッシュを最新に保つ
のような分散キャッシュがある別の領域 NCache 輝いて、データを新鮮に保ち、常にデータベースと一貫性を保っています。 NCache これは、次のようなさまざまな機能を通じて行われます。 有効期限、イベント運転 Sql依存性、ポーリングベースのDbDependency、およびサポート CLR手順 リレーショナルデータベース用。 有効期限はKeyValueストアと同じように機能しますが、 Sql依存性 およびDbDependencyは許可します NCache 関連データのデータベース内の変更とキャッシュを同期します。 と、 CLRストアドプロシージャ 対応するデータが変更されたときに、SQLServerデータベースからキャッシュを直接更新できるようにします。
つまり、サードパーティのアプリケーションがデータベース内のデータを変更した場合でも、 NCache それに応じてすぐに自分自身を更新します。 利点は、読み取り専用データをキャッシュする代わりに、ほとんどすべてのアプリケーションデータをキャッシュできるため、パフォーマンスとスケーラビリティが向上することです。
SQLを使用したキャッシュの検索
したがって、「キャッシュを最新の状態に保つ」機能によってほぼすべてのデータをキャッシュできる場合、唯一のメカニズムがKey-Valueであると、データを簡単に見つけることができないという問題が発生します。 ただし、属性に基づいてデータを検索できる場合は、次のような分散キャッシュが必要です。 NCache データベースと同じくらい簡単に検索できるようになります。 NCache SQLと LINQ クエリ この目的のために。
に加えて SQLクエリ オブジェクト属性に基づいて、割り当てることができます グループ, タグ, 名前付きタグ キャッシュされたアイテムに追加し、それらを SQL クエリに含めます。 以下は、C# での 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 30 |
using Alachisoft.NCache.Runtime; using Alachisoft.NCache.Runtime.Exceptions; using Alachisoft.NCache.Web.Caching; public void SearchDataUsingSQL() { Cache cache = NCache.InitializeCache("myparitionreplica"); string query = "SELECT this.Category, " + "MAX(Prod.Product.ProductID) " + "WHERE this.Category = ? " + "GROUP BY this.Category"; Hashtable values = new Hashtable(); values.Add("Category", 4); ICacheReader reader = cache.ExecuteReader(query, values); if (reader.FieldCount > 0) { while (reader.Read()) { //you can get value through the field name... object category = reader.GetOrdinal("Category"); //perform operations } } reader.Close(); return data; } |
サーバーサイドコード
最後に、次のようなサーバー側のコードがあります リードスルー, ライトスルー, カスタム依存関係, キャッシュローダーとリフレッシャー それはとても便利です。 このコードはユーザーが開発したものですが、分散キャッシュによって呼び出され、キャッシュクラスターで実行されます。 このコードを使用すると、アプリケーションを簡素化し、一般的に使用される多くのコードをキャッシュ層に移動できます。
たとえば、 NCache アプリケーションがキャッシュにないデータを要求し、アプリケーションが通知したときに、リードスルーハンドラーを呼び出します NCache その場合はリードスルーを呼び出します。 同様に、リードスルーと有効期限およびデータベースの同期を組み合わせて、キャッシュからアイテムを削除する代わりに、キャッシュされたアイテムを自動再ロードできます。
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 |
using Alachisoft.NCache.Runtime.Caching; using Alachisoft.NCache.Runtime.DatasourceProviders; using Alachisoft.NCache.Runtime.Dependencies; public class SampleReadThruProvider : IReadThruProvider { public void Init(IDictionary parameters, string cacheId) { // Create SQL connection and other initializations at the server side } //Responsible for loading an item from the external data source. public void LoadFromSource(string key, out ProviderCacheItem cacheItem) { //where LoadFromDataSource is the dummy method to load data from data source. object value = LoadFromDataSource(key); //Attach SQL dependency to your object string query = "SELECT ProductID FROM dbo.Products WHERE ProductID = 1001"; cacheItem = new ProviderCacheItem(value); cacheItem.Dependency = new SqlCacheDependency(connectionString, query); //Set expirations cacheItem.SlidingExpiration = new TimeSpan(0, 5, 0); //Indicates whether item should be reloaded on expiration if //ReadThru provider is specified. cacheItem.ResyncItemOnExpiration = true; } public void Dispose() { //... } } |
ライトスルーは、リードスルーと同じように機能しますが、更新が行われます。 アプリケーションがキャッシュを更新すると、データベースが更新されます。 また、必要に応じて、キャッシュが同期的に更新されても、後書きはデータベースを非同期的に更新します。 最後に、キャッシュの開始時にキャッシュローダーが呼び出されるため、目的のデータをプリロードできます。
まとめ
あなたが見ることができるように、 NCache、オープンソースの.NET分散キャッシュは、単純なものよりもはるかに多くのパワーをキャッシュに提供します Redis Key-Valueストアまたは Memcached。 以下は、分散キャッシュサービスとの詳細なKeyValueStoreの比較です。 Redis vs NCache & Memcached vs NCache.