2010-08-06 17 views
14

मैं बहुत कैशिंग रणनीतियों और कार्यान्वयन के लिए नया हूँ। मैं एक परियोजना पर काम कर रहा हूं जो डेटाबेस गहन होगा, लेकिन जानकारी भी अपडेट की जा रही है और नियमित रूप से बदल दी गई है।कैशिंग रणनीति, जब कैशिंग व्यर्थ हो जाती है?

मैं आम तौर पर पता है कि कैसे कैशिंग समारोह विकसित करने के लिए पर्याप्त जानकारी मिल गया है, लेकिन क्या मैं के बारे में अनिश्चित हूँ सामान्य रणनीति है।

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

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

धन्यवाद सब, मैं किसी भी जिनका आप की पेशकश करने के

संपादित है में दिलचस्पी रखता हूँ:

: इस जा रहा है पूरी तरह से आवेदन विशिष्ट के बारे में प्रतिक्रियाओं के आधार पर, मुझे सवाल इस तरह से जो सार्वभौमिक होना चाहिए मुद्रा जाने

यह मानते हुए कि मैं एक आवेदन है कि यह में 1000000 आइटम के साथ एक मेज पर निर्भर करता है है ...

यह डेटाबेस से उन वस्तुओं सीधे से एक को पुनः प्राप्त करने के लिए एक क्वेरी करने के लिए जल्दी होगा, या उन वस्तुओं में से एक को पुनः प्राप्त करने 1,000,000 फाइलों के साथ मेरी कैश निर्देशिका से, प्रत्येक में से एक का विवरण होता है ई आइटम?

संपादित करें: जाहिर है 100,000 मान्य उत्तर प्राप्त करने के लिए, चलो यह 1,000,000 बनाते हैं पर्याप्त नहीं था। कोई भी 1,000,000,000 के लिए जाना चाहता है? जबकि यह आवश्यक नहीं है और कैश केवल चीजों की आवश्यकता है कि कैश हो जाने की कैश नहीं है: क्योंकि मैं यह कर सकता ...

+3

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

+0

@ माइकल - मेरा उपयोग केस या आवश्यकताएं सभी विशिष्ट नहीं हैं। मैं सिर्फ पूछ रहा हूं, अगर मैं फ़ाइलों के हर छोटे टुकड़े को फाइलों में कैश करना शुरू करता हूं, तो कुछ बिंदुओं पर फ़ाइलों की शुद्ध मात्रा पहली जगह कैशिंग से प्रदर्शन लाभ को कम कर देती है? – Chris

+0

MySQL को 100k पंक्तियों के रूप में इस तरह के छोटे खंडों पर बेहद तेजी से काम करना चाहिए और कर सकते हैं। तो आपके पास कैश-पागल बनने के लिए पर्याप्त प्रदर्शन रिजर्व है। – zerkms

उत्तर

2

सामान्य नियम है।

+4

क्या यह कहने का कैश-वाई तरीका है, इसे पहले काम करने के लिए प्राप्त करें, और फिर चिंता करें कि यह कितनी जल्दी है? –

+0

ठीक है। इसलिए मैं इसे एक विकल्प बनाउंगा और केवल चीजों को धीमा करना शुरू कर दूंगा। :) लेकिन, क्या ऐसी कई चीजों को कैश करना संभव है कि यह प्रदर्शन में सुधार नहीं करता है या वास्तव में इसे खराब करता है? – Chris

+4

** कभी ** कैश नहीं क्योंकि आपका एप्लिकेशन धीमा है। यह आपदा के लिए एक नुस्खा है। कैश क्योंकि आपके पास बहुत अधिक भार है (जिसका अर्थ है कि कई समवर्ती अनुरोध)। लेकिन यदि आप कैश के बिना एप्लिकेशन धीमा है, तो यह केवल एक बंदूकशॉट घाव पर बैंड-एड्स डाल रहा है ... यदि यह धीमा है, तो धीमे गति को ठीक करें ... – ircmaxell

10

MySQL के उपयोग के बजाय यह अपने आप को बनाए रखने की कोशिश की क्वेरी कैश में बनाया गया। जब वे लिखे जाते हैं तो यह स्वचालित रूप से कैश किए गए प्रश्नों को तालिका में साफ़ कर देगा। साथ ही, यह स्मृति में काम करता है तो यह बहुत ही कुशल होना चाहिए ...

इसके अलावा, न सिर्फ कैश प्रश्नों से करते हैं। प्रतिपादन चक्र में विभिन्न चरणों में एप्लिकेशन के पूरे सेगमेंट को कैश करने का प्रयास करें। तो तुम MySQL प्रश्नों को कैश है, तो आप प्रत्येक व्यक्ति (गाया), प्रत्येक व्यक्ति के ब्लॉक प्रत्येक पृष्ठ देखने के लिए, और कैश कर सकते हैं। फिर, आप अनुरोध के आधार पर कैश से खींचने के लिए चुन सकते हैं या नहीं चुन सकते हैं।

उदाहरण के लिए, एक गैर लॉग इन हुए प्रयोक्ता पूरे पृष्ठ सीधे कैश से मिल सकता है। लेकिन एक लॉग-इन उपयोगकर्ता सक्षम नहीं हो सकता है (उपयोगकर्ता नाम के कारण, आदि)। तो उसके लिए, आप कैश से 1/2 पेज पर अपने विचार प्रस्तुत करने के लिए (क्योंकि वे उपयोगकर्ता वस्तु पर निर्भर नहीं है) कर सकता है। आपको अभी भी कैशिंग का लाभ मिलता है, लेकिन आवश्यकता के आधार पर इसे टायर किया जाएगा।

तुम सच में यातायात का एक बहुत उम्मीद कर रहे हैं, यह निश्चित रूप से Memcached में देख लायक है। MySQL आप के लिए आपके प्रश्नों की दुकान, और फिर मेम्कैश में सभी उपयोगकर्ता के भूमि कैश आइटम संग्रहीत करने दें ...

संपादित करें: अपने संपादित उत्तर देने के लिए:

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

लेकिन एहसास है कि यदि आप एक और सर्वर जोड़ते हैं, तो आपके पास या तो कैश का डुप्लिकेशंस होगा (जो अच्छी बात नहीं है), या आपके पूरे कैश को फिर से लिखना होगा परत। क्या शुरुआत से Memcached के साथ नहीं जाने का कोई कारण नहीं है?

संपादित करें 2:

यह अभी भी बहुत कॉल करने के लिए कठिन है: अपने नवीनतम संपादित उत्तर देने के लिए। मेरे पास एक ऐसा एप्लिकेशन है जिसमें लगभग 1.5 बिलियन पंक्तियां हैं (प्रति दिन लगभग 500k पर बढ़ रही हैं)। हम इस पर किसी भी कैशिंग का उपयोग नहीं करते हैं क्योंकि हमारे पास समवर्ती मुद्दे नहीं हैं। और यहां तक ​​कि अगर हमने किया, तो हम कैशिंग जोड़ने के बजाय अधिक MySQL सर्वर फेंकने से बेहतर होंगे क्योंकि कैश के किसी भी रूप में इतनी कम हिट दर होगी कि इसे जोड़ने के लिए विकास के समय के लायक नहीं होंगे।

और यही कारण है कि मैं गति के लिए कैशिंग नहीं होने के बारे में इतना अशिष्ट हूं। हमेशा एक वस्तु होगी जो कैश में नहीं है। तो यदि आप उन वस्तुओं में से किसी एक के साथ एक पेज हिट करते हैं, तो भी इसे तेज होना चाहिए। अंगूठे के नियम के रूप में, मैं कुछ भी कैश करने की कोशिश करता हूं जिसे अगले कुछ मिनटों में फिर से एक्सेस किया जाएगा (मैं वैसे भी अन्य अनुप्रयोगों पर उत्पादन में लगभग 5 मिनट तक रहने का समय रखता हूं)। इसलिए यदि आइटम उस समय अवधि में कुछ हिट से अधिक नहीं हो रहे हैं, या हिट रेट बहुत कम है (90% से कम), तो मैं उस आइटम को कैशिंग को परेशान नहीं करता ....

+0

धन्यवाद। यही वही था जो मैं उत्सुक था। – Chris

0

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

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