2012-01-21 20 views
3

過去の私はAzure Cachingで作業していました。分散キャッシュへのラウンドトリップを防ぐために、ローカルキャッシュ機能を使用することをお勧めします。Azureローカルキャッシュと分散キャッシュ

マニュアルに記載されているとおりです。 dataCache.Get(...)を呼び出すと、アプリケーションはまずローカルキャッシュ内のバージョンが使用可能かどうかをチェックし、そうでない場合はオブジェクトを分散キャッシュから取得します。 問題は、ローカルバージョンがオブジェクトの分散バージョンより古い可能性があることです。この問題を解決するために、 'dataCache.GetIfNewer(...)'メソッドを使用して、ローカルオブジェクトのバージョンが配布されたバージョンと異なるかどうかを確認し、存在する場合は新しいオブジェクトを返します。

これまでのところ、とても良い...今、私の質問です。 Azure Cachingメカニズムをテストするために2つの別個のアプリケーション(app A en app B)を作成しました。両方のアプリケーションは2つの異なる(物理的な)場所で実行されるため、どちらも独自のローカルキャッシュを持ちますが、どちらも同じ分散キャッシュを使用します。

ローカルキャッシュを無効にする過程で何かが変更されたことは本当ですか?私は、次のシナリオをテストし、ローカルキャッシュが自動的に更新されることが判明しました:

  • アプリケーションAは、キー「CacheTest」を使用して分散キャッシュに値「123」を記憶
  • のApp Bはデータキャッシュを使用しています.Get(...)メソッドを使用してローカルキャッシュ内に見つからないキー "CacheTest"を取得し、分散キャッシュから取得すると、値 "123"のオブジェクトが返されます。
  • App Aは、キー "CacheTest"を持つオブジェクトを値 "456"に変更します。
  • App Bはdatacache.Get(...)メソッドを使用してオブジェクトを取得します。オブジェクトはローカルキャッシュになければならないので、私は値 "123"を期待しますが、新しい値 "456"を返します!

どのように奇妙ですか? Azure Cachingで何か変更されていますか?そしてはい...私はローカルキャッシュを有効にしていると確信しています。はい、ローカルキャッシュのタイムアウトを3600秒(1時間)に設定しました。

Azureのキャッシュが変更されたことを誰かが確認できますか?

ニックの編集: オランダのMicrosoftサイトで見つけた次のコード行はナンセンスなのですか?ローカル・キャッシュが自動的に更新されると、「GetIfNewer」メソッドを呼び出す必要はありません:http://www.dotnetmag.nl/Artikel/1478/Windows-Azure-AppFabric-Caching

/// 
/// Ensures that the newest version of a cached object is returned 
/// from either the local cache or the distrbuted cache. 
/// 
public TCachedObjectType GetNewest<TCachedObjectType>(string key) : 
    where TCachedObjectType : class 
{ 
DataCacheItemVersion version; 

// Gets cached object from local cache if it exists. 
// Otherwise gets cached object from distributed cache and 
// adds it to local cache. 
object cachedObject = cache.Get(key, out version); 

// Gets cached object from distributed cached if it is newer 
// than given version. 
// If newer it adds it to local cache. 
object possiblyNewerCachedObject = 
    cache.GetIfNewer(key, ref version); 

if (possiblyNewerCachedObject != null) 
{ 
    // Cached object from distributed cache is newer 
    // than cached object from local cache. 
    cachedObject = possiblyNewerCachedObject; 
} 

return cachedObject as TCachedObjectType; 
} 

答えて

1

説明した動作がAppFabricの速度と同じである場合、期待通り説明した動作です。ローカルキャッシュを有効にすると、あるノードが分散キャッシュからキャッシュ項目を要求すると、分散キャッシュに現在のバージョンを問い合わせます。 ローカルにキャッシュされたバージョンが分散バージョンと一致する場合、ローカルキャッシュからデータを返します。そうでない場合は、分散キャッシュから最新の値を取り出し、ローカルにキャッシュしてから返します。 アイデアは、いずれかのノードがキーを更新すると、appfabricがすでにローカルにキャッシュしていても、すべてのノードが常に最新のバージョンを取得できることです。分散キャッシュは、最新バージョンとそのデータの格納場所を追跡します。

+0

ありがとう、ニック、私の質問に追加したラインはナンセンスですか? –

+0

私は確信していません、私のプロジェクトでは、私達は穏やかな速度(紺色ではない)を使用しています。ローカルキャッシュを有効にしました。私たちは 'getifnewer'ではなくgetを使用します。getコールは常にappfabric分散キャッシュ・クラスタに送られますが、ローカル・キャッシュが使用可能になっているため、ローカル・キャッシュに現行バージョンがすでに存在する場合、フル・キャッシュ・キー値オブジェクトをクラスタから直列化し直す必要はありません。たとえば、私は特定のバージョンのキャッシュクラスタを要求しないでしょう、私はちょうどキーとappfabricクライアントは、必要に応じてローカルキャッシュから取得/保存するかどうかを尋ねるでしょう。 –

+0

私はちょうどオランダのサイトを見ました。私の答えは正しいと思いますが、アーカイブしようとしていることは少し異なります。バージョンを渡してGetIfNewerを呼び出すことによって、バージョンがまだ最新の場合、参照渡しされたオブジェクトは保持されます(そしてローカルの変更が保持されます)。一方Getを呼び出すと、常に新しいオブジェクトが戻されます。それはあなたが必要とするものによって異なります。 –

関連する問題