2011-11-26 14 views
6

次のパターンを使用して、asp.netアプリケーション用の汎用オブジェクトのキャッシュを処理しています。非同期キャッシングを実装するにはどうすればよいですか?

private object SystemConfigurationCacheLock = new object(); 
public SystemConfiguration SystemConfiguration 
{ 
    get 
    { 
     if (HttpContext.Current.Cache["SystemConfiguration"] == null) 
      lock (SystemConfigurationCacheLock) 
      { 
       if (HttpContext.Current.Cache["SystemConfiguration"] == null) 
        HttpContext.Current.Cache.Insert("SystemConfiguration", GetSystemConfiguration(), null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration, new CacheItemUpdateCallback(SystemConfigurationCacheItemUpdateCallback)); 
      } 
     return HttpContext.Current.Cache["SystemConfiguration"] as SystemConfiguration; 
    } 
} 

private void SystemConfigurationCacheItemUpdateCallback(string key, CacheItemUpdateReason reason, out object expensiveObject, out CacheDependency dependency, out DateTime absoluteExpiration, out TimeSpan slidingExpiration) 
{ 
    dependency = null; 
    absoluteExpiration = DateTime.Now.AddMinutes(1); 
    slidingExpiration = Cache.NoSlidingExpiration; 
    expensiveObject = GetSystemConfiguration(); 
} 

private SystemConfiguration GetSystemConfiguration() 
{ 
    //Load system configuration 
} 

問題は、負荷(〜10万ユーザー)の下で、我々はCacheItemUpdateCallbackブロックとして、それがデータベースからキャッシュをリフレッシュ完了するまで実行から他のすべてのスレッドをTTFBで巨大なジャンプを見たとき。

私が必要と思ったのは、キャッシュの有効期限が切れた後の最初のスレッドがキャッシュにアクセスしようとすると、非同期スレッドがオフになってキャッシュを更新するが、他のすべての実行スレッドは古いキャッシュが正常に更新されるまでキャッシュします。

私が求めていることをネイティブに処理できる.NETフレームワークには何かが組み込まれていますか、それともゼロから書き直す必要がありますか?あなたの考えてください...

物事のカップル...

我々はにシングルトンにプライベートメンバーを使用しても問題を持っていないてきたようにHttpContext.Current.Cacheの使用は必須偶発ありませんキャッシュされたデータを保持します。

キャッシュ時間、SPROC効率、最初の場所にキャッシングしている理由などはコメントしないでください。ありがとう!

答えて

0

だから、実際には、私はそれが非同期的に望んでいた正確に何をした、私が当初考えていたような問題は、他のスレッドをブロックしCacheItemUpdateCallbackではないことを調査の数時間後に判明したが、ガベージコレクタがLOHをクリーンアップするためにすべてを止めていました。

+0

そして解決策は? – orjan

+0

このパターンを使用して、後でLOHになる可能性のあるオブジェクトを格納しないでください。 –

関連する問題