アプリケーションとデータベースの間にキャッシュ サーバーを配置して、アプリケーションを高速化できます。 しかし、アプリケーションを拡張する必要がある場合、それだけでは十分ではありません。 パフォーマンスを向上させるための XNUMX つのキャッシュ パターンとその方法を見てみましょう。 NCache それらを実装します。
データパーティショニングによるスケーラビリティ
データ パーティショニングでは、大きなデータ セットを小さなデータ セットに分割し、ノード間で分散します。 このようにして、ノード間で読み取りと書き込みを分割し、アプリケーションの全体的なパフォーマンスを向上させます。 NCache 異なるサポート キャッシングトポロジ。 この文脈では、トポロジはデータ ストレージ、レプリケーション、およびクライアント接続戦略です。 データ パーティショニングを実装するトポロジは XNUMX つあります。 パーティショントポロジおよびパーティションレプリカトポロジ。 これら XNUMX つのトポロジでは、 NCache データをバケットに分割し、それらのバケットをクラスターのノードに配置します。
NCache は 1000 個のバケットを使用し、それらをクラスター内のノード間で均等に分割します。 たとえば、単一ノードでキャッシュ クラスターを開始すると、 NCache すべてのバケットを単一のノードに割り当てます。 別のノードを追加すると、 NCache これらの 1000 バケットを 500 つの XNUMX バケット ノードに分割します。 また、ノードを削除すると、 NCache バケットを残りのノードに分散します。
Since NCache データをバケットとノードに分割すると、キャッシュ クライアントはすべてのノードに接続しますが、アイテムを含むノード上で読み取りおよび書き込み操作を直接実行します。 ノードが利用できない場合でも、キャッシュ クライアントはアクティブなノードを使用してリクエストを再ルーティングし、操作を完了します。 NCache すべてのノードのデータ サイズをほぼ同じに保ちながら、ノード間でバケットを分散します。 このようにして、ノード間で読み取りと書き込みを分割するだけでなく、ノードを追加するたびにクラスターのストレージ容量も増加します。
データ パーティショニングのおかげで、パーティションおよびパーティション レプリカ トポロジは、トランザクションの負荷とストレージ容量を拡張します。 もちろん、パーティションとパーティション レプリカはサポートされるトポロジの XNUMX つにすぎません。 NCache もっとあります トポロジ さまざまなデータ ストレージとレプリケーション戦略を使用します。 たとえば、それらの中には、より多くの読み取りまたは書き込みを行うアプリケーションに適したものもあります。
キャッシング戦略
データ パーティショニングを使用すると、単一サーバーよりも多くのアイテムをクラスターにキャッシュできるため、アプリケーションの可用性とパフォーマンスが向上します。 また、キャッシュにデータを格納する方法を選択することで、アプリケーションのパフォーマンスを向上させることができます。 キャッシュを設定するには、キャッシュ アサイドとリードスルー/ライトスルーの XNUMX つの戦略があります。
キャッシュ アサイド戦略では、キャッシュ サーバーがデータベースの隣に配置されます。 キャッシュにアイテムが含まれていない場合、アプリケーションはデータベースからアイテムを読み取り、キャッシュに保存します。 この戦略では、キャッシュ サーバーはデータベースと直接対話しません。 おそらく、キャッシュについて考えるときに最初に思い浮かぶのは、キャッシュ アサイド戦略ではないでしょうか。
キャッシュ アサイド戦略とは異なり、リードスルー/ライトスルー戦略では、キャッシュはメインのデータ ソースのように機能します。 ここで、キャッシュはデータベースとの間でデータの読み取りと書き込みを行います。 したがって、これらの戦略は、頻繁に読み取って定期的に変更する参照データでより効果的に機能し、データベース行ではキャッシュ項目に簡単にマッピングできます。
リードスルー/ライトスルーを使用すると、データ アクセス コードの一部がアプリケーションからキャッシュに移動され、アプリケーション コードがよりシンプルかつ小さくなります。 NCache は、リードスルーおよびライトスルーのキャッシュ戦略をサポートします。
リードスルーキャッシング
NCache キャッシュ ミスがあった場合は、カスタム リードスルー プロバイダーを使用して基礎となるデータベースを呼び出します。 また、強制することもできます NCache キャッシュミスがない場合でも、常にデータベースを読み取るようにします。 リードスループロバイダーは、 IReadThruProvider インターフェイス。 のようなメソッドが含まれています ソースからロード & LoadDataTypeFromSource.
いったん リードスループロバイダー のいずれかを介してキャッシュ サーバーにデプロイされます。 NCache Manager または PowerShell スクリプトでは、次のように ReadThruOptions オブジェクトをパラメータとして Get メソッドに渡して、クライアント アプリケーションから使用できます。
1 2 3 4 5 6 7 8 9 10 11 |
// After having NCache up and running... var key = $"Product:123456"; var readThruOptions = new ReadThruOptions { Mode = ReadMode.ReadThru }; // Retrieve a cached item with Read-Thru enabled var data = cache.Get<Product>(key, readThruOptions); // Do something with the cached product here... |
ライトスルーキャッシング
一方、ライトスルー戦略では、 NCache 最初にキャッシュを更新し、その後でデータベースを更新します。 NCache データベースを同期または非同期で更新できます。 NCache 非同期ライトスルー更新を呼び出します: ライトビハインド。
ライトスループロバイダーは、 IWriteThruProvider インターフェイス。 これには、単一および複数の項目のオーバーロードを備えた WriteToDataSource メソッドが含まれています。 データ構造。 ライトスループロバイダーは、項目を追加、削除、更新するための書き込み操作をサポートする必要があります。
リードスループロバイダーをデプロイするのと同様に、 ライトスループロバイダー 私たちのキャッシュに。 プロバイダーをデプロイしたら、クライアント アプリケーションで、 ライトスルー オプション このようにアイテムをキャッシュに挿入するときのオブジェクト、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// After having NCache up and running... var product = BuildProduct(); var key = $"Product:{product.ProductId}"; var cacheItem = new CacheItem(product); var writeThruOptions = new WriteThruOptions { Mode = WriteMode.WriteThru; } // Add an item with Write-Thru enabled cache.Insert(key, cacheItem, writeThruOptions); |
リードスルーとライトスルーは、アプリケーションのスケーラビリティとパフォーマンスの向上に役立ちます。 リードスルーを使用すると、キャッシュされたアイテムは常に利用可能になります。 NCache 期限切れのアイテムを自動的に読み取ることができます。 また、ライトスルーを使用すると、アプリケーションはデータベースへの書き込みを待つ必要がなくなります。 NCache データベースを非同期に更新でき、スロットル メカニズムを使用していても、データベースへの負荷を軽減できます。
まとめ
これらは、パフォーマンスとスケーラビリティを向上させるための XNUMX つのキャッシュ パターン、データ パーティショニングとキャッシュ戦略です。 使用できます NCache それらをアプリケーションに実装します。 データのパーティショニングを使用すると、ノード間で読み取りと書き込みが分割され、キャッシュのストレージ容量が増加します。 我々は持っています NCache そのためのパーティションおよびパーティションレプリカトポロジ。 また、リードスルー/ライトスルーを使用すると、キャッシュ サーバーがデータのソースとなり、データベースへの負担が軽減されます。
データのパーティショニングとリードスルー/ライトスルーの詳細については、次の XNUMX つのガイドを参照してください。 パーティション化されたパーティションとパーティションレプリカのトポロジ & データソースプロバイダー キャッシュ用。 これら XNUMX つのキャッシュ パターンを活用してアプリケーションを拡張したい場合は、次のようにします。 NCache 試してみます。