इसे स्वयं बनाए रखने की कोशिश करने के बजाय MySQL के अंतर्निहित क्वेरी कैश का उपयोग करें। यह कैश्ड क्वेरीज़ को टेबल पर लिखे जाने पर स्वचालित रूप से साफ़ कर देगा। साथ ही, यह मेमोरी में काम करता है इसलिए यह बहुत ही कुशल होना चाहिए...
इसके अलावा, केवल प्रश्नों को कैश न करें। रेंडरिंग चक्र में विभिन्न चरणों में एप्लिकेशन के संपूर्ण सेगमेंट को कैश करने का प्रयास करें। तो आप MySQL को प्रश्नों को कैश करने दे सकते हैं, फिर आप प्रत्येक व्यक्तिगत दृश्य (रेंडर किया गया), प्रत्येक व्यक्तिगत ब्लॉक और प्रत्येक पृष्ठ को कैश कर सकते हैं। फिर, आप चुन सकते हैं कि अनुरोध के आधार पर कैश से खींचना है या नहीं।
उदाहरण के लिए, एक गैर-लॉग-इन उपयोगकर्ता सीधे कैश से पूरा पृष्ठ प्राप्त कर सकता है। लेकिन एक लॉग-इन उपयोगकर्ता (उपयोगकर्ता नाम, आदि के कारण) सक्षम नहीं हो सकता है। तो उसके लिए, आप पृष्ठ पर अपने विचारों को कैश से 1/2 प्रस्तुत करने में सक्षम हो सकते हैं (क्योंकि वे उपयोगकर्ता ऑब्जेक्ट पर निर्भर नहीं हैं)। आपको अभी भी कैशिंग का लाभ मिलता है, लेकिन इसे आवश्यकता के आधार पर टियर किया जाएगा।
अगर आप वाकई बहुत अधिक ट्रैफ़िक की उम्मीद कर रहे हैं, तो यह निश्चित रूप से देखने लायक है Memcached
. MySQL को आपके लिए अपने प्रश्नों को संग्रहीत करने दें, और फिर सभी उपयोगकर्ता-भूमि कैश आइटम को memcache में संग्रहीत करें...
संपादित करें: अपने संपादन का उत्तर देने के लिए:
अगर एक निर्देशिका बड़ी हो जाती है तो फाइल सिस्टम धीमा हो सकता है। जब तक आप निर्देशिका द्वारा "नेमस्पेसिंग" कर रहे हैं (इसलिए प्रत्येक निर्देशिका में केवल कैश फ़ाइलों का एक छोटा सा हिस्सा होता है), आपको उस दृष्टिकोण से ठीक होना चाहिए। सटीक सीमा के लिए, यह वास्तव में आपके हार्डवेयर और फाइल सिस्टम पर किसी भी चीज़ से अधिक निर्भर करेगा। मुझे पता है कि एक निर्देशिका में फाइलों का भार होने पर EXT3 काफी धीमा हो जाता है (मेरे पास सचमुच सैकड़ों हजारों फाइलों वाली निर्देशिकाएं हैं, और इसे केवल stat()
करने में आधा सेकेंड तक लग सकता है। फाइलों में से एक, किसी भी प्रकार की निर्देशिका सूचीकरण को तो छोड़ दें)...
लेकिन महसूस करें कि यदि आप कोई अन्य सर्वर जोड़ते हैं, तो आपके पास या तो कैश का दोहराव होगा (जो अच्छी बात नहीं है), या आपको अपनी संपूर्ण कैश परत को फिर से लिखना होगा। क्या Memcached
. के साथ न जाने का कोई कारण है? शुरुआत से ही?
संपादित करें 2: अपने नवीनतम संपादन का उत्तर देने के लिए:
कॉल करना अभी भी बहुत कठिन है। मेरे पास एक ऐसा एप्लिकेशन है जिसमें लगभग 1.5 बिलियन पंक्तियों वाला डेटाबेस है (प्रति दिन लगभग 500k बढ़ रहा है)। हम इस पर किसी भी कैशिंग का उपयोग बिल्कुल नहीं करते क्योंकि हमारे पास समवर्ती मुद्दे नहीं हैं। और अगर हमने किया भी, तो बेहतर होगा कि हम कैशिंग जोड़ने के बजाय उस पर अधिक MySQL सर्वर फेंक दें क्योंकि कैश के किसी भी रूप में इतनी कम हिट दर होगी कि इसे जोड़ने के लिए विकास के समय के लायक नहीं होगा।
और यही कारण है कि मैं गति के लिए कैशिंग न करने के बारे में इतना अडिग हूं। हमेशा एक ऐसी वस्तु होगी जो कैश में नहीं है। इसलिए यदि आप उन वस्तुओं में से किसी एक पृष्ठ को हिट करते हैं, तो इसे अभी भी तेज़ होना चाहिए। अंगूठे के एक नियम के रूप में, मैं कुछ भी कैश करने का प्रयास करता हूं जिसे अगले कुछ मिनटों में फिर से एक्सेस किया जाएगा (मैं वैसे भी अन्य अनुप्रयोगों पर उत्पादन में लगभग 5 मिनट तक रहने का समय रखता हूं)। इसलिए यदि उस समय अवधि में आइटम को कुछ हिट से अधिक नहीं मिल रहा है, या हिट दर बहुत कम (90% से कम) है, तो मैं उस आइटम को कैशिंग करने की जहमत नहीं उठाता....