2012-12-21 42 views
8

मैं एचटीपी कैश और सिंगलटन दृष्टिकोणों को समझने में थोड़ा उलझन में हूं।एचटीपी कैश बनाम सिंगलटन - एक एमवीसी अनुप्रयोग के लिए सर्वश्रेष्ठ अभ्यास

मेरा एप्लिकेशन Asp.net एमवीसी का उपयोग करता है और परिदृश्य यह है कि, मेरे पास डेटा की कुछ सूची है जो कभी नहीं बदलेगी और कुछ डेटा जो शायद ही कभी बदल सकते हैं।

मैंने इस प्रकार के डेटा के लिए सिंगलटन रिपोजिटरी का उपयोग करके एप्लिकेशन विकसित और तैनात किया है। यह बहुत अच्छा प्रदर्शन करता है। एकमात्र मुद्दा यह है कि जब एक दुर्लभ मामला होता है, तो मुझे प्रभावी होने के लिए आईआईएस को पुनरारंभ करना होगा।

सबसे अच्छा समाधान क्या है।

सिंगलटन कार्यान्वयन

public class SingletonRepository : ISingletonRepository 
    { 
     private static SingletonRepository singleInstance; 

     private readonly IStateRepository stateRepo; 
     private readonly ICountryRepository countryRepo; 
     private readonly ITDPaymentModeRepository paymentModeRepo; 
     private readonly ITDPlanRepository planRepo; 
     private readonly ITDOrderTypeRepository orderTypeRepo; 
     private readonly IKeywordRepository keywordRepo; 
     private readonly IAgencyRepository agencyRepo; 

     private readonly IList<AT_STATE> lstState; 
     private readonly IList<AT_COUNTRY> lstCountry; 
     private readonly IList<TDPaymentMode> lstPaymentMode; 
     private readonly IList<TDPlan> lstPlan; 
     private readonly IList<TDOrderType> lstOrderType; 
     private readonly IList<Keyword> lstKeyword; 
     private readonly IList<Agency_MST> lstAgency; 

     private SingletonRepository() 
     { 
      stateRepo = new StateRepository(); 
      countryRepo = new CountryRepository(); 
      paymentModeRepo = new TDPaymentModeRepository(); 
      planRepo = new TDPlanRepository(); 
      orderTypeRepo = new TDOrderTypeRepository(); 
      keywordRepo = new KeywordRepository(); 
      agencyRepo = new AgencyRepository(); 

      lstState = stateRepo.GetAll().Where(x => x.CountryId == 101).ToList(); 
      lstCountry = countryRepo.GetAll().ToList(); 
      lstPaymentMode = paymentModeRepo.GetAll().ToList(); 
      lstPlan = planRepo.GetAll().ToList(); 
      lstOrderType = orderTypeRepo.GetAll().ToList(); 
      lstKeyword = keywordRepo.GetAll().ToList(); 
      lstAgency = agencyRepo.GetAll().ToList(); 

      //lstState = stateRepo.GetAll().Take(20).ToList(); 
      //lstCountry = countryRepo.GetAll().Take(20).ToList(); 
      //lstPaymentMode = paymentModeRepo.GetAll().Take(20).ToList(); 
      //lstPlan = planRepo.GetAll().Take(20).ToList(); 
      //lstOrderType = orderTypeRepo.GetAll().Take(20).ToList(); 
      //lstKeyword = keywordRepo.GetAll().Take(20).ToList(); 
      //lstAgency = agencyRepo.GetAll().Take(20).ToList(); 
     } 

     public static SingletonRepository Instance() 
     { 
      return singleInstance ?? (singleInstance = new SingletonRepository()); 
     } 

     public IList<AT_STATE> GetState() 
     { 
      return this.lstState; 
     } 
     public IList<AT_COUNTRY> GetCountry() 
     { 
      return this.lstCountry; 
     } 

     public IList<TDPaymentMode> GetPaymentMode() 
     { 
      return this.lstPaymentMode; 
     } 

     public IList<TDPlan> GetPlan() 
     { 
      return this.lstPlan; 
     } 

     public IList<TDOrderType> GetOrderType() 
     { 
      return this.lstOrderType; 
     } 

     public IList<Keyword> GetKeyword() 
     { 
      return this.lstKeyword; 
     } 

     public IList<Agency_MST> GetAgency() 
     { 
      return this.lstAgency; 
     }  

    } 

}

+0

आपका सिंगलटन कैसे कार्यान्वित किया जाता है? क्या यह सिर्फ डेटा को स्मृति (वर्ग के सदस्यों के रूप में) में संग्रहीत करता है? उपयोगकर्ताओं को प्रदर्शित करने के लिए आपको शायद ही कभी बदले गए डेटा परिवर्तनों के बाद आईआईएस को पुनरारंभ करना होगा? – danludwig

+0

हां, डेटा IList ऑब्जेक्ट में संग्रहीत है। और आईआईएस पुनरारंभ करने के बाद ही परिवर्तन प्रतिबिंबित होते हैं। –

उत्तर

8

सिंगलटन पद्धति का उपयोग कर के प्रयोजन के आम तौर पर स्थिर डेटा भंडारण के लिए नहीं है। आपको सिंगलटन का उपयोग करना चाहिए जब आप केवल एक ऑब्जेक्ट इंस्टेंस को कुछ क्रियाएं करने में सक्षम होना चाहते हैं। यह तेज़ हो सकता है, लेकिन जैसा कि आप देख सकते हैं, जब डेटा बदलता है, तो आपको नया डेटा प्राप्त करने के लिए ढेर को रीसेट करना होगा (जैसा कि आप कहते हैं, आईआईएस को पुनरारंभ करके)।

एचटीपी कैश (अधिक विशेष रूप से, ऑब्जेक्ट कैश जो एचटीपी कैशिंग डिफ़ॉल्ट रूप से उपयोग करता है), डेटा को हीप के समान स्थान पर संग्रहीत करता है: रैंडम एक्सेस मेमोरी में। तो, यह ढेर पर कक्षा या उदाहरण में संग्रहीत स्थिर डेटा जितना तेज़ है। अंतर यह है कि आप समय-समय पर बाँधने के लिए कैश सेट कर सकते हैं, ताकि जब डेटा बदलता है तो उसे नया डेटा मिल जाएगा। आप SqlCacheDependencies को भी सेट अप कर सकते हैं ताकि जब भी आपके डेटाबेस का राज्य बदल जाए तो कैश खराब हो जाता है।

कैश का एक अन्य लाभ यह है कि यह आपके सर्वर के राम संसाधनों का अधिक कुशलता से उपयोग करता है। आपके सिंगलटन के साथ, कोई फर्क नहीं पड़ता कि, यह डेटा हमेशा स्मृति पर कब्जा कर रहा है, भले ही डेटा का उपयोग नहीं किया जा रहा हो। कैश के साथ, जब सर्वर का उपयोग किया जा रहा है तो सर्वर केवल स्मृति में डेटा संग्रहीत करता है। कैश के साथ नुकसान यह है कि कभी-कभी, जब उपयोगकर्ता कैश की अवधि समाप्त हो जाने के बाद डेटा का अनुरोध करता है तो यहां एक धीमी प्रतिक्रिया प्राप्त होगी। हालांकि, उनके बाद, अन्य उपयोगकर्ताओं को एक समय के लिए कैश किए गए डेटा से लाभ होगा।

+1

मैंने अभी सिंगलटन का उपयोग किया क्योंकि मैं किसी भी अवांछित कास्टिंग नहीं चाहता जो प्रदर्शन को ओवरहेड करता है। तो बस सभी सूची वस्तुओं को स्मृति में डाल दें। लेकिन मुझे लगता है कि रीडोनली लिस्ट का उपयोग करने के बजाय, मैं डेटा परिवर्तनों और मेरे सूची डेटा को संशोधित करने के लिए हैंडल लिखने के लिए मुझे सूचित करने के लिए कैश्ड निर्भरता का उपयोग करके संकर दृष्टिकोण का उपयोग कर सकता हूं .. कृपया सही करें। –

+0

इसका उत्तर वही है जो मैं भी ढूंढ रहा हूं। –

3

आप वास्तव में इस जैसे एक रीलोड विधि बनाने के द्वारा सिंगलटन को फिर से लोड कर सकते हैं:

public static void ReloadSingletonRepositoryInstance() 
{ 
    singleInstance = null; 
    SingletonRepository sr = SingletonRepository.Instance; 
} 

आशा है कि मदद करता है।