2009-04-01 12 views
11

से विशिष्ट आइटम को निकालना मैं एक विशिष्ट उपसर्ग के साथ ASP.NET कैश में आइटम का एक गुच्छा जोड़ रहा हूं। मैं कैश पर पुन: प्रयास करने और उन वस्तुओं को हटाने में सक्षम होना चाहता हूं।कैश (एएसपी.नेट)

foreach (DictionaryEntry CachedItem in Cache) 
    { 
     string CacheKey = CachedItem.Key.ToString(); 
     if(CacheKey.StartsWith(CACHE_PREFIX){ 
      Cache.Remove(CacheKey); 
     } 
    } 

मैं और अधिक कुशलता से यह कर रहा हो सकता है:

तरह से मैं ऐसा करने की कोशिश की है यह बहुत की तरह है?

मैंने एक temp फ़ाइल बनाने और फ़ाइल पर निर्भरता के साथ आइटम जोड़ने पर विचार किया था, फिर फ़ाइल को हटाया। क्या वह मारने पर है?

उत्तर

19

आप तो आप कुछ इस तरह करने की ज़रूरत है एक संग्रह से आइटम नहीं निकाल सकते, जबकि आप इसे ऊपर पुनरावृत्ति कर रहे हैं:

List<string> itemsToRemove = new List<string>(); 

IDictionaryEnumerator enumerator = Cache.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
    if (enumerator.Key.ToString().ToLower().StartsWith(prefix)) 
    { 
     itemsToRemove.Add(enumerator.Key.ToString()); 
    } 
} 

foreach (string itemToRemove in itemsToRemove) 
{ 
    Cache.Remove(itemToRemove); 
} 

यह दृष्टिकोण ठीक है और जल्दी और कैश निर्भरता की तुलना में आसान है।

+0

यही वह था जिसे मैं डरता था। धन्यवाद –

+0

अच्छी तरह से किया गया। हालांकि, .NET के अगले संस्करण में मैं सभी संग्रहों पर निकालें विधि देखना चाहता हूं जो इनपुट के रूप में नियमित अभिव्यक्ति लेते हैं। – Vnuk

+1

लैम्ब्डा भी बेहतर काम करेगा। – Audrius

2

आप CacheDependency का उप-वर्ग लिख सकते हैं जो अमान्यता को उचित रूप से करता है।

0

यह वास्तव में आपके कैश आइटमों की संख्या और कितनी बार सफाई करता है पर निर्भर करता है। मैं इसके बारे में चिंता करूंगा केवल यह वास्तव में एक प्रदर्शन मुद्दा था - यानी इसे मापें।

आपका समाधान तब तक ठीक है जब तक कि आप कुछ चरम नहीं कर रहे हों।

0

कैश साफ़ करने के लिए, मुझे लगता है कि आपको मैन्युअल रूप से चलाने की आवश्यकता है जब आप देखते हैं कि बहुत सारे कैश आइटम हैं। एमएस लिब कैश ब्लॉक का उपयोग करके, यह आपके लिए यह काम स्वचालित रूप से कर सकता है। कैशिंग में कॉन्फ़िगरेशन; आप अधिकतम अधिकतम संपत्तियां सेट कर सकते हैं CacheBeforeScavenging; एक बार कैश आइटम की संख्या सीमा से अधिक हो जाने के बाद कैश प्रबंधक कैश को स्वचालित रूप से साफ़ कर देगा।

1

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

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