2009-07-07 18 views
9

से आइटम्स को निकालने से ASP.NET को कैसे रोकें I कैश में स्थायी रूप से कोई आइटम जोड़ना चाहता हूं। मैं निम्नलिखित वाक्यविन्यास का उपयोग कर रहा हूं:कैश

HttpContext.Current.Cache.Insert(cacheName, c, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration); 

मुझे पता चला है कि एएसपी.नेट अभी भी कभी-कभी कैश से वस्तुओं को हटा देता है।

कैसे कैश छोड़ने और एक स्थिर सदस्य में संग्रहीत शब्दकोश का उपयोग कर के अलावा इस को रोकने के लिए (पर कोई भी विचार?

मेट्रा

+0

क्या आप स्टोर करना चाहते हैं? –

+0

यह कितना बड़ा/जटिल है? या ये सिर्फ सेटिंग्स हैं? – BigBlondeViking

उत्तर

1

मेरा जवाब सही नहीं है। सही उत्तर के लिए कृपया see here पर जाएं।


आप एएसपी.NET को कैश से आइटम्स को हटाने से रोक नहीं सकते हैं (उदाहरण के लिए जब स्मृति कम हो जाती है)।

आप,, आवेदन के पूरे जीवन भर के लिए डाटा स्टोर करने की तो यह ApplicationState संग्रह में डाल की जरूरत है जैसे:

Application["myData"] = ...; 

यह SessionState संग्रह करने के लिए समान है, लेकिन जैसा कि नाम से कहते हैं, यह है आवेदन चौड़ा।

+2

गलत। नीचे उपयोगकर्ता134706 का उत्तर देखें। –

+0

दुर्भाग्य से मैं अपना जवाब नहीं हटा सकता (शायद क्योंकि यह स्वीकार्य उत्तर है) – M4N

1

आप कुछ (के जीवन के लिए यानी स्थायी रूप से स्मृति में संग्रहीत चाहते हैं AppDomain) तो एक स्थिर क्षेत्र (आपके मामले में, एक Dictionary<TKey,TValue>) आपका सर्वश्रेष्ठ दांव है।

एक बार CLR स्मृति में युक्त प्रकार के लोड होते ही अपने Dictionary स्मृति में आयोजित किया जाएगा जब तक AppDomain अनलोड।

1

आप कभी भी एएसपी.NET कैश (यानी HttpContext.Current.Cache ऑब्जेक्ट) से हटाए जाने से कुछ पूरी तरह से रोक नहीं सकते हैं और यह डिज़ाइन द्वारा बहुत अधिक है।

कृपया "स्वचालित डेटा निष्कासन" नामक एमएसडीएन आलेख ASP.NET Caching Overview में अनुभाग देखें, जो कैश से हटाए जा रहे आइटमों के बारे में सबसे प्रासंगिक जानकारी देता है।

इसमें कहा गया है:

ASP.NET इन कारणों में से एक के लिए कैश से डेटा निकाल सकते हैं:

  • क्योंकि सर्वर पर स्मृति कम है, एक प्रक्रिया सफाई के रूप में जाना।
  • क्योंकि कैश में आइटम की समयसीमा समाप्त हो गई है।
  • क्योंकि आइटम की निर्भरता बदलती है।

कैश किए गए आइटमों को प्रबंधित करने में आपकी सहायता के लिए, कैश से आइटम हटा दिए जाने पर ASP.NET आपके एप्लिकेशन को सूचित कर सकता है।

स्कावेन्गिंग स्मृति दुर्लभ होने पर कैश से आइटम हटाने की प्रक्रिया है। आइटम्स को तब हटा दिया जाता है जब उन्हें कुछ समय तक एक्सेस नहीं किया जाता है या जब कैश में जोड़े जाने पर आइटम को कम प्राथमिकता के रूप में चिह्नित किया जाता है। ASP.NET कैशइटेम प्राथमिकता ऑब्जेक्ट का उपयोग यह निर्धारित करने के लिए करता है कि कौन से आइटम पहले स्कैन करें। अधिक जानकारी के लिए देखें: कैसे कैश में आइटम जोड़ें।

यह (, मुर्दाखोर कोई अन्य हो तो) इस कारण के लिए है कि आप पूरी तरह से एक आइटम है कि आप पहले से कैश में रखा हो सकता है और स्पष्ट रूप से NoSlidingExpiration और NoAbsoluteExpiration के साथ चिह्नित है, और संभवतः भी रूप में यह चिह्नित पर भरोसा नहीं कर सकते एक उच्च प्राथमिकता आइटम, जैसा कि समय के बाद में कैश में अभी भी है।

0

आपको कैश मिस को संभालने और आवश्यकतानुसार आपके कैश में जानकारी को पुनः लोड करने के लिए तैयार होना चाहिए। देखें here

4

कैश का उपयोग करें। जोड़ें() और कैश प्राथमिकता को बहुत अधिक सेट करें (कैशइटम प्राइरिटी.ओट रिमूवेबल), इससे इसे कैश में रहने में मदद मिलेगी।

HttpContext.Current.Cache.Add("key", "your object", null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null); 

System.Web.Caching.CacheItemPriority.NotRemovable

यह अभी भी यह कैश में किया जा रहा है की गारंटी नहीं दे रहा है, लेकिन यह भी यह इतनी अधिक है इसकी अत्यधिक संभावना नहीं है कि यह हो जाएगा सेट ... लेकिन आप अभी भी अगर जाँच करने की आवश्यकता होगी अपनी वहाँ और फिर कैश नहीं है ... (ऐसा लगता है कि इंटरबेट्स पर कुछ लोगों को इस उच्च कैश सेटिंग का उपयोग करना पसंद नहीं है ... और कुछ करते हैं ... आपके सटीक परिदृश्य पर निर्भर करता है ...)

public static string GetSpecialObject 
{ 
    get 
    { 
     object obj = HttpContext.Current.Cache["key"]; 
     if (obj == null) 
     { 
      obj = HttpContext.Current.Cache.Add("key", 
              "I stay in cache as best i can object", // Build Object Function Here 
              null, 
              Cache.NoAbsoluteExpiration, 
              Cache.NoSlidingExpiration, 
              CacheItemPriority.NotRemovable, 
              null); 
     } 
     return (string)obj; 
    } 
} 

शुभकामनाएं

21

आप एएसपी.NET को कैश से आइटम्स को हटाने से नहीं रोक सकते हैं (उदा। जब स्मृति कम हो जाती है)।

आप कभी भी पूरी तरह ASP.NET कैश से हटाया जा रहा से कुछ (अर्थात HttpContext.Current.Cache वस्तु) नहीं रोका जा सकता है और इस डिजाइन द्वारा बहुत ज्यादा है।

गलत! यदि आप आइटम को CacheItemPriority.NotRemovable के साथ चिह्नित करते हैं तो आप एएसपीनेट कैश से हटाए जाने से रोक सकते हैं। प्रत्येक और प्रत्येक दूसरे कैश किए गए डेटा (एप्लिकेशन, सत्र, आदि ...) इस तरह से HttpRuntime कैश में संग्रहीत हैं।

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

तो, यदि आप इसे मैन्युअल रूप से कभी नहीं हटाते हैं, और कभी भी निर्भरताओं को निर्दिष्ट नहीं करते हैं जो इसे हटा सकते हैं, तो आपके पास वस्तु के जीवन के लिए आपकी वस्तु है।

+0

रनटाइम, क्या आपने इसका परीक्षण किया है? BigBlondeViking से उत्तर इंगित करता है कि इस तरह के आइटम अभी भी हटा दिए जा सकते हैं। –

+0

मत्रा, हाँ मैंने इसका परीक्षण किया है।भ्रम एक वस्तु को मैन्युअल रूप से ऐसी प्राथमिकता से हटाने की क्षमता के साथ आता है, और कुछ समय-समय पर समाप्ति या कुछ निर्भरता निर्दिष्ट करके इसे स्वचालित रूप से हटा दिया जाता है। तो, जब आप इसे कैश करते हैं तो NotRemovable का मतलब यह नहीं है कि यह एपडोमेन के जीवन के लिए वहां रहना है। NotRemovable का मतलब है कि जब आप स्मृति पर कम हो जाते हैं तो एमएस कार्यान्वयन ऐसी चीज को नहीं हटाएगा। कैश में इस तरह के व्यस्त सत्र स्थिति आयोजित की जाती है। यदि आपके सभी आइटम अस्वीकार्य नहीं हैं और आप अपनी याद क्षमता को कैश करते हैं, तो आप आउटऑफमेमरी प्राप्त करेंगे। – user134706

0

साथ CacheItemPriority.NotRemovable विकल्प गठबंधन करने के लिए प्रयास करें:

<system.web> 
    <caching> 
     <cache disableExpiration="true"/> 
    </caching> 
    .... 
</system.web> 

यह machine.config सेटिंग को ओवरराइड चाहिए।

+0

आपको उत्तर अनुभाग में स्पष्ट उत्तर देना चाहिए, यह एक और प्रश्न की तरह लगता है –

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