Asp.net-mvc में कैशिंग


82

मैं अपने asp.net-mvc साइट में अपने अधिकांश डेटाबेस भारी कार्यों को कैश करना चाहूंगा। अपने शोध में मैंने पाया है

लेकिन मुझे नहीं लगता कि मुझे यह अभी तक मिल पाया है।
मैं कई पार्स के आधार पर अपने POST अनुरोध को कैश करना चाहता हूं। ये पर्स एक ऑब्जेक्ट में हैं। इसलिए मैं निम्नलिखित अनुरोध के परिणाम को कैश करना चाहूंगा:

public ActionResult AdvancedSearch(SearchBag searchBag)

जहाँ सर्चबाग एक ऐसी वस्तु है जो वैकल्पिक खोज मापदंडों का एक गुच्छा (एक गुच्छा) रखती है। मेरे विचार अपने आप में हल्के हैं (जैसा कि उन्हें होना चाहिए), लेकिन डेटा एक्सेस में समय लग सकता है, जो इस बात पर निर्भर करता है कि खोज बैग में कौन से फ़ील्ड भरे गए हैं।

मुझे लग रहा है कि मुझे अपने डेडलेयर पर कैशिंग करना चाहिए, बल्कि फिर अपने कार्यों पर।
मैं कैसे OutputCache विशेषता में VaryByParam का उपयोग करने वाला हूं?


2
क्या आपने VaryByParam = "searchBag.property" के साथ प्रयास किया है?
एडुआर्डो कैम्पानोस

नहीं, मैं नहीं। आप जो कहेंगे, उसका प्रयास करेंगे। लेकिन कैसे कई मापदंडों की गणना के बारे में?
बोरिस ने

2
VaryByParam = "firstParam; secondParam; thirdParam"
आर्निस Lapsa

1
थोड़ी देर, लेकिन एंटरप्राइज़ लाइब्रेरी कैशिंग अनुप्रयोग ब्लॉक .Net 4.0 में शामिल है, इसलिए अब आप समान प्रभाव के लिए System.Runtime.Caching की MemoryCache का उपयोग कर सकते हैं । कहीं भी :)
कार्ल

जवाबों:


74

मुझे मॉडल या डेटा लेयर में भी कैश करना पसंद है। यह नियंत्रक / प्रस्तुति से डेटा प्राप्त करने के लिए सब कुछ अलग करता है। आप ASP.NET कैश का System.Web.HttpContext.Current.Cacheउपयोग एंटरप्राइज़ लाइब्रेरी से कैशिंग एप्लिकेशन ब्लॉक से कर सकते हैं या उसका उपयोग कर सकते हैं । क्वेरी के लिए पैरामीटर से कैश्ड डेटा के लिए अपनी कुंजी बनाएं। जब आप डेटा को अपडेट करते हैं तो कैश को अमान्य करना सुनिश्चित करें।


1
मुझे लगता है कि मुझे एंटरप्राइज लाइब्रेरी पर पढ़ना चाहिए। चूंकि अधिकांश विलंब डेटा लेयर में निहित है, मुझे लगता है कि अंत में सबसे अच्छा समाधान होगा। वर्तमान में यह केवल पढ़ने के लिए DB है, इसलिए यह बासी वस्तु की समस्या को कम करता है :)
बोरिस कॉल

17
कैशिंग ऐप ब्लॉक ओवरकिल के पूरे गड़बड़ की तरह लगता है। मैंने पाया है कि HttpRuntime.Cache लगभग हर उदाहरण में पर्याप्त से अधिक है।
जेफ पुतज

3
ओवरकिल क्यों? मैं अब विकास में बहुत आगे हूं और मैंने ईएल के कैश सिस्टम को वास्तव में उपयोग करना आसान पाया है। सही लाइब्रेरी का संदर्भ दें, सही कॉन्फिगर लाइनों को जोड़ें और आप प्रत्येक कोड की एक पंक्ति के साथ ऑब्जेक्ट को कैशिंग और पुनर्प्राप्त करना शुरू कर सकते हैं।
बोरिस ने

6
मुझे लगता है कि यह "सही कॉन्फ़िगर लाइनों को जोड़ने" कदम है जो कुछ लोगों को परेशान करता है।
माइक चैंबरलेन

यह अच्छा होगा यदि आप यह भी बता सकते हैं कि डेटाबेस में अपडेट होने पर मेमोरी कैश को कैसे अमान्य किया जाए, क्या आप अक्सर चेक करने के लिए किसी सेवा का उपयोग करते हैं, फिर आप कैश को कैसे साफ़ करते हैं?
शजीत

66

या आप HttpContext.Current से स्वतंत्र हो सकते हैं और HttpRuntime.C :) से कैश एक्सेस कर सकते हैं। :)


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

12

अक्सर, OutputCaching सबसे तेज़ और कुशल हो सकता है, लेकिन केवल जब यह आपकी आवश्यकताओं को पूरा करता है। यह गलत है, तो तेजी से कुशल होने का कोई मतलब नहीं! ;)

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


0

आप इस तरह से कुछ कैशिंग उत्पादन का उपयोग कर सकते हैं

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

या आप कैशे प्रोफ़ाइल का उपयोग इसे वेब कॉन्फ़िगर में सेट कर सकते हैं

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Admin" 

        duration="86420" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

and use this tag
[OutputCache(CacheProfile="Admin")]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.