2011-11-26 30 views
6

हम अपने एएसपीनेट एप्लिकेशन के लिए सार्वभौमिक वस्तुओं के कैशिंग को संभालने के लिए निम्न पैटर्न का उपयोग कर रहे हैं।मैं एसिंच्रोनस कैशिंग कैसे कार्यान्वित करूं?

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 
} 

समस्या यह है कि लोड (~ 100,000 उपयोगकर्ताओं) के तहत हम जब तक यह डेटाबेस से कैश ताज़ा समाप्त हो गया है को क्रियान्वित करने से अन्य सभी धागे CacheItemUpdateCallback ब्लॉक के रूप TTFB में एक विशाल कूद देखते हैं।

तो मुझे लगा कि हमें क्या चाहिए, यह समाधान है कि जब कैश की समाप्ति के बाद पहला धागा इसे एक्सेस करने का प्रयास करता है, तो कैश को अपडेट करने के लिए एक एसिंक्रोनस थ्रेड निकाल दिया जाता है लेकिन फिर भी अन्य सभी निष्पादित थ्रेड पुराने से पढ़ने की अनुमति देता है कैश जब तक यह सफलतापूर्वक अद्यतन नहीं किया जाता है।

क्या .NET ढांचे में कुछ भी बनाया गया है जो मैं जो पूछ रहा हूं उसे मूल रूप से संभाल सकता हूं, या मुझे इसे स्क्रैच से लिखना होगा? आपके विचार करें ...

योग्य कुछ बातें ...

HttpContext.Current.Cache के उपयोग के आकस्मिक और जरूरी आवश्यक नहीं है कि हम करने के लिए एक सिंगलटन पर निजी सदस्यों का उपयोग कर कोई समस्या नहीं मिल गया है के रूप में कैश डेटा पकड़ो।

कृपया कैश के समय, एसपीआरओसी effeciency पर टिप्पणी न करें, क्यों हम पहली जगह में कैशिंग कर रहे हैं क्योंकि यह रिलीज़ नहीं है। धन्यवाद!

उत्तर

0

तो यह जांच है कि समस्या CacheItemUpdateCallback अन्य धागे अवरुद्ध के रूप में मैं मूल रूप से सोचा नहीं है के कई घंटे के बाद पता चला है, वास्तव में यह था कि वास्तव में क्या मैं इसे करना चाहता था अतुल्यकालिक रूप से लेकिन यह कचरा कलेक्टर LOH को साफ करने के लिए सबकुछ रोक रहा था।

+0

और समाधान था? – orjan

+0

ऑब्जेक्ट्स को स्टोर करने के लिए इस पैटर्न का उपयोग न करें जो बाद में LOH पर समाप्त हो सकता है। –

संबंधित मुद्दे