क्लाइंट-साइड कैशिंग के साथ रेल प्रदर्शन बढ़ाएँ:सशर्त GET अनुरोधों को मास्टर करें
<पी> रूसी गुड़िया कैशिंग के अलावा, रेल ऐप्स में प्रदर्शन को तेज़ करने के लिए और भी तकनीकें हैं। इस बार हम रेल्स के अंतर्निहित सशर्त GET समर्थन को देखेंगे, जो आपको उपयोगकर्ता के ब्राउज़र कैश में रेंडर किए गए पृष्ठों को संग्रहीत करने की अनुमति देता है। <पी> 👋 और यदि आप कैशिंग के बाहर प्रदर्शन के बारे में अधिक पढ़ना पसंद करते हैं, तो हमने रूबी (ऑन रेल्स) प्रदर्शन के बारे में और भी बहुत कुछ लिखा है, हमारी रूबी प्रदर्शन निगरानी चेकलिस्ट देखें। ईटैग और अंतिम-संशोधित हेडर
<पी> जब आपका ब्राउज़र आपके रेल ऐप में किसी पेज के लिए HTTP GET अनुरोध निष्पादित करता है, तो राउटर इसे आपके नियंत्रक कार्यों में से एक से लिंक कर देगा। फिर नियंत्रक डेटाबेस से आवश्यक डेटा का अनुरोध करेगा और दृश्य प्रस्तुत करेगा। एक HTTP प्रतिक्रिया (200 OK के साथ)। प्रतिक्रिया कोड के रूप में) फिर आपके ब्राउज़र को पार्स करने और प्रदर्शित करने के लिए प्रतिक्रिया के मुख्य भाग में दृश्य से प्रस्तुत HTML के साथ ब्राउज़र पर वापस भेज दिया जाता है। <पी> जब संसाधन के लिए दोबारा अनुरोध किया जाएगा, तो हम उसी पाइपलाइन से गुजरेंगे। कुछ स्थितियों में, यह अनावश्यक है क्योंकि इस बीच पृष्ठ नहीं बदला। उसके लिए, HTTP अपना ETag प्रदान करता है और अंतिम-संशोधित शीर्ष लेख इनका उपयोग करके, ब्राउज़र प्रतिक्रिया निकाय को संग्रहीत कर सकता है, और हेडर का उपयोग करके उन्हें पुराना होने पर अमान्य कर सकता है। <पी> ईटैग्स , या इकाई टैग , क्लाइंट-साइड कैश सत्यापन के लिए उपयोग किया जाता है, इसलिए आप उन्हें अपने HTTP प्रतिक्रियाओं के लिए कैश कुंजी के रूप में सोच सकते हैं। वे प्रत्येक अनुरोध के लिए HTTP प्रतिक्रिया शीर्षलेख में ब्राउज़र को वापस भेज दिए जाते हैं। <पी> ~ $ कर्ल -I http://localhost:3000/products/1HTTP/1.1 200 OK...ETag:W/"9462d76cc55aeb6249fa990e39231c7c"अंतिम-संशोधित:बुधवार, 25 अप्रैल 2018 08:27:04 GMT... <पी> यदि प्रतिक्रिया बाद में दोहराई जाती है, तो ब्राउज़र अपने कैश में मौजूदा प्रतिक्रिया ढूंढता है और अंतिम अनुरोध से संग्रहीत ईटैग को If-None-Match के रूप में उपयोग करता है। शीर्षक. यह हेडर हमारे रेल ऐप को बताएगा कि हमारे पास पहले से ही कैश में यह संस्करण है। <पी> यदि अनुरोध का ईटैग वर्तमान टैग से मेल खाता है, तो रेल एक 304 Not Modified भेजेगा प्रतिक्रिया निकाय के बिना प्रतिक्रिया। यह ब्राउज़र को इसके बजाय अपने स्थानीय कैश से किसी एक का उपयोग करने के लिए कहेगा। <पी> ~ $ कर्ल -आई -एच 'इफ-नोन-मैच:डब्ल्यू/'9462डी76सीसी55एईबी6249एफए990ई39231सी7सी'' http://localhost:3000/प्रोडक्ट्स/1HTTP/1.1 304 संशोधित नहीं...ईटैग:W/"9462d76cc55aeb6249fa990e39231c7c"अंतिम-संशोधित:बुधवार, 25 अप्रैल 2018 08:27:04 GMT... रेल में सशर्त GET अनुरोध
<पी> यदि हम स्थानीय रेल एप्लिकेशन से एक पृष्ठ का अनुरोध करते हैं, तो हम देख सकते हैं कि रेल प्रत्येक अनुरोध के लिए स्वचालित रूप से एक ईटैग जोड़ता है। यदि हम एक ही पृष्ठ पर लगातार दो बार अनुरोध करते हैं, तो हम प्रत्येक अनुरोध के लिए Etag परिवर्तन देख सकते हैं। <पी> जबकि रेल डिफ़ॉल्ट रूप से प्रत्येक अनुरोध के लिए एक Etag उत्पन्न करता है, यह इसे उत्पन्न करने के लिए संपूर्ण प्रतिक्रिया निकाय के डाइजेस्ट का उपयोग करता है। इसका मतलब है <%= csrf_meta_tags %> लेआउट में ईटैग बंद हो जाता है, क्योंकि प्रत्येक अनुरोध के लिए सीएसआरएफ-टोकन मेटा टैग बदल जाता है। क्योंकि यह प्रत्येक अनुरोध के लिए मुख्य भाग को बदल देता है, Etag अमान्य हो जाता है और स्थानीय कैश को पुराना चिह्नित कर दिया जाता है। <पी> इसके अलावा, रेल कभी भी 304 Not Modified नहीं लौटाएगा डिफ़ॉल्ट रूप से, क्योंकि स्थानीय कैश को हमारे नियंत्रक में कभी भी स्पष्ट रूप से ताज़ा के रूप में चिह्नित नहीं किया जाता है। fresh_when और stale?
<पी> सशर्त GET के लिए अनुरोध हेडर से Etags का उपयोग करने के लिए, हमें स्थानीय कैश में किसी ऑब्जेक्ट को स्पष्ट रूप से "ताजा" के रूप में चिह्नित करने की आवश्यकता है। उदाहरण के लिए, किसी उत्पाद को दिखाने वाले पृष्ठ के लिए, हम कैश को तब तक ताज़ा रख सकते हैं जब तक कि उत्पाद और दृश्य टेम्पलेट नहीं बदलते। उस काम को करने के लिए, हम दो काम करेंगे। - हम स्पष्ट रूप से वे मान सेट करेंगे जो हमारे Etag को बनाएंगे, क्योंकि संपूर्ण प्रतिक्रिया निकाय का उपयोग करने के लिए हमें यह जांचने के लिए संपूर्ण निकाय को प्रस्तुत करने की आवश्यकता होगी कि कैश्ड प्रतिक्रिया मान्य है या नहीं, जो स्थानीय रूप से पृष्ठ को कैशिंग करने से स्पीडअप को नकारती है।
- हम अनुरोध हेडर से Etag की तुलना उस Etag से करेंगे जिसके बारे में हमने पहले अनुमान लगाया था दृश्य प्रस्तुत करना, और यदि वे मेल खाते हैं तो हम प्रतिपादन छोड़ देंगे।
<पी> रेल सहायकों के साथ आती है जो हमारे लिए सब कुछ करती है। हम fresh_when का उपयोग करके उत्पाद पर ईटैग और अंतिम-संशोधित तिथि को स्पष्ट रूप से आधार बना सकते हैं . <पी> यदि आपके पास स्पष्ट respond_to है ब्लॉक करें, stale? का उपयोग करें fresh_when के बजाय . <पी> अब, उत्पाद पृष्ठों में से किसी एक का अनुरोध करने पर प्रतिक्रिया स्थानीय रूप से कैश हो जाएगी। उसी पेज पर आने वाले किसी भी अनुरोध में रेल्स को यह बताने के लिए Etag शामिल होगा कि हमारे पास एक कैश्ड प्रतिक्रिया है, जिसकी तुलना नए Etag से की जाती है। यदि वह मेल खाता है, तो रेल्स पेज को रेंडर करना छोड़ देगा, और एक 304 Not Modified लौटाएगा तुरंत. <पी>
<पी> ध्यान दें :पेज को रिफ्रेश करने पर हमेशा पेज के अनकैच्ड संस्करण का अनुरोध किया जाएगा। यह जांचने के लिए कि क्या आपके सशर्त GET काम करते हैं, एक लिंक का उपयोग करके या इसके बजाय बैक बटन का उपयोग करके नेविगेट करें। <पी> आपको यह लेख और ऐपसिग्नल अकादमी श्रृंखला के पिछले लेख कैसे लगे? हमारे पास रेल्स में कैशिंग के बारे में कुछ और लेख हैं, लेकिन कृपया हमें यह बताने में संकोच न करें कि आप हमसे आगे क्या लिखना चाहते हैं (कैशिंग-संबंधित या अन्यथा)!
जेफ क्रीफ्टमीजर