ネイティブ データ構造は、データを保存および取得する従来の方法を提供します。 これらの実装を通じて、スタンドアロン アプリケーションに同時実行性が提供されます。これは素晴らしいことですが、アプリケーション プロセス内のスレッドにのみ制限される点が異なります。 また、複数のサーバー上で実行されるスケーラブルなアプリケーションでは、アプリケーション間でデータ構造の状態を共有する必要性が生じます。
ここで、分散データ構造が介入します。分散データ構造は、従来のデータ構造の機能を提供しながら、複数のプロセスとアプリケーション インスタンスが、データの一貫性を損なうことなく、同時にデータの追加、フェッチ、削除を行うことができます。 これらのデータ構造は、従来のデータ構造では解決できなかった問題を解決します。 これらにより並列計算が可能になります。
どこでやる NCache 適合する?
NCacheはメモリ内キャッシュ ソリューションであり、分散データ構造が提供するすべての機能を強化します。 使用する NCache 分散キャッシュにより、プロセス外のスレッドから構造化データにアクセスできるようになります。
データを分散データ構造に追加し、任意のサーバーにキャッシュして、データが保存されているサーバーに関係なく、システムの一部であるすべてのアプリケーション、プロセス、インスタンスからデータにアクセスできるようになったことに驚かされます。
あげくの果てに、 NCache パーティション化されたレプリカ トポロジの形式で高可用性を提供します。 キャッシュ サーバーに保存されているデータは、当然のことながら、あなたにとって重要です。 サーバー障害が原因でこのデータが失われることは、いかなる場合であっても容認できません。 まさにこれが理由です NCache データのレプリカをキャッシュ サーバーに保持できるため、ノードの XNUMX つがダウンした場合でも、そのようなシナリオで使用できるまったく同じデータの複製セットが常に残ります。 こうすることで、.NET アプリケーションでデータが失われることはありません。 これに加えて、要件に応じて実行時にキャッシュ サーバー ノードを追加する権限を持ちます。
NCache データ構造内にカプセル化されたデータの複製、分割、スケーリングの機能を提供します。 したがって、これらのデータ構造を使用する開発者は、.NET アプリケーション内の配布ロジックについて心配する必要はありません。
の分散データ構造 NCache
NCache .NET アプリケーションでスケーラビリティ、同時実行性、および正確性を実現するためのさまざまなデータ構造を提供します。 アプリケーションの全体的なパフォーマンスを向上させるこれらのデータ構造を見てみましょう。
分散リスト
NCache は、大阪で 分散リスト これは、IList インターフェイスのネイティブ .NET 実装です。 NCache ネイティブの .NET キャッシュ ソリューションであること自体が、アプリケーションが .NET ベースのみの場合にもメリットがあります。 .NET アプリケーションにとって、ネイティブで快適なすべてのものよりも優れたものはありません。
次のコード スニペットは、分散リストを作成、設定、および削除する方法を示しています。 NCache.
リストを作成して入力する XNUMX つのアプリケーション:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Specify unique cache key for list string key = "ExpensiveProducts"; DataTypeAttributes dataTypeAttributes = new DataTypeAttributes(); dataTypeAttributes.Expiration = new Expiration(ExpirationType.Sliding, new TimeSpan(0, 2, 0)); // Create list of Product type IDistributedList<Product> list = cache.DataTypeManager.CreateList<Product>(key, dataTypeAttributes); // Get products to add to list Product[] products = FetchProductsFromDB(); foreach (var product in products) { // Add products to list list.Add(product); } |
中止された製品を取得してリストから削除する別のアプリケーション
1 2 3 4 5 6 |
// Get list of Product type IDistributedList<Product> list = IDistributedList <Customer> list = cache.DataTypeManager.GetList<Product>("ExpensiveProducts"); // Get range of discontinued products to be removed List<Product> itemsToRemove = FetchDiscontinuedProducts(); list.RemoveRange(itemsToRemove); |
分散リストを日常のアプリケーションに組み込むのは非常に簡単です。 以下に、分散リストの実装が必要なアプリケーションを示すシナリオの一部を示します。
ユースケース: ショッピングカート
.NET アプリケーションが電子商取引プラットフォームであると仮定します。 このアプリケーションでは、顧客はショッピング カートに商品を追加したり、ショッピング カートから商品を削除したりできます。 これらのリクエストが適切に処理されるようにするには、顧客の ID と、その ID に対して追加または削除される項目を含む各顧客のデータを保存する必要があります。 これを行う最良かつ最も組織的な方法は、分散リストを使用することです。
マルチサーバー環境での分散リストは、顧客のデータを保存し、すべてのサーバーで利用できるようにします。 このリストに、顧客が購入したすべてのアイテム、関心を示したアイテム、または無視したアイテムを追跡させることができます。 これにより、洗練された記録を維持することでアプリケーションの全体的な価値が向上するだけでなく、データの可用性が高くなります。
使用例: リーダーボード
ゲームに興味のある人にとって、リーダーボードは、オンライン ゲームであろうと世界規模の試合であろうと、重要な情報源として機能します。 これらの人々は、どのチームがリードしており、誰が遅れているかを常に知りたいと思っています。 このような情報は、リスト データ構造を使用して必要なデータを格納し、関心のあるすべてのユーザーにブロードキャストするアプリケーションに組み込むことができます。
分散キュー
NCache として知られる先入れ先出し実装を提供します。 分散キュー. キューは、その FIFO 動作により、実行時に貴重な情報を格納するために使用されます。
IDistributedQueue は、によって提供される理解しやすく実装しやすいデータ構造です。 NCache. 以下のコードを見て、キューの作成、キューへのデータの追加と削除など、キューの基本的な操作を理解してください。
XNUMX つのアプリケーションがキューを作成して追加する
1 2 3 4 5 6 7 8 9 |
string key = "CandidateQueue"; // Create Queue of Candidate type IDistributedQueue<Candidate> queue = cache.DataTypeManager.CreateQueue<Candidate>(key); foreach(var candidate in candidates) { // Add candidates to queue queue.Enqueue(candidate); } |
別のアプリケーションが分散キャッシュからキューをフェッチし、最初のアイテムをデキューします
1 2 3 4 |
IDistributedQueue<Candidate> queue = cache.DataTypeManager.GetQueue<Candidate>("CandidateQueue"); // Remove first item of queue var firstCandidate = queue.Dequeue(); |
以下に挙げるのは、分散キューの使用例の一部であり、キューを使用できる場所と、キューから得られるメリットの大まかなアイデアを提供します。
使用例: メッセージキュー
複数のサーバーでホストされ、複数のクライアントを同時に処理する .NET アプリケーションは、アプリケーションを使用しているいずれかのクライアントにメッセージを送信する必要があります。 あなたはここで何をしますか? 分散環境では、サーバーとクライアント間の接続を制御できません。つまり、どのサーバーがどのクライアントを処理しているのかがわかりません。
このようなシナリオでは、クライアントに配信する必要があるすべてのメッセージを追跡するために、分散キューが必要です。 このリストはすべてのキャッシュ サーバーに配布され、アプリケーションに接続されているすべてのクライアントが常に同じデータにアクセスできるようにします。 NCache 分散データの複製を処理します。 したがって、分散キャッシュで分散キューを使用すると、データの同時実行性と高可用性を実現できます。
ユースケース: 感情分析
諜報機関が脅迫的または機密のツイートを除外するために使用しているアプリケーションは、 NCache. Web アプリケーションを実行しているノードが複数あるとします。 必要なのは、これらのツイートを分散環境で、XNUMX つのツイートが XNUMX 回以上処理されないほどの精度で処理することです。 これを実現する方法は、そのアプリケーションが分散キューを使用してすべての着信ツイートを格納する場合です。 これにより、ツイートが XNUMX 回処理されることがなくなり、アプリケーションの全体的なパフォーマンスと精度が向上します。
分散ハッシュセット
NCache と呼ばれるセットの非常に高速かつスケーラブルな実装を提供します。 分散ハッシュセット. HashSet は、値が一意で独特な順序付けられていないデータ型です。
以下のコードを見て、HashSet を作成および設定する方法を理解しましょう。
ハッシュセットを設定する最初のアプリケーション
1 2 3 4 5 6 7 8 9 10 |
// Create unique keys for hashSets string mondayUsersKey = "UsersLoggedInOnMonday"; // Create hashSets of object type IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.CreateHashSet<string>(mondayUsersIds); // Add user IDs for Monday userSetMonday.Add("john_smith"); userSetMonday.Add("mike_cohn"); userSetMonday.Add("mike_ross"); |
XNUMX 番目のアプリケーションがハッシュセットを取得して変更する
1 2 3 4 5 6 |
// Getting hashset from cache IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.GetHashSet<string>("UsersLoggedInOnMonday"); // Remove user with given ID from the set userSetMonday.Remove("mike_cohn"); userSetMonday.RemoveRandom(); |
アプリケーションが本質的に固有のデータに対して操作を実行する必要がある場合は、分散 HashSet を使用できます。 ここでは、DistributedHashSet の実装によってパフォーマンスが向上するアプリケーションのシナリオをいくつか示します。
ユース ケース: IP アドレスの追跡
ハッシュセットには重複する値が含まれていないため、使用できます NCacheWeb サイトのすべてのユーザーと訪問者を追跡するための分散 HashSet の実装。 たとえば、オンライン書店を運営している場合、HashSets を使用すると、どのユーザーがどの本に興味を持ち、何冊の本を購入したかなどを非常に簡単に特定できます。
ユースケース: e コマースの売上の分析
必要な情報はすべて HashSet 内に保持できます。 HashSet に必要なのは、複数の値を割り当てるための一意の値だけです。 たとえば、オンライン ストア アプリケーションから何かを購入したすべてのユーザーを追跡したいとします。 顧客の ID が必要で、各 ID に対して、顧客が購入したアイテム、ウィッシュリストに追加されたアイテム、ウィッシュリストから削除されたアイテムのリストを保持したいとします。 すべての情報を洗練されたセットにまとめたので、それに対して複数の操作を非常に簡単に実行できます。
分散辞書
分散辞書 により提供さ NCache IDictionary インターフェイスのネイティブ .NET 実装であるキーと値のペアです。 ディクショナリは特定のキーに対する値を保持し、その値を変更する必要がある場合は、それをオーバーライドする必要があります。
IDistributedDictionary を使用できます NCache 製品の記録を残すため。 次の方法で、辞書への製品情報の作成と追加/削除ができます。
辞書を作成して入力する最初のアプリケーション
1 2 3 4 5 6 7 8 9 10 11 12 |
string key = "ExpensiveProducts"; // Create dictionary of Product type IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.CreateDictionary<string, Product>(key); // Adding products to dictionary Product[] products = FetchProducts(); foreach(var product in products) { string productKey = $"Product:{product.ProductID}"; dictionary.Add(productKey, product); } |
XNUMX 番目のアプリケーションによる辞書の取得と変更
1 2 3 4 5 6 7 8 9 10 11 |
// Fetch dictionary of Product type from cache IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.GetDictionary<string, Product>("ExpensiveProducts"); // Create list of keys to remove List<string> keysToRemove = FetchDiscontinuedProducts(); // Get values from dictionary against the given keys ICollection<Product> values = dictionary.Get(keysToRemove); // Remove items from dictionary with given keys int itemsRemoved = dictionary.Remove(keysToRemove); |
分散辞書は複数のケースで使用でき、それぞれのケースで非常に便利で効率的であることが証明されています。 そのような場合の例を以下に示します。
ユースケース: 暗号化された値をキャッシュに保存する
分散環境でディクショナリを使用することの多くの利点の XNUMX つは、暗号化キーを格納する必要がある場合です。 これらのキーは、その分散システムの一部であるすべてのサーバーで使用できる必要があります。 暗号化されたデータをキャッシュ サーバーの XNUMX つに辞書の値として、その復号化キーと共に格納します。 このようなことを行うと、将来そのデータを必要とする可能性のあるすべてのサーバーが、データだけでなくその復号化キーにもアクセスできるようになります。
ユース ケース: ログイン資格情報の保存
分散辞書は、ユーザーのログイン ID とパスワードを保存し、アクセスするための最も効率的な方法です。 複数のサーバーで実行されているアプリケーションがあり、そのアプリケーションでは、ユーザーが機密データにアクセスするためにセキュリティ資格情報の提供を要求されているとします。 アプリケーションに対応するすべてのサーバーがこの重要な情報にアクセスできるようにするために、これらの値をディクショナリのキーと値のペアとしてキャッシュできます。 これにより、XNUMX つのサーバーが新しいキーと値のペアをディクショナリに追加すると、他のサーバーはディクショナリ内で必要なデータを簡単に検索できるようになります。
分散カウンター
NCache は、大阪で Iカウンター 簡単に値をインクリメントおよびデクリメントするために使用されるデータ構造。 あなたの人生をより良くするために、 NCache データの一貫性を保つために、カウンター内に配置されたデータをロックできます。
.NET アプリケーションの場合、次のコードは、ICounter インスタンスを作成し、それにデータを入力し、その値をインクリメント/デクリメントする方法を理解するのに役立ちます。
初期値を使用してカウンタを作成する最初のアプリケーション
1 2 3 4 5 6 7 8 |
string key = "SubscriptionCounter"; long initialValue = 15; // Create counter ICounter counter = cache.DataTypeManager.CreateCounter(key, initialValue); // Set the initial value of counter to 100 counter.SetValue(100); |
XNUMX 番目のアプリケーションによるカウンターの取得と変更
1 2 3 4 5 6 7 8 |
// Create counter ICounter counter = cache.DataTypeManager.GetCounter("SubscriptionCounter"); // Increment value of counter counter.Increment(); // Decrement value of counter counter.Decrement(); |
数え切れないほどのシナリオでカウンターを使用できます。見回すだけで、見つかったほとんどすべての問題は、キャッシュ環境で分散カウンターを使用することで解決できます。 これらのシナリオの一部を次に示します。
使用例: ページビュー数
必要に応じて、Web ページが XNUMX 時間または XNUMX 日あたりに取得するビューの数を確認するには、分散カウンターを使用して簡単に実装できます。 NCache. 新しいビューごとに、それに応じてキャッシュ サーバーのカウンターが増分されます。 この値とすべてのキャッシュ サーバーに存在するすべての値は、一定時間後にデータベースで更新されます。 これを行うことで、データベースへの不必要なトリップを多数回避できるため、.NET アプリケーションの全体的なパフォーマンスが向上します。
使用例: ツイート分析
政治家や有名人のすべての重要なツイートをカウントするアプリケーションがあるとします。 また、ツイートに寄せられたいいね数や嫌い数、コメントなども追跡します。 さて、ある人がいるとしましょう。 A 彼のツイートと「いいね!」の数は 0 分以内に XNUMX から XNUMX 万に増加します。 これは、一時的ではないものの、永続化する必要がある種類のデータです。 ただし、永続化する必要がある速度は、データが更新される速度よりもはるかに遅いです。
これほど突然かつ頻繁な変更を記録するには、データの頻度でデータベースが停止しないようにする二次コンポーネントが必ず必要になります。 ここで必要なのは NCache。 インメモリ キャッシュは、情報を一時的に保存し、一定時間後にすべてをデータベースに書き込む必要がある場合に便利です。 ここで、いいね数のキャッシュを開始すると、 として データベース内の値を直接変更するのではなくツイートすることで、不要なネットワーク呼び出しを大幅に回避できます。
すべてを要約すると
単一層アーキテクチャの場合、分散データ構造はまったく必要ありません。 アプリケーション内で必要なデータ構造を保持および実装できます。 しかし、複数のサーバーに移動して、永続化する必要のない一時的なデータや、変更に非常にコストがかかるデータの処理を開始すると、データベースが停止し、パフォーマンスが低下します。 このような悲劇がアプリケーションに降りかかるのを避けるには、分散データ構造が必要です。 分散について話すときは、常に NCache 心の片隅で。
NCache 非常にスケーラブルであり、インメモリ ソリューションであるという事実により、すべてのデータ キャッシングの問題に対する最適なソリューションとなります。