現在、大量のデータベース呼び出しに依存するユーザーアプリケーションのほとんどは、パフォーマンスと線形スケーラビリティを向上させるために分散キャッシングを組み込んでいます。 この目的のために、ユーザーは、データベースで変更が発生するたびに、変更がすぐにキャッシュにも反映されることを望んでいます。 NCache インメモリ分散キャッシュであるため、キャッシュ内のデータを最新の状態に保つための同様の目的のためのさまざまな手法が提供されます。
まず、 NCache は、大阪で 満了 ここで、データは事前定義された間隔の後にキャッシュから自動的に削除されます。 第二に、 データベースへのキャッシュの依存関係 キャッシュ内のデータはデータベースとの同期を維持し、変更されるたびに無効になります。 同様に、別のメカニズムがあります キャッシュリフレッシャー これは、スケジュールされた間隔でバックグラウンドで実行され、データを最新の状態に保ち、制御された方法で更新されます。
このブログは、Cache Refresherのさまざまな戦略と、キャッシュ内のデータを最新の状態に保つ方法について説明しています。
NCache 詳細 有効期限ドキュメント キャッシュローダーとリフレッシャー
キャッシュリフレッシャー:概要と概念
ユーザーがビデオストリーミングチャネルを実行し、それぞれのビデオとともにいくつかの新しい情報をキャッシュにキャッシュしたとします。 長期間、キャッシュ内のビデオは変更されませんが、何らかの理由で、特定の新しいビデオが追加され、他のビデオがデータベースで更新されます。 これにより、ユーザーはすでに更新されている古いビデオ(古いデータ)を見ることができます。
NCache は、大阪で キャッシュリフレッシャー 特定の更新間隔でデータを更新することにより、キャッシュ内のデータを最新の状態に保つ機能. キャッシュデータの更新には、データソースでデータが変更されるたびに、キャッシュデータを追加、更新、および削除することが含まれます。
キャッシュリフレッシャーを構成するには、ユーザーは最初に実装する必要があります キャッシュスタートアップローダー。 このローダーは、並列処理を実現するためにさまざまなタイプのデータをグループ化する方法を表すデータセットの形式で、キャッシュの起動時にキャッシュにデータをプリロードするために使用されます。 キャッシュが開始するたびに、キャッシュローダーは構成されたデータセットに対してデータソースからデータを自動的にフェッチします。 このプリロードされたデータを最新の状態に保ち、データソース内の更新されたデータと同期させるために、キャッシュリフレッシャーが使用されます。キャッシュリフレッシャーは、スケジュールされた時間間隔の後にこれらのデータセットを個別に更新します。
キャッシュリフレッシャーのさまざまなプロパティ
実装を開始する前にユーザーが知っておく必要のあるキャッシュリフレッシャーのプロパティがいくつかあります。 以下に説明するのは、覚えておく必要のある詳細です。
- データセット: データセットは、ユーザーがさまざまなタイプのデータをグループ化して、並列処理を実現するためにさまざまな間隔またはイベントで個別にデータをロードまたは更新できるようにする方法です。
- データセットのスケジューリング: データセットは、データセットのスケジュールに従って更新されます。 このスケジュールは次のようになります。 毎日の時間、毎日の間隔、毎週 & 月単位。 これらはすべて、独自の実装で、データセットを更新する必要がある正確な時間を決定します。 各データセットには、独自の更新スケジュールを設定できます。 例としては、データセットに関するビデオを更新することができます ベーカリー製品 毎月日曜日の正午。 詳細については、を参照してください。 ドキュメントでのデータセットのスケジューリング.
- 更新間隔: これは、スレッドが実行されて、スケジュールされた時刻に達したときに更新の準備ができているデータセットをチェックする間隔です。 各データセットには異なるスケジュールされた更新間隔がありますが、この間隔はキャッシュレベルで同じままです。 この間隔は、それぞれ最小15分と最大60分に設定できます。
キャッシュローダーとリフレッシャードキュメント キャッシュ依存関係ドキュメント
キャッシュリフレッシャーを実装する方法は?
キャッシュリフレッシャーを使用して実装するには、最初にユーザーが構成する必要があります Iキャッシュローダー インターフェース。 第二に、 NCache 実装されたLoadDatasetOnStartupメソッドを呼び出して、データをキャッシュにロードします。 次に、RefreshDatasetメソッドを使用して、キャッシュローダーによってキャッシュにロードされたデータを更新します。
ユーザーがデータベースにXNUMXつのビデオを持っていると仮定します。XNUMXつはベーカリー製品のリグレードで、もうXNUMXつは衣料品です。. 次の実装では、ビデオをキャッシュにプリロードしてから、更新のために両方の個別の更新間隔でデータを更新します。
キャッシュと接続を初期化する
接続を構成するために、キャッシュの起動時にinitメソッドが呼び出されます。 以下はのサンプル実装です その中に ICacheLoaderインターフェースのメソッド。 ここでは、SQL接続を開き、ユーザーが指定した名前でキャッシュを初期化します。
1 2 3 4 5 6 7 8 |
public void Init(IDictionary<string, string> parameters, string cacheName) { string connectionString = parameters["connectionString"] as string; connection = new SqlConnection(connectionString); connection.Open(); cache = CacheManager.GetCache(cacheName); } |
データセットをキャッシュにロードする
XNUMX番目のステップでは、ユーザーは LoadDatasetOnStartup, キャッシュの起動時に呼び出されるメソッド。指定されたデータセットをデータベースからキャッシュにロードして、キャッシュを事前に入力します。
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 |
public object LoadDatasetOnStartup(string dataset) { // Create a list of datasets to load at cache startup IList<object> datasetToLoad; switch (dataSet.ToLower()) { // If dataset is "products", fetch products from data source to load in cache case "products": datasetToLoad = FetchProductsFromDataSource(); // Insert fetched product in the cache foreach (var product in datasetToLoad) { string key = $"ProductID:{product.Id}"; cache.Insert(key, product); } break; default: // Invalid dataset } // User context is the time at which datasets were loaded in the cache object userContext = DateTime.Now; return userContext; } |
ロードされたデータセットを更新する
第三に、定期的にデータセットを更新するには、ユーザーは次の実装を提供する必要があります データセットの更新。 ここで、ユーザーは、キャッシュローダーによってロードされた既にプリロードされたデータを更新するか、新しいデータを追加するか、その特定のデータセットからデータを削除する必要があります。
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 |
public object RefreshDataset(string dataset, object userContext) { *DateTime? lastRefreshTime; switch (dataset.ToLower()) { // If dataset is "bakery products", fetch updated products from data source case "bakery products": lastRefreshTime = userContext as DateTime?; IList<Product> productsToRefresh = FetchUpdatedProducts(lastRefreshTime) as IList<Product>; // Insert updated products in the cache foreach (var product in productsToRefresh) { string key = $"ProductID:{product.Id}"; CacheItem cacheItem = new CacheItem(product); _cache.Insert(key, cacheItem); } break; default: // Invalid dataset } // User context is the time at which datasets were refreshed userContext = DateTime.Now; return userContext; } |
ポーリングベースのリフレッシャーを実装する
さて、メソッドが来ます データセットを取得して更新する, これは更新間隔ごとに呼び出され、ユーザーが独自のカスタムロジックを使用して、ロードされたさまざまなデータセットの更新時間を制御する場合にのみ提供する必要があります。 返されたデータセットは、すぐに更新されるか、指示された同じ日に更新されます。
データセットをオンデマンドで更新
最後に、ユーザーは、実行時に事前構成されたデータセットを更新するオプションもあります。 呼び出す-RefreshDataset コマンドレット。 ここでは、データセットをすぐに更新することも、24時間以内に更新することもできます。 RefreshPreference
オプション。 データセット製品がすぐに更新される例を以下に示します。 demoClusteredCache
サーバー20.200.20.11。
1 |
Invoke-RefresherDataset -CacheName demoClusteredCache -Server 20.200.20.11 -Dataset product -RefreshPreference RefreshNow |
キャッシュローダーとリフレッシャーを構成する NCache Webマネージャ
ユーザーがCacheStartupLoaderとRefresherを実装すると、Web Managerを介して構成し、要件に応じて更新間隔を設定できます。 以下はそれがどのように行われるかです。
キャッシュローダーとリフレッシャーを構成する データの有効期限の構成
ブログを締めくくる!
最後になりますが、これまでに説明したことはすべて、キャッシュを効率的に更新する必要があることを示しており、キャッシュリフレッシャーがそれを行うための最良の方法です。 非常に体系的な方法でデータベースに変更が発生した場合、キャッシュデータを更新します。 キャッシュリフレッシャーと同じように、 NCache 不便を感じることなく実行できる多くの興味深い機能を提供します。 詳細については、当社のWebサイトをご覧ください。
NCache 詳細 ダウンロード NCache エディションの比較