NCache サーバー側の一連のキャッシング エントリに対して関数 (または「プロセッサ」) を実行できるエントリ プロセッサを導入します。
通常、キャッシュ エントリを更新するには、キャッシュ サーバーと XNUMX 回「対話」する必要があります。 XNUMX 回はキャッシュからエントリを取得し、もう XNUMX 回は処理後にエントリを更新します。 しかし、エントリ プロセッサを使用すると、キャッシュ エントリをサーバー上で直接更新することで、これらのネットワーク トリップとリソースの不要な消費を節約できます。
NCache 使用されているキャッシング トポロジに関係なく、エントリ プロセッサを実行します。 分割されたトポロジの場合、エントリ プロセッサは、処理するエントリを含むノードで実行されます。
Entry Processor を呼び出すと、定義したロジックに基づいて単一のアイテムまたは一連のアイテムが処理されます。 NCache クラスタ全体でプロセッサを実行します。 エントリ プロセッサ内では、次のことができます。
- 処理せずにキャッシュ エントリを返します。
- エントリを変更してキャッシュに保存するか、
- エントリを削除します。
プロセッサを実行する前にエントリがロックされている場合、ロックを無視し、ロックされたエントリにアクセスして処理できます。
NCache 詳細 NCache エントリープロセッサ エントリ プロセッサの実装
エントリ プロセッサと他のキャッシュ操作の比較
エントリ プロセッサは、キャッシュ エントリのフェッチと更新のネットワーク トリップを節約することで、サーバー上でキャッシュまたはエントリを直接更新または削除するのに役立ちます。
Entry Processor の動作を確認するために、一部の顧客をキャッシュにロードするコンソール アプリを作成してみましょう。 顧客の名前、ポイント、最終購入日を保存しましょう。 また、お客様の購買意欲を高めるために、過去 XNUMX 日間に購入したすべてのお客様のポイントを XNUMX 倍にしましょう。 次に、エントリ プロセッサとバルク キャッシュ操作を使用して同じシナリオを再作成し、これらのアプローチの実行時間の違いを見てみましょう。
サンプル アプリケーションを開始する前に、 NCache Enterprise エディション インスタンスが稼働中です。 エントリ プロセッサは、エンタープライズ エディションでのみ使用できます。
1.一括キャッシュ操作の使用
NCache XNUMX 回の呼び出しでキャッシュ エントリを同時に取得および更新する一括操作をサポートします。 一括操作を使用すると、キャッシュ サーバーへのネットワーク トリップの回数が減るため、パフォーマンスが向上します。
複数のキャッシュ エントリを一括で取得するには、 GetCacheItemBulk()
キーのリスト付き。 見つかった項目をディクショナリで返します。 また、アイテムを一括更新するには、 InsertBulk()
更新するアイテムのディクショナリを持つメソッド。
比較を開始するには、使用しましょう NCache GetCacheItemBulk()
および InsertBulk()
単一のリクエストでキャッシュ エントリを取得および更新するメソッド。
Program.cs
コンソールアプリのファイルに、次のように書きましょう。
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 |
using Alachisoft.NCache.Client; using RewardPoints; using RewardPoints.Shared; const string CacheName = "demoCache"; var customers = new List { new Customer(1, "Alice", DateTime.Today.AddDays(-1), 100), new Customer(2, "Bob", DateTime.Today.AddDays(-6), 5), new Customer(3, "Charlie", DateTime.Today.AddMonths(-1), 1), new Customer(4, "Daniel", DateTime.Today.AddDays(-3), 10), new Customer(5, "Earl", DateTime.Today, 20) }; var keys = customers.Select(c => c.ToCacheKey()); // Load customers into the cache ICache cache = CacheManager.GetCache(CacheName); PopulateCache(cache, customers); // Double customer points using NCache Bulk methods var retrievedItems = cache.GetCacheItemBulk(keys); var itemsToUpdate = new Dictionary<string, CacheItem>(); foreach (var item in retrievedItems) { var customer = item.Value.GetValue(); // Check if the customer has purchased anything in the last 5 days if (customer.LastPurchase >= DateTime.Today.AddDays(-5)) { var updated = customer with { Points = customer.Points * 2 }; itemsToUpdate.Add(updated.ToCacheKey(), updated.ToCacheItem()); } } cache.InsertBulk(itemsToUpdate); |
まず、何人かの顧客をキャッシュにロードしました。 実行中に作成されたデフォルトの「demoCache」キャッシュを使用しました。 NCache インストール。 次に、以下を使用して顧客を取得しました。 GetCacheItemBulk()
方法。 次に、すべての顧客の最終購入日を確認した後、ポイントを XNUMX 倍にし、更新されたすべての顧客をキャッシュに戻しました。
顧客を個別に更新する代わりに、ディクショナリを使用して報酬を獲得した顧客を蓄積しました。 次に、 InsertBulk()
辞書を使った方法。
GetCacheItemBulk()
および InsertBulk()
方法により、ネットワーク旅行を XNUMX 回だけに減らしました。 XNUMX 回のネットワーク呼び出しですべての顧客を取得し、もう XNUMX 回で顧客をキャッシュに保存します。
これらおよびその他のバルク方法の詳細については、以下を確認してください。 CRUD 操作: 概要。
2. エントリ プロセッサの使用
Bulk メソッドを使用したので、Entry Processor を使用して顧客の報酬ポイントを XNUMX 倍にしましょう。 このようなもの、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using Alachisoft.NCache.Client; using RewardPoints; using RewardPoints.Shared; const string CacheName = "demoCache"; var customers = new List { new Customer(1, "Alice", DateTime.Today.AddDays(-1), 100), new Customer(2, "Bob", DateTime.Today.AddDays(-6), 5), new Customer(3, "Charlie", DateTime.Today.AddMonths(-1), 1), new Customer(4, "Daniel", DateTime.Today.AddDays(-3), 10), new Customer(5, "Earl", DateTime.Today, 20) }; var keys = customers.Select(c => c.ToCacheKey()); // Load customers ICache cache = CacheManager.GetCache(CacheName); PopulateCache(cache, customers); // Double customer points using Entry Processor var processor = new DoublePointsProcessor(); cache.ExecutionService.Invoke(keys, processor); |
キャッシュ エントリを更新するためにメソッドを使用する必要がないことに注意してください。 プロセッサを作成し、一連のキーを渡して、 Invoke()
方法。 エントリ プロセッサ自体の内部で顧客を更新する必要があります。
NCache 詳細 NCache エントリープロセッサ エントリ プロセッサの実装
エントリ プロセッサの設定
エントリ プロセッサを作成するには、から継承するクラスを作成する必要があります。 IEntryProcessor
そして [Serializable]
属性。 これが私たちのエントリ プロセッサです。
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 |
using Alachisoft.NCache.Runtime.Processor; namespace RewardPoints.Shared; [Serializable] public class DoublePointsProcessor : IEntryProcessor { public bool IgnoreLock() => true; public object Process(IMutableEntry entry, params object[] arguments) { // Check if the cache entry is a customer and // if the customer has purchased something in the last 5 days if (entry.Key.StartsWith(nameof(Customer)) && entry.Value is Customer { LastPurchase: var lastPurchase } customer && lastPurchase >= DateTime.Today.AddDays(-5)) { // Update the customer's points var updatedCustomer = customer with { Points = customer.Points * 2 }; entry.Value = updatedCustomer; return updatedCustomer; } return false; } } |
プロセッサのキャッシュ エントリを更新するには、 Value
のプロパティ entry
パラメータと更新されたキャッシュ エントリ。
クライアント アプリケーションがエントリをロックしている場合は、 IgnoreLock()
方法。 ロックを無視し、エントリにアクセスして処理します。
新しいプロセッサを使用する前に、DLL をプロセッサとその依存関係と共にデプロイする必要があります。 NCache. Powershell を使用できます Install-NCacheModule
コマンドレットまたは NCache ウェブマネージャー。 Web Manager を使用してエントリ プロセッサをデプロイする手順については、以下を確認してください。 プロバイダーの展開.
たとえば、「demoCache」インスタンスを停止して、Powershell を実行してみましょう。 Install-NCacheModule
コマンドレット、
NCache 詳細 NCache エントリープロセッサ エントリ プロセッサの実装
エントリ プロセッサはどのように処理しますか 作戦失敗?
エントリ プロセッサが実行されると、次のタイプの結果のコレクションが返されます。 IEntryProcessorResult
. 各結果には IsSuccessful
旗と Value
私たちの修正の結果で。 サンプル エントリ プロセッサの場合、 Value
プロパティには次のいずれかが含まれます false
、顧客が最近の購入、または更新された顧客を持っていない場合、それ以外の場合。
エントリ プロセッサの実行中に例外がスローされた場合、 IsSuccessful
フラグになります false
と Exception
プロパティには、スローされた例外が設定されます。
エントリ プロセッサをフェイルセーフにするために、潜在的な例外を処理する必要があります。 たとえば、 OperationFailedException
接続障害が発生した場合。 また、
EntryProcessorException
、この場合、エントリ プロセッサはキャッシュ エントリを変更しませんでした。
これは、エントリの結果と考えられる例外メッセージを表示する方法です。
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 |
using Alachisoft.NCache.Client; using RewardPoints; using RewardPoints.Shared; const string CacheName = "demoCache"; var customers = new List { new Customer(1, "Alice", DateTime.Today.AddDays(-1), 100), new Customer(2, "Bob", DateTime.Today.AddDays(-6), 5), new Customer(3, "Charlie", DateTime.Today.AddMonths(-1), 1), new Customer(4, "Daniel", DateTime.Today.AddDays(-3), 10), new Customer(5, "Earl", DateTime.Today, 20) }; var keys = customers.Select(c => c.ToCacheKey()); // Load customers ICache cache = CacheManager.GetCache(CacheName); PopulateCache(cache, customers); try { // Double customer points using Entry Processor var processor = new DoublePointsProcessor(); var processedEntries = cache.ExecutionService.Invoke(keys, processor); foreach (IEntryProcessorResult entryResult in processedEntries) { DisplayEntryResult(entryResult); } } catch (EntryProcessorException e) { Console.WriteLine($"Error running the processor: {e.Message}"); } catch (OperationFailedException e) { Console.WriteLine($"Error connecting to the cache server: {e.Message}"); } |
それでは、XNUMX つの選択肢を並べて実行してみましょう。 私は自分のマシンでそれらを実行しました NCache ローカルにインストールし、私が生成した 20 のランダムな顧客を使用して 偽の. そして、これが結果です。
まとめ
間違いなく、エントリ プロセッサを使用した代替案が最も高速でした。 これは 12 ミリ秒で完了しましたが、バルク メソッドを使用したものは 72 ミリ秒で完了しました。 Entry Processor では、サーバー上で直接顧客のポイントを XNUMX 倍にすることで、過剰なネットワーク トリップをすべて節約したため、パフォーマンスの向上に気付きました。
それがエントリ プロセッサとその機能です。 これをテストするためのベンチマークは作成していませんが、 NCache この比較により、エントリ プロセッサの使用方法がわかります。 彼らと一緒に、私たちは私たちへの往復を節約します NCache サーバーでキャッシュエントリを直接処理することにより、 NCache サーバ。 次にキャッシュ エントリの一部を更新する必要がある場合は、エントリ プロセッサを試してみてください。
エントリ プロセッサの仕組みの詳細については、 キャッシュ内のエントリプロセッサの動作.
コードに従うには、この投稿に書いた、私のチェック NCache デモ リポジトリ GitHubで。