2012-04-03 10 views
17

में आइटम को स्टोर/पुनर्प्राप्त करने का सबसे प्रभावी तरीका क्या है मेरे पास एक ऐसी वेबसाइट है जहां मैं बहुत सारी जानकारी कैश करता हूं। मैं asp.net कैश में सामान संग्रहीत करने के आसपास विरोधाभासी जानकारी देख रहा हूं।एएसपीनेट httpContext.Cache

Dictionary<string, List<Car>> mydictionary; 

मैं "के रूप में MyDictionary" एक स्ट्रिंग कुंजी के साथ पूरी बात की दुकान और फिर अंदर घुसते हैं एक बार मैं वस्तु बाहर खींच सकता है:

उदाहरण के लिए कहते हैं कि मैं इस डेटा संरचना देता है।

HttpContext.Cache.Add("MyDictionary", 
    mydictionary, 
    null, 
    Cache.NoAbsoluteExpiration, 
    new TimeSpan(10, 0, 0), 
    CacheItemPriority.Normal, 
    null); 

var myDict = HttpContext.Cache["MyDictionary"] as Dictionary<string, List<Car>>; 

दूसरी बात मैं कर सकता है इसे तोड़ने के नीचे और कैश में अलग से मेरी शब्दकोश में प्रत्येक आइटम की दुकान (कैश दिए गए एक शब्दकोश वैसे भी है)।

Dictionary<string, List<Car>> mydictionary; 

foreach (var item in mydictionary.Keys) 
{ 
     HttpContext.Cache.Add(item, mydictionary[item], null, Cache.NoAbsoluteExpiration, new TimeSpan(10, 0, 0), CacheItemPriority.Normal, null); 
} 

var myitem = "test"; 
var myDict = HttpContext.Cache[myItem] as List<Car>; 

प्रदर्शन निहितार्थ बहुत अलग होगा (दिए गए मैं यह सोचते हैं कि सब कुछ वैसे भी स्मृति में है?)

+4

बस याद रखें कि कैश का उपयोग अक्सर उपयोग की जाने वाली 'महंगी' वस्तुओं (यानी कैशिंग की लागत से अधिक पुनर्वास की लागत) को पुनर्जीवित करने की लागत को बचाने के लिए होता है। यदि यह कैशिंग के लायक है, तो प्रदर्शन को अधिकतम करने के लिए कैश को एलआरयू नियम लागू करने दें। सभी प्रविष्टियों को एक कैश एंट्री ('माई डिक्शन') में डालकर एलआरयू को हराया जाता है, और आपको बहुत सारी खोने का जोखिम कैश करना चाहिए कि अन्य प्रविष्टियों को रखने से MyDictionary कम कुशल है। – Will

उत्तर

14

एक अतिरिक्त उत्तर यहां जोड़ना क्योंकि मुझे लगता है कि मौजूदा व्यक्ति 'क्या' पर कब्जा कर रहा है लेकिन 'क्यों' पर्याप्त नहीं है।

कैश में अलग-अलग अलग-अलग प्रविष्टियों को स्टोर करने के लिए सबसे अच्छा कारण यह है कि perf के साथ बहुत कम करना है। इसके बजाए, सिस्टम को उचित स्मृति प्रबंधन करने की अनुमति देने के साथ इसे करना है।

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

लेकिन सवाल पर वापस जाकर, यदि आप अपने पूरे शब्दकोश को एक ही आइटम के रूप में स्टोर करते हैं, तो आप केवल एएसपी में दो विकल्प छोड़ रहे हैं।नेट मेमोरी मैनेजर: पूरी चीज को जिंदा रखें, या पूरी चीज़ को मार दें। यानी आप अपने 'हॉट' आइटम को कैश में रहने का लाभ पूरी तरह से खो देते हैं, जबकि आपकी शायद ही कभी एक्सेस की गई मेमोरी-होगिंग आइटम निकाल दी जाती है। दूसरे शब्दों में, आप किसी भी स्तर पर कैशिंग ग्रैन्युलरिटी खो देते हैं।

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

3

अब तक, दूसरा तरीका बेहतर है।

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

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

मैं आपको अंतिम कार्यान्वयन के रूप में इसे अपनाने से पहले प्रदर्शन लाभ को मापने के लिए आपको सलाह देता हूं।

7

जैसा कि आप कहते हैं, इस पर दो विरोधी राय हैं।

यह वास्तव में क्या उबालता है यह है कि कैश प्रविष्टियों को संभवतः सबसे अधिक मात्रात्मक स्तर पर संग्रहीत किया जाना चाहिए क्योंकि उनकी आवश्यकता होती है। इसके द्वारा, मेरा मतलब है, यदि आप हर बार अपने शब्दकोश में प्रत्येक प्रविष्टि का उपयोग करते हैं, तो इसे शब्दकोश स्तर पर संग्रहीत करें।

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

तो यदि आप पूरे संग्रह को एक इकाई के रूप में देखते हैं, तो इसे एक इकाई के रूप में कैश करें। यदि संग्रह यादृच्छिक रूप से उपयोग किया जाता है और एक समय में केवल कुछ वस्तुओं की आवश्यकता होती है, तो उसे उस स्तर पर संग्रहीत करें जिसमें यह एक इकाई है।