System.Runtime.Caching.MemoryCache बनाम HttpRuntime.Cache - क्या कोई मतभेद हैं?


84

अगर ASP.NET MVC प्रोजेक्ट्स में किसी एक को पसंद किया जाता है, तो दोनों के बीच कोई अंतर नहीं है MemoryCacheऔर मैं सोच रहा हूं HttpRuntime.Cache?

जहां तक ​​मैं समझता हूं, दोनों ही थ्रेड सुरक्षित हैं, एपीआई पहली नजर में कम या ज्यादा समान है, इसलिए उपयोग करने पर कोई अंतर है?

जवाबों:


80

HttpRuntime.CacheCacheवर्तमान आवेदन के लिए हो जाता है ।

MemoryCacheवर्ग ASP.NET के समान है Cacheवर्ग।

MemoryCacheवर्ग में कई गुण और कैश जिनसे आप परिचित अगर आप ASP.NET का इस्तेमाल किया है हो जाएगा तक पहुँचने के लिए तरीकों है Cacheवर्ग।

के बीच मुख्य अंतर HttpRuntime.Cacheऔर MemoryCacheहै कि बाद में यह .NET फ्रेमवर्क अनुप्रयोग जो ASP.NET अनुप्रयोगों नहीं हैं द्वारा प्रयोग करने योग्य बनाने के लिए बदल दिया गया है।

अतिरिक्त पढ़ने के लिए:

अपडेट करें :

यूजर्स के फीडबैक के मुताबिक, कभी-कभी जॉन डेविस ब्लॉग काम नहीं कर रहा है। मैंने पूरे आर्टिकल को इमेज के तौर पर रखा है। कृपया इसे देखें।

नोट: यदि यह स्पष्ट नहीं है, तो बस छवि पर क्लिक करें। इसके बाद यह एक ब्राउज़र पर खुल जाएगा। फिर ज़ूम करने के लिए फिर से क्लिक करें :)

यहाँ छवि विवरण दर्ज करें


जॉन डेविस लेख वास्तव में अच्छा पढ़ा है - स्पष्ट पेशेवरों और एकल स्थान में विपक्ष।
गिदरीस 13

बिल्कुल सब कुछ एक ही स्थान पर है। इसके अलावा डेविस ने 4 अलग-अलग कैशिंग तरीकों का भी उल्लेख किया।
संपत

2
@ मेरे लिए यह ठीक लोड हो रहा है।
user247702

1
@Stijn धन्यवाद, दूसरे दिन लोड नहीं हो रहा था, लेकिन अब वापस आ गया है :)
Spikeh

1
@ संपत अब काम करती है। कल ऐसा लग रहा था कि साइट हैक हो गई है। आपकी सहायताके लिए धन्यवाद!
बागा

24

यहाँ जॉन डेविस का लेख है। पठनीयता को बनाए रखने के लिए, मैं अब अप्रचलित EntLib सेक्शन को समाप्त कर रहा हूं, इंट्रो के साथ-साथ निष्कर्ष भी।


ASP.NET कैश

ASP.NET, या System.Web.dll असेंबली में एक कैशिंग तंत्र है। यह कभी भी वेब संदर्भ के बाहर उपयोग करने का इरादा नहीं था, लेकिन इसका उपयोग वेब के बाहर किया जा सकता है, और यह उपरोक्त सभी समाप्ति व्यवहारों को एक हैशटेबल में करता है।

Google को परिमार्जित करने के बाद, ऐसा प्रतीत होता है कि जिन कुछ लोगों ने .NET में अंतर्निहित कैशिंग कार्यक्षमता पर चर्चा की है, उन्होंने अपने गैर-वेब परियोजनाओं में ASP.NET कैश का उपयोग करने का सहारा लिया है। यह अब .NET में सबसे अधिक उपलब्ध, सबसे समर्थित बिल्ट-इन कैशिंग सिस्टम नहीं है; .NET 4 में एक ObjectCache है जिसे मैं बाद में प्राप्त करूंगा। Microsoft हमेशा मानता रहा है कि ASP.NET कैश वेब के बाहर उपयोग के लिए नहीं है। लेकिन बहुत से लोग अभी भी .NET 2.0 और .NET 3.5 में अटके हुए हैं, और काम करने के लिए कुछ चाहिए, और ऐसा कई लोगों के लिए काम करने के लिए होता है, भले ही MSDN स्पष्ट रूप से कहे:

नोट: कैश वर्ग ASP.NET अनुप्रयोगों के बाहर उपयोग के लिए अभिप्रेत नहीं है। यह वेब अनुप्रयोगों के लिए कैशिंग प्रदान करने के लिए ASP.NET में उपयोग के लिए डिज़ाइन और परीक्षण किया गया था। अन्य प्रकार के अनुप्रयोगों में, जैसे कंसोल एप्लिकेशन या विंडोज फॉर्म एप्लिकेशन, ASP.NET कैशिंग सही तरीके से काम नहीं कर सकते हैं।

ASP.NET कैश के लिए वर्ग System.Web.Caching.Cache System.Web.dll में है। हालाँकि, आप किसी कैश ऑब्जेक्ट को केवल नया नहीं कर सकते। आपको इसे System.Web.HttpRuntime.Cache से प्राप्त करना होगा।

Cache cache = System.Web.HttpRuntime.Cache;

ASP.NET कैश के साथ कार्य करना MSDN पर यहाँ प्रलेखित है

पेशेवरों:

  1. यह बिल्ट-इन है
  2. .NET 1.0 सिंटैक्स के बावजूद, यह उपयोग करने के लिए काफी सरल है।
  3. जब एक वेब संदर्भ में उपयोग किया जाता है, तो यह अच्छी तरह से परीक्षण किया जाता है । वेब संदर्भों के बाहर, Google खोजों के अनुसार यह आमतौर पर समस्याओं के कारण के लिए नहीं जाना जाता है, इसके बावजूद Microsoft इसके खिलाफ सिफारिश कर रहा है, इसलिए जब तक आप .NET 2.0 या उसके बाद का उपयोग कर रहे हैं।
  4. किसी आइटम को हटाए जाने पर आपको एक प्रतिनिधि के माध्यम से सूचित किया जा सकता है, जो आवश्यक है यदि आपको इसे जीवित रखने की आवश्यकता है और आप पहले से आइटम की प्राथमिकता निर्धारित नहीं कर सकते हैं।
  5. व्यक्तिगत वस्तुओं में इस लेख के शीर्ष पर निष्कासन विधियों की सूची में से किसी भी (ए), (बी), या (सी) समाप्ति की विधियों का लचीलापन है। आप एक भौतिक फ़ाइल की उपस्थिति के साथ समाप्ति व्यवहार को भी जोड़ सकते हैं।

विपक्ष:

  1. न केवल यह स्थिर है, केवल एक है । आप किसी Cache के अपने स्वयं के स्थिर उदाहरण के साथ अपना प्रकार नहीं बना सकते। आप अपने पूरे ऐप, पीरियड के लिए केवल एक ही बाल्टी रख सकते हैं। आप अपने स्वयं के रैपर के साथ बाल्टी को लपेट सकते हैं जो चाबियों में पूर्व इंजेक्शन उपसर्ग जैसी चीजें करते हैं और जब आप चाबी / मूल्य जोड़े को वापस खींचते हैं तो इन उपसर्गों को हटा देते हैं। लेकिन अभी भी केवल एक बाल्टी है। सब कुछ एक साथ गांठ है। यह एक वास्तविक उपद्रव हो सकता है यदि, उदाहरण के लिए, आपके पास एक ऐसी सेवा है जिसे तीन या चार अलग-अलग प्रकार के डेटा को अलग से कैश करना होगा। यह देशव्यापी रूप से सरल परियोजनाओं के लिए एक बड़ी समस्या नहीं होनी चाहिए। लेकिन अगर किसी परियोजना में अपनी आवश्यकताओं के कारण जटिलता की कोई महत्वपूर्ण डिग्री है, तो ASP.NET कैश आमतौर पर पर्याप्त नहीं होगा।
  2. आइटम गायब हो सकते हैं, विली-नीली। बहुत से लोगों को इसके बारे में पता नहीं है - मैं तब तक नहीं था, जब तक मैं इस कैश कार्यान्वयन पर अपने ज्ञान को ताज़ा नहीं करता। डिफ़ॉल्ट रूप से, ASP.NET कैश को आइटम को तबाह करने के लिए डिज़ाइन किया गया है जब यह "पसंद" करता है। विशेष रूप से, इस लेख के शीर्ष पर कैश तालिका की मेरी परिभाषा में (सी) देखें। यदि एक ही प्रक्रिया में एक और धागा पूरी तरह से अलग चीज पर काम कर रहा है, और यह उच्च-प्राथमिकता वाली वस्तुओं को कैश में डंप करता है, तो जैसे ही .NET तय करता है उसे कुछ मेमोरी की आवश्यकता होती है यह कैश के अनुसार कुछ वस्तुओं को नष्ट करना शुरू कर देगा उनकी प्राथमिकताएं, पहली प्राथमिकताएँ। कैश आइटम को जोड़ने के लिए यहां प्रलेखित सभी उदाहरणों में NotRemovable प्राथमिकता मूल्य के बजाय डिफ़ॉल्ट प्राथमिकता का उपयोग किया जाता है जो इसे मेमोरी-क्लियरिंग उद्देश्यों के लिए हटाए जाने से रोकता है, लेकिन फिर भी इसे समाप्ति नीति के अनुसार हटा देगा।
  3. कुंजी एक स्ट्रिंग होनी चाहिए। यदि, उदाहरण के लिए, आप डेटा रिकॉर्ड को कैशिंग कर रहे हैं जहां रिकॉर्ड लंबे या पूर्णांक पर कुंजीबद्ध होते हैं, तो आपको पहले एक स्ट्रिंग में कुंजी को बदलना होगा।
  4. वाक्य विन्यास बासी है । यह .NET 1.0 सिंटैक्स है, यहां तक ​​कि ArrayList या Hashtable की तुलना में भी बदसूरत है। यहाँ कोई जेनरिक नहीं हैं, कोई IDEDIA <> इंटरफ़ेस नहीं है। इसमें कोई कंटेंस () विधि, कोई कीज़ संग्रह, कोई मानक इवेंट नहीं है; इसमें केवल Get () विधि और एक अनुक्रमणिका होती है जो Get () के समान कार्य करती है, यदि कोई मिलान नहीं है, तो null लौट रहा है, प्लस Add (), Insert () (निरर्थक?), निकालें (), और GetEnumerator () ।
  5. अपने डिफ़ॉल्ट समाप्ति / निष्कासन व्यवहार को स्थापित करने के DRY सिद्धांत को अनदेखा करता है ताकि आप उनके बारे में भूल सकें। आपको स्पष्ट रूप से कैश को यह बताना होगा कि आप जिस आइटम को जोड़ना चाहते हैं, वह कैसे समाप्त हो रहा है या किसी आइटम को जोड़ने पर हर बार हटा दिया जाएगा।
  6. कैश्ड आइटम के कैशिंग विवरण तक पहुंचने का कोई तरीका नहीं है जब इसे जोड़ा गया था। यहां एनकैप्सुलेशन थोड़ा ओवरबोर्ड हो गया, जिससे कैश का उपयोग करना मुश्किल हो जाता है जब कोड में आप यह निर्धारित करने का प्रयास कर रहे हैं कि कैश्ड आइटम को किसी अन्य कैशिंग तंत्र (अर्थात सत्र संग्रह) के खिलाफ अमान्य किया जाना चाहिए या नहीं।
  7. निष्कासन की घटनाओं को घटनाओं के रूप में उजागर नहीं किया जाता है और उन्हें ऐड के समय ट्रैक किया जाना चाहिए।
  8. और अगर मैंने इसे पर्याप्त नहीं कहा है, तो Microsoft स्पष्ट रूप से वेब के बाहर इसके खिलाफ सिफारिश करता है। और यदि आप .NET 1.1 के साथ शापित हैं , तो आप इसे वेब के बाहर किसी भी स्थिरता के विश्वास के साथ उपयोग नहीं करना चाहते हैं ताकि परेशान न हों।

.NET 4.0 की ObjectCache / MemoryCache

Microsoft ने .NET फ्रेमवर्क के नवीनतम संस्करण में आखिरकार एक अमूर्त ObjectCache वर्ग लागू किया, और एक MemoryCache कार्यान्वयन जो इन-मेमोरी उद्देश्यों के लिए ObjectCache को इनहेरिट करता है और कार्यान्वित करता है।

System.Runtime.Caching.ObjectCache System.Runtime.Caching.dll असेंबली में है। यह एक अमूर्त वर्ग है जो मूल रूप से उसी .NET 1.0 शैली इंटरफेस की घोषणा करता है जो ASP.NET कैश में पाए जाते हैं। System.Runtime.Caching.MemoryCacheObjectCache का इन-मेमरी कार्यान्वयन है और कुछ परिवर्तनों के साथ ASP.NET कैश के समान है।

स्लाइडिंग समाप्ति के साथ कोई आइटम जोड़ने के लिए, आपका कोड कुछ इस तरह दिखाई देगा:

var config = new NameValueCollection();  
var cache = new MemoryCache("myMemCache", config);  
cache.Add(new CacheItem("a", "b"),  
    new CacheItemPolicy  
    {  
        Priority = CacheItemPriority.NotRemovable,  
        SlidingExpiration=TimeSpan.FromMinutes(30)  
    }); 

पेशेवरों:

  1. यह अंतर्निहित है और अब वेब के बाहर Microsoft द्वारा समर्थित और अनुशंसित है।
  2. ASP.NET कैश के विपरीत, आप एक MemoryCache ऑब्जेक्ट इंस्टेंस को त्वरित कर सकते हैं।

    नोट: इसका स्थैतिक होना आवश्यक नहीं है, लेकिन यह होना चाहिए - यह Microsoft की अनुशंसा है (पीला सावधानी देखें)

  3. ASP.NET कैश के इंटरफ़ेस के अनुसार कुछ मामूली सुधार किए गए हैं, जैसे कि आवश्यक वस्तुओं को जोड़ने के बिना घटनाओं को हटाने के लिए सदस्यता लेने की क्षमता, जब निरर्थक सम्मिलित करें () को हटा दिया गया था, आइटम को CacheItem के साथ जोड़ा जा सकता है कैशिंग रणनीति को परिभाषित करने वाले एक इनिशलाइज़र के साथ ऑब्जेक्ट, और Contains () जोड़ा गया था।

विपक्ष:

  1. अभी भी DRY पर पूरी तरह से लगाम नहीं है। मेरे अनुभव की छोटी राशि से, आप अभी भी एक बार स्लाइडिंग समय सीमा समाप्ति सेट नहीं कर सकते हैं और इसके बारे में भूल सकते हैं। और स्पष्ट रूप से, हालांकि आइटम-एड नमूना में नीति अधिक पठनीय है, यह भयावह क्रियाशीलता की आवश्यकता है।
  2. यह अभी भी उदारतापूर्वक बंद नहीं है; यह कुंजी के रूप में एक स्ट्रिंग की आवश्यकता है। जब तक आप स्ट्रिंग में कनवर्ट नहीं करते हैं, तब तक आप डेटा रिकॉर्ड को कैशिंग नहीं कर सकते हैं।

DIY: अपने आप को एक बनाएँ

यह एक कैशिंग शब्दकोश बनाने के लिए वास्तव में बहुत सरल है जो स्पष्ट या स्लाइडिंग समाप्ति करता है। (यह बहुत कठिन हो जाता है यदि आप चाहते हैं कि आइटम मेमोरी-क्लियरिंग उद्देश्यों के लिए ऑटो-हटाए जाएं।) यहां आपको केवल इतना करना है:

  1. एक मूल्य कंटेनर वर्ग बनाएं जिसे एक्सपायरिंग या एक्सपेंशन जैसी कोई चीज़ कहा जाता है जिसमें टाइप T का मान होगा, जब कैश में मूल्य जोड़ा गया था, तो स्टोरटाइम टाइम टाइप की संपत्ति, और एक टाइमस्पैन यह इंगित करेगा कि टाइमपास से कितनी दूर है। आइटम समाप्त होना चाहिए। स्पष्ट समाप्ति के लिए आप बस एक संपत्ति सेटर को उजागर कर सकते हैं जो टाइमस्टैम्प द्वारा दी गई तारीख को टाइमस्पैन सेट करता है।
  2. एक क्लास बनाएँ, आइए इसे एक्सपेंडेइमटैब्रिक कहें, जो कि IDfox को लागू करता है। मैं इसे उपभोक्ता द्वारा परिभाषित एक सामान्य वर्ग बनाना पसंद करता हूं।
  3. # 2 में बनाई गई कक्षा में, एक शब्दकोश> एक संपत्ति के रूप में जोड़ें और इसे इनरबेडर कहें।
  4. कार्यान्वयन अगर # 2 में बनाई गई कक्षा में IDEDIA कैश्ड वस्तुओं को संग्रहीत करने के लिए इनरबॉडी का उपयोग करना चाहिए। इनकैप्सुलेशन कैशिंग विधि विवरण को # 1 में बनाए गए प्रकार के उदाहरणों के माध्यम से छिपाएगा।
  5. सुनिश्चित करें कि अनुक्रमणिका (यह []], कॉन्टेंसेके (), आदि, समाप्त हो चुकी वस्तुओं को साफ करने और मूल्य वापस करने से पहले समाप्त हो चुकी वस्तुओं को हटाने के लिए सावधान हैं। यदि आइटम हटा दिया गया था, तो पाने वालों में अशक्त लौटें
  6. सभी गेटर्स, सेटर्स, कॉन्टेंसकेय () पर थ्रेड लॉक का उपयोग करें, और विशेष रूप से समयसीमा समाप्त वस्तुओं को साफ़ करते समय।
  7. जब भी कोई वस्तु समाप्ति के कारण हटा दी जाती है तो एक घटना को उठाएं।
  8. एक System.Threading.Timer उदाहरण जोड़ें और हर 15 सेकंड में ऑटो-हटाए गए आइटम्स को इनिशियलाइज़ करने के दौरान इसे रिग करें। यह ASP.NET कैश के समान व्यवहार है।
  9. आप एक AddOrUpdate () रुटीन जोड़ना चाहते हैं जो आइटम के कंटेनर (एक्सपायरिंग इंस्टेंस) पर टाइमस्टैम्प को प्रतिस्थापित करके स्लाइडिंग समाप्ति को बाहर निकालता है यदि यह पहले से मौजूद है।

Microsoft को अपने मूल डिज़ाइन का समर्थन करना है क्योंकि उसके उपयोगकर्ता आधार ने उन पर निर्भरता का निर्माण किया है, लेकिन इसका मतलब यह नहीं है कि वे अच्छे डिज़ाइन हैं।

पेशेवरों:

  1. आपके पास पूर्ण नियंत्रण कार्यान्वयन से अधिक।
  2. डिफ़ॉल्ट कैशिंग व्यवहार सेट करके DRY को सुदृढ़ कर सकते हैं और फिर जब भी आप कोई आइटम जोड़ते हैं तो कैशिंग विवरणों को घोषित किए बिना केवल कुंजी / मान जोड़े को छोड़ते हैं।
  3. आधुनिक इंटरफेस को लागू कर सकते हैं , अर्थात् IDictionary<K,T>। इससे इसका उपभोग करना बहुत आसान हो जाता है क्योंकि इसका इंटरफ़ेस एक शब्दकोश इंटरफ़ेस के रूप में अधिक अनुमानित है, साथ ही यह मदद करने वालों और विस्तार के तरीकों के लिए अधिक सुलभ बनाता है जो IDfox <> के साथ काम करते हैं।
  4. कैशिंग विवरण को अनकैप्सूलेट किया जा सकता है , जैसे कि एक पब्लिक रीड-ओनली प्रॉपर्टी के माध्यम से अपने इनरवियर को उजागर करके, आप अपनी कैशिंग रणनीति के खिलाफ स्पष्ट इकाई परीक्षण लिखने के साथ-साथ उस पर बनने वाली अतिरिक्त कैशिंग रणनीतियों के साथ अपने बुनियादी कैशिंग कार्यान्वयन का विस्तार कर सकते हैं।
  5. हालांकि यह जरूरी नहीं है कि यह उन लोगों के लिए एक परिचित इंटरफ़ेस है जो पहले से ही ASP.NET कैश या कैशिंग एप्लिकेशन ब्लॉक के .NET 1.0 स्टाइल सिंटैक्स के साथ खुद को सहज बनाते हैं, आप इंटरफ़ेस को देखने के लिए उसी तरह परिभाषित कर सकते हैं जैसे आप इसे देखना चाहते हैं।
  6. चाबियों के लिए किसी भी प्रकार का उपयोग कर सकते हैं। यह एक कारण है कि जेनरिक का निर्माण क्यों किया गया। सब कुछ एक स्ट्रिंग के साथ बंद नहीं होना चाहिए।

विपक्ष:

  1. द्वारा आविष्कार नहीं किया गया है, न ही Microsoft द्वारा इसका समर्थन किया गया है , इसलिए इसमें समान गुणवत्ता आश्वासन नहीं है।
  2. केवल ऊपर बताए गए निर्देशों को लागू करने पर, "willy-nilly" स्पष्ट वस्तुओं को प्राथमिकता के आधार पर साफ़ करने के लिए "आइटम नहीं है" (जो कि कैश का एक कोना-उपयोगिता उपयोगिता फ़ंक्शन है) वैसे भी .. खरीदें RAM जहाँ आप कैश का उपयोग कर रहे हैं , रैम सस्ती है)।

इन चार विकल्पों में से, यह मेरी प्राथमिकता है। मैंने इस बुनियादी कैशिंग समाधान को लागू किया है। अब तक, यह पूरी तरह से काम करने लगता है, कोई ज्ञात कीड़े नहीं हैं (कृपया नीचे टिप्पणी पर या जोंन-एट-जॉन्डवी में मुझसे संपर्क करें अगर !!), और मैं इसे अपनी सभी छोटी साइड परियोजनाओं में उपयोग करने का इरादा रखता हूं, जिनकी आवश्यकता है बुनियादी कैशिंग। यह रहा:

Github लिंक: https://github.com/kroimon/ExpoubItemDictionary

पुराना लिंक: ExpableItemDictionary.zip

उल्लेख के योग्य: AppFabric, NoSQL, एट अल

ध्यान दें कि इस ब्लॉग लेख का शीर्षक "सिंपल कैशिंग" है, न कि "हैवी-ड्यूटी कैशिंग"। यदि आप भारी शुल्क वाले सामान में उतरना चाहते हैं, तो आपको समर्पित, स्केल आउट समाधानों को देखना चाहिए।



3

मेमोरीकैच वह है जो यह कहता है कि यह मेमोरी में संग्रहीत कैश है

HttpRuntime.Cache ( http://msdn.microsoft.com/en-us/library/system.web.httpruntime.cache(v=vs.100).aspx और http://msdn.microsoft.com/en-en- देखें हमें / लाइब्रेरी / system.web.caching.cache.aspx ) आपके आवेदन में जो भी आप इसे कॉन्फ़िगर करते हैं, वह जारी रहता है।

उदाहरण के लिए देखें "ASP.NET 4.0: कस्टम आउटपुट कैश प्रदाता लिखना" http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache -providers.aspx


1
Hm, निश्चित नहीं है कि दूसरा लिंक भ्रामक नहीं है, क्योंकि वहाँ OutputCache और OutputCacheProvider को लागू करने के बारे में बात कर रहे हैं।
गिदरीस

हम्म, मैं यह नहीं कह सकता कि यह कहां होगा, कि आप System.Web.Caching.Cache को अलग-अलग कॉन्फ़िगरेशन का उपयोग करके जारी रख सकते हैं
Giedrius

2

MemoryCache.Default एक "पुल" के रूप में भी काम कर सकता है यदि आप ASP.NET Core में एक क्लासिक ASP.NET MVC ऐप को माइग्रेट कर रहे हैं, क्योंकि कोर में कोई "System.Web.Caching" और "HttpRuntime" नहीं है।

मैंने एक boolआइटम को 20000 बार (और इसे पुनः प्राप्त करने के लिए एक और बेंचमार्क) स्टोर करने के लिए एक छोटा बेंचमार्क लिखा था और मेमोरीकैच दो बार धीमा (27ms बनाम 13ms - यह सभी 20k पुनरावृत्तियों के लिए कुल है) लगता है, लेकिन वे दोनों सुपर-फास्ट हैं और यह शायद नजरअंदाज किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.