2010-09-17 12 views
6

मेरे पास एक बड़ा डेटा सेट है जो दिन में एक बार अपडेट किया जाता है। मैं उस डेटा पर एक महंगी क्वेरी के परिणामों को कैशिंग कर रहा हूं लेकिन मैं हर दिन उस कैश को अपडेट करना चाहता हूं। मैं दैनिक अंतराल पर अपने कैश फिर से लोड करने CacheItemRemovedCallback का उपयोग कर विचार कर रहा हूँ, लेकिन मैं निम्नलिखित चिंताओं था:कैशइटम रीमेड कैलबैक का उपयोग करना उचित कब है?

  1. नहीं है यह संभव CacheItemRemovedCallback (मेरी समाप्ति से पहले कहा जा सकता है कि स्मृति से बाहर चल रहा है के मामले में)? जिसका मतलब है कि इसे तुरंत लोड करना अच्छा विचार नहीं लगता है।
  2. क्या कैशइटम रीमेड कॉलबैक को आइटम के पहले या बाद में वास्तव में हटा दिया जाता है? यदि यह बाद में है, तो क्या यह सैद्धांतिक रूप से समय की अवधि नहीं छोड़ता है जहां कैश अनुपलब्ध होगा?

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

उत्तर

2

हर किसी की प्रतिक्रियाओं से और आगे पढ़ने से मैं निम्नलिखित निष्कर्ष पर आ गए हैं:

मेरे चिंताओं मान्य हैं। कैश ItemRemovedCallback का उपयोग कैश किए गए आइटम रीफ्रेश करने के लिए एक अच्छा विचार नहीं है। इस कॉलबैक के लिए एकमात्र व्यावहारिक उपयोग आपके कैश को हटाए जाने के बारे में जानकारी लॉगिंग करता प्रतीत होता है।

ऐसा लगता है कि CacheItemUpdateCallback नियमित अंतराल पर आपके कैश को रीफ्रेश करने का अधिक उचित तरीका है।

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

+0

ठीक है, 'कैशइटम रीमेड कैलबैक' के लिए अन्य व्यावहारिक उपयोग हैं - केवल लॉगिंग नहीं। उदाहरण के लिए कहें कि कैश किए गए आइटम को हटाए जाने पर कैश किए गए आइटम द्वारा बाहरी संदर्भों को रखा जाता है जिन्हें आप निपटाना चाहते हैं। यदि आप CacheItemRemovedCallback का उपयोग नहीं करते हैं तो आपको केवल कचरा कलेक्टर पर भरोसा करना होगा जो निष्पादित होने पर कोई गारंटी प्रदान नहीं करेगा (यदि कभी भी आपके कार्यक्रम के जीवन के दौरान)। –

1
  1. हां, एक बदलाव है कि कई कारणों से विधि को निकाल दिया जा सकता है। हालांकि, फिर से कैश लोड करने या लोड करने का इंतजार आपके आवेदन में आपके सामान्य उपयोग के मामले के लिए सबसे अच्छा क्या होगा इस पर निर्भर करेगा।

  2. CacheItemRemovedCallback वास्तव में आग के बाद आइटम कैश से निकाल दिया जाता है। से पहले आइटम को हटाया जाना है, आप उस समय कैश फ्लश करना चाहते हैं या नहीं, यह निर्धारित करने के लिए आप CacheItemUpateCallback विधि का उपयोग कर सकते हैं। कैश को फ्लश करने में प्रतीक्षा करने के अच्छे कारण हो सकते हैं, जैसे कि आपके पास वर्तमान में आपके एप्लिकेशन में उपयोगकर्ता हैं और फिर कैश बनाने के लिए काफी समय लगता है।

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

1

यह वास्तव में व्यक्तिगत मूल्यों का कैश नहीं है क्योंकि यह पूरे डेटासेट का एक स्नैपशॉट है। इस प्रकार, आपको यहां Cache कक्षा का उपयोग करने से लाभ नहीं होता है।

मैं स्टार्टअप पर एक स्थिर संग्रह लोड करने और टाइमर सेट करके हर 24 घंटों को प्रतिस्थापित करने की अनुशंसा करता हूं। विचार एक नया संग्रह बनाना होगा और परमाणु रूप से इसे असाइन करना होगा, क्योंकि पुराना अभी भी उपयोग में है और हम चाहते हैं कि यह स्वयं निरंतर बने रहें।

3
  1. यदि आप पुनः लोड करने जा रहे हैं, तो CacheItemRemovedReason की जांच करना सुनिश्चित करें। मुझे हाल ही में एक ऐसी समस्या को डीबग करना पड़ा जहां एक डेवलपर ने फैसला किया कि उन्हें तुरंत इस विधि में कैश को फिर से तैयार करना चाहिए, और कम स्मृति स्थितियों के तहत, यह मूल रूप से सीपीयू को चबाने लगा, जबकि यह कैश ऑब्जेक्ट्स बनाने के लूप में फंस गया, कैश के लिए, समाप्ति, दोहराना।

  2. कॉलबैक के बाद निकाल दिया गया है आइटम हटा दिया गया है।

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