एक नया रेल्स ऐप जनरेट करते समय, कैशिंग पहले से सेट अप होती है। इससे शुरुआत करना उतना ही तेज़ होता है जितना कि cache हेल्पर का उपयोग करके कुछ व्यू फ्रैगमेंट को रैप करना या बाहरी API परिणामों को संग्रहीत करने के लिए Rails.cache.fetch का उपयोग करना। कैश्ड डेटा रेल्स के कैश स्टोर में से एक में संग्रहीत होता है, जो डेटा को मेमोरी, मेमकैश्ड, रेडिस, या यहां तक कि सीधे डिस्क पर लिख सकता है।
लेकिन विभिन्न कैश स्टोर में से कौन सा किस स्थिति के लिए सर्वोत्तम है? इस अवलोकन में, हम प्रत्येक विकल्प पर एक नज़र डालेंगे।
👋 और अगर आपको यह लेख पसंद आया, तो हमने रूबी (ऑन रेल्स) प्रदर्शन के बारे में बहुत कुछ लिखा है, हमारी रूबी प्रदर्शन निगरानी चेकलिस्ट देखें।
फाइल स्टोर
:file_store का उपयोग डिफ़ॉल्ट रूप से तब किया जाता है जब कोई कैश स्टोर विशेष रूप से कॉन्फ़िगर नहीं किया जाता है। जैसा कि नाम से पता चलता है, यह कैश एंट्री को फाइल सिस्टम पर लिखता है। ये एप्लिकेशन के रूट में tmp/cache डायरेक्टरी में समाप्त होते हैं जब तक कि आप cache_store कॉन्फ़िगरेशन को :file_store पर स्पष्ट रूप से सेट करके और उस डायरेक्टरी का पथ पास करके एक अलग स्थान का चयन नहीं करते जिसका आप उपयोग करना चाहते हैं।
config.cache_store = :file_store , "/path/to/cache/directory"
कैश फाइलें डिस्क पर सहेजी जाती हैं और वे स्वचालित रूप से पर्ज नहीं होती हैं। इसका मतलब है कि आपको यह सुनिश्चित करने के लिए स्वयं उन्हें हटाने का ध्यान रखना होगा कि वे आपकी डिस्क को न भर दें। उदाहरण के लिए, समय-समय पर Rails.cache.cleanup चलाने से आपका कैश एक्सपायर्ड एंट्री से मुक्त रहेगा।
फाइल स्टोर विकास में उपयोगी है क्योंकि प्रत्येक एंट्री कैश डायरेक्टरी में संग्रहीत होती है, जिससे आप इसकी फाइल को हटाकर कैश से एक आइटम को ड्रॉप कर सकते हैं। यह कैश इनवैलिडेशन के परीक्षण के लिए उपयोगी है, उदाहरण के लिए।
उत्पादन में, फाइल स्टोर उपयोगी होता है जब प्रत्येक सर्वर प्रोसेस एक ही फाइल सिस्टम पर चलता है। हालांकि यह मेमोरी-आधारित कैश स्टोर की तुलना में धीमा है, फाइल स्टोर बहुत अच्छा हो सकता है यदि कैश संभावित रूप से बहुत बड़ा हो सकता है।
मेमोरी स्टोर
संस्करण 5.0 से, रेल्स एक नया एप्लिकेशन जनरेट करते समय विकास कॉन्फ़िगरेशन में स्वचालित रूप से :memory_store सेट करता है। मेमोरी स्टोर का उपयोग करते समय, कैश्ड डेटा रूबी वेब सर्वर की प्रोसेस में मेमोरी में रखा जाता है।
क्योंकि डेटा आपके वेब सर्वर के समान प्रोसेस में मेमोरी में रखा जाता है, मेमोरी स्टोर विकास में उपयोग करने के लिए बहुत अच्छा है क्योंकि यह आपके विकास वेब सर्वर को रीस्टार्ट करते ही स्वचालित रूप से साफ़ हो जाता है।
डिफ़ॉल्ट रूप से, इन-मेमोरी स्टोर 32 मेगाबाइट का उपयोग करेगा, लेकिन आप कैश स्टोर को कॉन्फ़िगर करते समय :size विकल्प पास करके इसे ओवरराइड कर सकते हैं।
config.cache_store = :memory_store, { size: 16.megabytes }
जब कैश भर जाता है, तो कम से कम हाल ही में उपयोग की गई एंट्री को नई एंट्री के लिए जगह बनाने के लिए स्वचालित रूप से कैश से हटा दिया जाता है।
उत्पादन में मेमोरी स्टोर का उपयोग करना संभव है (और यह सबसे तेज़ समाधान है जो आप पा सकते हैं), लेकिन कई सर्वर प्रोसेस चलाने वाले सिस्टम के लिए इसकी अनुशंसा नहीं की जाती है। चूंकि प्रोसेस एक-दूसरे के कैश तक नहीं पहुंच सकते, प्रत्येक प्रोसेस को कैश की अपनी प्रति बनाए रखने की आवश्यकता होगी।
मेमकैश स्टोर
:mem_cache_store डाली जेम और मेमकैश्ड का उपयोग करके एंट्री को एक केंद्रीकृत, इन-मेमोरी कैश में संग्रहीत करता है।
डेटा को रूबी सर्वर प्रोसेस के बजाय एक अलग प्रोसेस में रखा जाता है। इसके कारण, जब आपका ऐप रीस्टार्ट होता है तो कैश ड्रॉप नहीं होता बल्कि तब तक मेमोरी में रहता है जब तक मेमकैश्ड सर्वर चलता रहता है। जब वह रीस्टार्ट होता है, तो आप एक नए कैश के साथ शुरू करेंगे।
मेमकैश स्टोर डिफ़ॉल्ट रूप से मान लेगा कि कैश सर्वर लोकलहोस्ट पर चल रहा है, लेकिन आप रिमोट सर्वर का उपयोग करने के लिए एक या एक से अधिक पते पास कर सकते हैं।
config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com"
मेमकैश्ड डिफ़ॉल्ट रूप से अधिकतम 64 एमबी के कैश आकार का उपयोग करने के लिए कॉन्फ़िगर किया गया है, लेकिन इसे कमांड लाइन विकल्पों या memcached.conf फाइल में कॉन्फ़िगर किया जा सकता है। मेमोरी स्टोर की तरह, जब कैश अपने अधिकतम आकार तक पहुंचता है तो यह कम से कम हाल ही में उपयोग की गई वस्तुओं को हटाना शुरू कर देगा।
:mem_cache_store उत्पादन वातावरण के लिए पसंदीदा कैश स्टोर है। एक केंद्रीय मेमकैश्ड सर्वर का उपयोग करके, कैश को कई वेब सर्वरों के बीच साझा किया जा सकता है और रिमोट मेमकैश्ड सर्वर का उपयोग करते समय कई होस्ट पर भी।
रेडिस कैश स्टोर
रेल्स 5.2 ने :redis_cache_store स्टोर पेश किया, जो आपको मेमकैश स्टोर का उपयोग करने की तरह ही रेडिस में कैश एंट्री संग्रहीत करने की अनुमति देता है।
रेल्स कैश स्टोर के रूप में रेडिस का उपयोग करने के लिए, एक समर्पित रेडिस कैश का उपयोग करें जिसे LRU (लीस्ट रिसेंटली यूज़्ड) कैश के रूप में सेट किया गया हो, बजाय अपने मौजूदा रेडिस सर्वर पर स्टोर को इंगित करने के, ताकि यह सुनिश्चित हो सके कि जब स्टोर अपने अधिकतम आकार तक पहुंचता है तो एंट्री स्टोर से हटा दी जाती हैं।
रेडिस स्टोर रेडिस जेम (रेडिस::डिस्ट्रीब्यूटेड सहित) और हायर्डिस के साथ काम करता है, साथ ही कई कॉन्फ़िगरेशन विकल्पों के लिए समर्थन प्रदान करता है, जैसे एक या एक से अधिक रिमोट सर्वर सेट करना।
cache_servers = %w[redis://cache-01:6379/0 redis://cache-02:6379/0]
config.cache_store = :redis_cache_store, { url: cache_servers }
रेडिस समय-समय पर डेटासेट को डिस्क पर लिखेगा, इसलिए आपका अधिकांश कैश्ड डेटा कैश सर्वर के रीस्टार्ट होने पर बच जाएगा। विकास में, कंसोल का उपयोग करके Rails.cache.delete से कैश्ड आइटम को हटाया जा सकता है।
उत्पादन में, रेडिस एक केंद्रीकृत कैश स्टोर प्रदान करने में मेमकैश्ड को टक्कर देता है। हालांकि रेल्स ऐप्स में इसका उपयोग अभी तक मेमकैश्ड जितना व्यापक नहीं है, रेडिस स्टोर भविष्य में एक लोकप्रिय रेल्स कैश स्टोर बनने की संभावना है।
कौन सा कैश स्टोर उपयोग करें?
सामान्य तौर पर, रेल्स के फाइल और मेमोरी स्टोर विकास के लिए बहुत अच्छे हैं लेकिन छोटे एप्लिकेशन के लिए उत्पादन में उपयोग किए जा सकते हैं जब उनकी चेतावनियों को जानते और समझते हैं। उत्पादन-ग्रेड मेमकैश्ड और रेडिस स्टोर आमतौर पर बड़े उत्पादन ऐप्स के लिए बेहतर विकल्प होते हैं, खासकर जब कई वेब सर्वर कई होस्ट पर चल रहे हों।
यह रेल्स में कैश स्टोर का हमारा अवलोकन समाप्त करता है। प्रत्येक स्टोर के लिए अधिक जानकारी और कॉन्फ़िगरेशन विकल्पों के लिए रेल्स गाइड में कैश स्टोर अनुभाग देखना सुनिश्चित करें।
आपको यह लेख और ऐपसिग्नल अकादमी श्रृंखला में पिछले लेख कैसे लगे? हमारे पास रेल्स में कैशिंग के बारे में कुछ और लेख हैं, लेकिन कृपया हमें बताने में संकोच न करें कि आप आगे क्या लिखना चाहते हैं (कैशिंग से संबंधित या अन्यथा)!