3

過去数日間、私はAzureCachingを使用してきました。ローカルキャッシュ機能を使用して、分散キャッシュへのラウンドトリップを防ぐことをお勧めします。

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

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

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

  • アプリAは、キー「CacheTest」を使用して分散キャッシュに値「123」を格納します
  • アプリBはdataCache.Get(...)メソッドを使用して、ローカルキャッシュに見つからないキー「CacheTest」のオブジェクトを取得するため、分散キャッシュから取得され、値「123」のオブジェクトが返されます。
  • アプリAは、キー「CacheTest」を持つオブジェクトを値「456」に変更します
  • アプリBは、datacache.Get(...)メソッドを使用して(再び)オブジェクトを取得します。オブジェクトはローカルキャッシュにあるはずなので、値「123」を期待しますが、新しい値「456」を返します。

それはどれほど奇妙ですか?最近、Azure Cachingで何か変更がありますか?はい...ローカルキャッシュをオンにしたことは確かです。はい、ローカルキャッシュのタイムアウトを3600秒(1時間)に設定しました。

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

ニックのために編集:それで、あなたが言っているのは、私がオランダのマイクロソフトのサイトで見つけた次のコード行はナンセンスだということですか?ローカルキャッシュが自動的に更新される場合、「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;
}
4

1 に答える 1

1

説明されている動作が appfabric 速度と同じである場合、説明されている動作は予想どおりです。ローカル キャッシングが有効になっている場合、特定のノードが分散キャッシュからキャッシュ アイテムを要求したときに、分散キャッシュに現在のバージョンを問い合わせます。ローカルにキャッシュされたバージョンが配布されたバージョンと一致する場合、ローカル キャッシュからデータを返します。そうでない場合は、分散キャッシュから最新の値を取得し、ローカルにキャッシュしてから返します。いずれかのノードがキーを更新すると、たとえ appfabric がすでにそれらをローカルにキャッシュしていたとしても、すべてのノードが常に最新バージョンを取得できるようになるという考え方です。分散キャッシュは、最新バージョンとそのデータが保存されている場所を追跡します。

于 2012-01-21T14:24:16.047 に答える