トラフィックの多いアプリケーションが急速に増加しているため、この時代にはスケーラビリティが必要です。 この理由により、分散キャッシングシステムは、今日のアプリケーションの核心に浸透しています。 NCache – .NET アプリケーション用の主要な分散キャッシュも例外ではありません。
一般にキャッシュ システムを考えるとき、当然、キャッシュ システムは揮発性で非永続的であり、キャッシュが再起動されるとキャッシュに保存されているデータは利用できなくなると考えられます。
毎日数百、数千のユーザー トランザクションを行うオンライン e コマース ストアでは、すべてのデータが分散キャッシュに保存されているため、ユーザーはそのデータに非常に高速でアクセスする必要があるとします。 電子商取引ストアは、すべてのデータを不揮発性の分散キャッシュに保存し、予期せぬ状況によりキャッシュがクラッシュまたは再起動した場合でもデータを保持したいと考えています。
を使用するソリューションがあります NCacheのサーバー側デプロイメントを使用してキャッシュを変更し、永続化します。 解決策は GitHub で次のように見つけることができます。 NCache 永続キャッシュ。 このソリューションは、Read-Thru プロバイダーと Write-Thru プロバイダーを使用して、永続キャッシュとしてのキャッシュの動作を変更します。 永続キャッシュは決して通常のデータベースに代わるものではなく、データベースをより高速かつアクセスしやすくするための拡張機能にすぎません。 これは、追加のコードを必要とせずに、NET の XNUMX つの主要なデータベース システムである SQL と Cosmos DB を使用して実装できます。 これについてさらに詳しく見てみましょう。
使い方 NCacheの永続キャッシュの機能
NCache 永続データ ストアを使用すると、データを長期間保存できます。 通常、データは、事前に定義された有効期限が設定されるか、アプリケーションが削除コマンドを送信するまで、永続ストアに保存されます。 永続ストアは分散キャッシュの外側にあり、キャッシュに保存されたデータはすべて永続ストアに自動的に保存され、その揮発性の性質によりキャッシュが消去されたときに使用できるようになります。 アプリケーションによって行われるすべての読み取りリクエストで、キャッシュ内にリクエストされたデータがない場合、キャッシュは永続ストアからエントリを自動的に取得するため、キャッシュ データは失われません。 これを図 1 に示します。
NCache 永続ストアは、キャッシュに保存されているデータが使用できない場合にスムーズでシームレスなトランザクションを確保するために、次のサーバー側展開機能を提供します。
- 永続的なスタートアップローダー: このプロバイダーは、キャッシュが起動するたびに永続ストアからキャッシュにデータをロードします。 キャッシュ内で書き込み操作が行われるたびに永続ストアが更新され、キャッシュが再起動されるたびにすべての永続データがキャッシュにロードされます。 したがって、何らかの理由で完全なキャッシュ クラスターが停止し、その後再起動した後でも、キャッシュされたデータが失われることはありません。
- 永続的書き込みプロバイダー: このプロバイダーは、永続キャッシュに何かを書き込むときに自動的に呼び出されます。 永続ストアに書き込まれた内容が複製されるため、キャッシュが再起動しても利用可能な状態が維持されます。このプロバイダーを構成するには、ライトスルーとライトビハインドの 2 つのオプションがあります。 これらにより、ユーザーはバックグラウンドでレプリケーションを実行したり、書き込み操作の前にレプリケーションを実行したりすることができます。
ライトスルーu、すべての書き込み操作でデータが同時に永続ストアに保存され、その後制御がアプリケーションに返されます。
後書き, NCache 操作をキューに入れてバックグラウンドで実行し、データベース操作が実行される前にフローをユーザーに返します。 - 永続読み取りプロバイダー: このプロバイダーは、ユーザーがキャッシュ内にないデータを必要とする場合に呼び出されます。 Read Through プロバイダーを使用しているキャッシュ クラスターは、永続ストアからこのデータをフェッチし、キャッシュに保存します。
永続性 WriteThru プロバイダーの簡単な例
永続キャッシュを使用する方法の簡単な例を見てみましょう。 NCache。 この例では、次のコマンドを使用してアイテムをキャッシュに追加します。 ライトスループロバイダー。 ユーザーが項目をキャッシュに追加すると、キャッシュ サーバーにデプロイされたライトスルー プロバイダーが呼び出され、同時に項目が永続データ ストア内に保存されます。 キャッシュがシャットダウンした場合、またはライトスルーを使用せずに項目がキャッシュから削除された場合、項目はキャッシュからは削除されますが、永続ストアからは削除されません。 データは永続ストア内にあるため、失われることはありません。 そのアイテムが必要になると、永続ストアからキャッシュにフェッチされます。
以下は、Write-Thru プロバイダーのインターフェイスを示す基本コードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class PersistenceWriteThruProvider : ProviderBase, IWriteThruProvider { public OperationResult WriteToDataSource(WriteOperation operation) { OperationResult operationResults = new OperationResult(operation, OperationResult.Status.Success); switch (operation.OperationType) { case WriteOperationType.Add: var items = new Dictionary<string, ProviderItemBase>(); items.Add(operation.Key, operation.ProviderItem); _persistenceProvider.Add(items); break; // Update and remove cases are similar and need to be handled } return operationResults; } } |
ライトスルーを有効にしてキャッシュに項目を挿入し、デプロイされたライトスルー実装を活用する方法は次のとおりです。
1 2 3 4 5 6 |
// Enable write through for the cacheItem created var writeThruOptions = new WriteThruOptions(); writeThruOptions.Mode = WriteMode.WriteThru; // Add the item in the cache with WriteThru enabled CacheItemVersion itemVersion = cache.Insert(key, cacheItem, writeThruOptions); |
永続性 ReadThru プロバイダー
アプリケーションがキャッシュからデータを取得したいとします。 このデータは以前はキャッシュに保存されていましたが、何らかの理由により利用できなくなりました。 通常、ユーザーがそのようなデータにアクセスしようとすると、キャッシュには必要なデータが含まれていないため、キャッシュは null 値を返し、データベースからデータをフェッチするにはクエリを含む追加のコードを記述する必要があります。 これにより、アプリケーション ロジックが複雑になりすぎます。 まずキャッシュで必要な項目が検索され、使用できない場合はデータベースを確認してからデータをロードします。
私たちが使用するとき NCache 永続データ ストアの場合、キャッシュから削除されたデータは引き続き永続データ ストアに保存され、キャッシュは リードスループロバイダー 実装すると、データがキャッシュ内で呼び出され、ユーザーに返されます。 したがって、キャッシュから削除されている場合でも、追加のコードを必要とせずに、必要なデータを取得できるようになります。
以下は、Read-Thru プロバイダーのインターフェイスを示す基本コードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class PersistenceReadThruProvider : ProviderBase, IReadThruProvider { public ProviderCacheItem LoadFromSource(string key) { return (ProviderCacheItem)(_persistenceProvider.Get(new string[] { key })[key]); } public ProviderDataTypeItem LoadDataTypeFromSource(string key, DistributedDataType dataType) { ... } public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection keys) { ... } } |
リードスルーを有効にしてキャッシュからデータをフェッチできるため、データがキャッシュに存在しない場合は、リードスルー プロバイダーの実装に従ってデータ ソースからデータがフェッチされます。
1 2 3 4 5 6 |
// Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache 詳細 リードスルー キャッシュに関するドキュメント
永続化スタートアップローダー
前述したように、キャッシュは揮発性であり、キャッシュがオフになると、キャッシュ内のすべてのデータが消去されます。 再起動するとキャッシュは空になるため、再設定する必要があります。 必要なときに Read-Thru プロバイダーを使用して各エントリを読み込むと、データの取得と操作のプロセスが遅くなります。 キャッシュの起動時にキャッシュ内のすべてのデータをロードできたらどうなるでしょうか? とともに キャッシュローダー によって提供されるインターフェース NCache、永続ストアのすべてのデータは起動時にキャッシュに複製されるため、アプリケーションで使用できるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class PersistenceStartupLoader : ProviderBase, ICacheLoader { public LoaderResult LoadNext(object userContext) { if (persistentItems == null) persistentItems = _persistenceProvider.GetAll(); LoaderResult result = new LoaderResult(); foreach (var item in persistentItems) { result.Data.Add(new KeyValuePair<string, ProviderItemBase>(item.Key, item.Value)); } return result; } } |
NCache 詳細 キャッシュ スタートアップ ローダーのドキュメント
永続データストアからのデータの削除
私が作成したソリューションでは、永続ストアはキャッシュにリンクされているため、キャッシュ内で行われた変更は永続ストア内でも行われます。 たとえば、データ項目は永続ストアだけでなくキャッシュにも保存されます。 ユーザーがキャッシュからファイルを削除すると、ライトスルー プロバイダーの助けを借りて、永続ストアからも削除されます。 これにより、メイン キャッシュが永続データ ストアと確実に同期されます。
ただし、これは完全に柔軟であり、これを変更して、アプリケーションが削除コマンドを送信した場合でも項目を永続ストアに保存することができます。
なぜ NCache?
NCache は、100% .NET 用に作られた、市場をリードする高速かつスケーラブルなインメモリ分散キャッシュです。 .NET Core アプリケーション。 キャッシュの永続性をサポートするサーバー側の機能が提供されており、必要に応じてキャッシュの永続性を使用するために作成できる構成が多数あります。 データはキャッシュから任意のデータベースに保存できます。 NCache アプリケーション データをキャッシュし、データ ストレージとデータベースに関連するパフォーマンスのボトルネックを解消します。 これにより、データをキャッシュに長期間保存して、必要なときに確実にデータを利用できるようになります。 NCache 永続化データストアにより、キャッシュが開始されるたびにデータベースからキャッシュにデータを移動する必要がなくなります。 これにより、追加のコードを記述する必要がなく、データの高可用性が保証されます。
〜へ向かう NCache 実装方法と使用方法について詳しく知るためのドキュメント NCache 永続的なデータストアと分散キャッシュ。