रेल के अंतर्निर्मित फ़्रैगमेंट कैशिंग से परे आपके कैशिंग को और बेहतर बनाने के लिए आज हम एक रणनीति के रूप में रूसी गुड़िया कैशिंग में गोता लगाएंगे।
फ्रैगमेंट कैशिंग
रेल के बिल्ट-इन फ़्रैगमेंट कैशिंग का उपयोग करते समय, रेंडर किए गए दृश्यों के कुछ हिस्सों को व्यू फ़्रैगमेंट के रूप में संग्रहीत किया जाता है और यदि उनका फिर से अनुरोध किया जाता है तो उनका पुन:उपयोग किया जाता है। इन संचित अंशों का पुन:उपयोग तब तक किया जाता है जब तक कि वे बासी नहीं हो जाते , जिसका अर्थ है कि वे पुराने हो चुके हैं क्योंकि उनके द्वारा प्रदर्शित डेटा फ़्रैगमेंट बनाने के बाद से बदल गया है। यदि आप और अधिक पढ़ना चाहते हैं, तो इस पहले की पोस्ट में हम फ्रैगमेंट कैशिंग को थोड़ा और गहराई से समझाते हैं।
<ब्लॉकक्वॉट>👋 और यदि आप केवल कैशिंग से अधिक व्यापक प्रदर्शन के बारे में पढ़ना चाहते हैं, तो हमारी रूबी प्रदर्शन निगरानी चेकलिस्ट देखें।
हालांकि यह एक अच्छी गति को बढ़ावा देता है, विशेष रूप से जटिल दृश्यों या बहुत सारे प्रस्तुत आंशिक दृश्यों के लिए, हम रूसी गुड़िया कैशिंग नामक एक दृष्टिकोण के साथ इसे दोगुना करके इसमें कुछ और सुधार कर सकते हैं। ।
इस कैशिंग दृष्टिकोण का उपयोग करते समय, दृश्य टुकड़े एक दूसरे के अंदर रखे जाते हैं, बहुत कुछ "मैत्रियोस्का" गुड़िया की तरह रणनीति का नाम दिया जाता है। कैश्ड फ़्रैगमेंट को छोटे टुकड़ों में तोड़कर, बाहरी कैशे को तेज़ी से रेंडर किया जा सकता है जब उसके नेस्टेड फ़्रैगमेंट में से केवल एक में परिवर्तन होता है।
रूसी डॉल कैशिंग उदाहरण
उदाहरण के तौर पर, आइए उत्पादों को बेचने वाले स्टोर का उपयोग करें। प्रत्येक उत्पाद में कई प्रकार हो सकते हैं, जो एक आइटम के कई रंगों को बेचने की अनुमति देते हैं, उदाहरण के लिए। अनुक्रमणिका पर, हम बिक्री के लिए उपलब्ध प्रत्येक उत्पाद के साथ-साथ उसके सभी प्रकार भी दिखाएंगे।
उत्पाद अनुक्रमणिका पर, हमने प्रत्येक उत्पाद को आंशिक रूप से कैश
. में लपेटा है खंड मैथा। हम उत्पाद
. का उपयोग कर रहे हैं कैश कुंजी बनाने के लिए ऑब्जेक्ट, जिसका उपयोग कैश किए गए टुकड़े को अमान्य करने के लिए किया जाता है। इसमें ऑब्जेक्ट की id, यह date_at update, और टेम्प्लेट ट्री का डाइजेस्ट होता है, इसलिए यदि ऑब्जेक्ट बदलता है, या टेम्प्लेट की सामग्री में परिवर्तन होता है, तो इसे स्वचालित रूप से बासी माना जाता है।
# app/views/products/index.html.erb
<h1>Products</h1>
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
टिप :हम स्पष्टता के लिए पूरे ब्लॉक को लिख रहे हैं, लेकिन आप <%=रेंडर आंशिक:'उत्पाद/उत्पाद', संग्रह:@products, कैश्ड:true %><का उपयोग करके प्रत्येक उत्पाद को कैशे ब्लॉक में रेंडर कर सकते हैं। /कोड> इसके बजाय।
आंशिक उत्पादों में, हम उत्पाद के प्रत्येक प्रकार के लिए एक पंक्ति प्रस्तुत करते हैं।
# app/views/products/_product.html.erb
<article>
<h1><%= product.title %></h1>
<ul>
<% product.variants.each do |variant| %>
<%= render variant %>
<% end %>
</ul>
</article>
कैश अमान्यता
हालांकि रेल के फ़्रैगमेंट कैशिंग में कैश कुंजियाँ कैशे अमान्यकरण को आसान बनाती हैं, आप कभी भी कैश सत्यापन (कंप्यूटर विज्ञान में प्रसिद्ध दो कठिन चीज़ों में से एक) के बारे में चिंता करने से पूरी तरह मुक्त नहीं होते हैं।
इस उदाहरण में, हम उत्पादों को आंशिक रूप से कैश करते हैं, जिसमें उत्पाद के प्रकारों की एक सूची होती है। चूंकि कैश कुंजी में वेरिएंट के बारे में कोई जानकारी शामिल नहीं है, इसलिए कोई भी नया जोड़ा गया वेरिएंट तब तक दिखाई नहीं देगा जब तक कि उत्पाद स्वयं भी बदल न जाए।
इसे ठीक करने का तरीका यह सुनिश्चित करना है कि उत्पाद करता है जब इसके किसी एक रूप में कुछ भी बदलता है तो बदल जाता है। ऐसा करने के लिए, हम उत्पाद के update_at
. को अपडेट करेंगे जब भी ऐसा होता है विशेषता। चूंकि यह बहुत आम है, इसलिए belongs_to
. के लिए एक तर्क दिया जाता है (और ActiveModel की अन्य संबंध विधियाँ), जिन्हें :touch
. कहा जाता है , जो हमारे लिए मूल वस्तु के update_at को स्वचालित रूप से अपडेट कर देगा।
class Variant < ApplicationRecord
belongs_to :product, touch: true
end
नेस्टेड टुकड़े
अब जबकि हमने यह सुनिश्चित कर लिया है कि जब उत्पाद के फ्रैगमेंट उनके वेरिएंट बदलते हैं, तो वेरिएन्ट्स को भी कैश करने का समय आ गया है। पहले की तरह, हम एक कैश
जोड़ेंगे हर एक के आसपास ब्लॉक करें।
<article>
<h1><%= product.title %></h1>
<ul>
<% product.variants.each do |variant| %>
<% cache(variant) do %>
<%= render variant %>
<% end %>
<% end %>
</ul>
</article>
टिप :हम स्पष्टता के लिए पूरे ब्लॉक को लिख रहे हैं, लेकिन आप <%=रेंडर आंशिक:'वेरिएंट/वेरिएंट', संग्रह:उत्पाद.वेरिएंट, कैश्ड:ट्रू %> का उपयोग करके कैशे ब्लॉक में प्रत्येक संस्करण को रेंडर कर सकते हैं।
इसके बजाय।
ठंडे कैश पर (आप rake tmp:cache:clear
चलाकर कैशे साफ़ कर सकते हैं ), पहला अनुरोध प्रत्येक उत्पाद को आंशिक रूप से प्रस्तुत करेगा।
अब पृष्ठ का अनुरोध करते समय (rails dev:cache
चलाकर विकास में कैशिंग चालू करना न भूलें ), प्रत्येक उत्पाद आंशिक को आंशिक के रूप में कैश किया जाएगा, और दूसरा अनुरोध कैश किए गए टुकड़े लौटाएगा।
Started GET "/products" for 127.0.0.1 at 2018-03-30 14:51:38 +0200
Processing by ProductsController#index as HTML
Rendering products/index.html.erb within layouts/application
Product Load (0.2ms) SELECT "products".* FROM "products"
Variant Load (0.9ms) SELECT "variants".* FROM "variants" WHERE "variants"."product_id" IN (27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51)
Rendered variants/_variant.html.erb (0.5ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.0ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered products/_product.html.erb (44.8ms) [cache miss]
...
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered variants/_variant.html.erb (0.1ms)
Rendered products/_product.html.erb (46.2ms) [cache miss]
Rendered products/index.html.erb within layouts/application (1378.6ms)
Completed 200 OK in 1414ms (Views: 1410.5ms | ActiveRecord: 1.1ms)
Started GET "/products" for 127.0.0.1 at 2018-03-30 14:51:41 +0200
Processing by ProductsController#index as HTML
Rendering products/index.html.erb within layouts/application
Product Load (0.3ms) SELECT "products".* FROM "products"
Variant Load (12.7ms) SELECT "variants".* FROM "variants" WHERE "variants"."product_id" IN (27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51)
Rendered products/index.html.erb within layouts/application (48.1ms)
Completed 200 OK in 76ms (Views: 59.0ms | ActiveRecord: 13.0ms)
वोइला:रूसी गुड़िया जादू
किसी एक वेरिएंट को बदलते समय रूसी गुड़िया कैशिंग का जादू देखा जा सकता है। किसी एक प्रकार के परिवर्तन के बाद अनुक्रमणिका का फिर से अनुरोध करते समय, संचित उत्पाद खंड को फिर से प्रस्तुत किया जाता है क्योंकि इसका updated_at
विशेषता बदल गई।
उत्पाद आंशिक में उत्पाद के प्रत्येक प्रकार शामिल हैं। हमारे द्वारा अभी-अभी बदले गए संस्करण के लिए कैश्ड टुकड़ा पुराना है, इसलिए इसे पुन:उत्पन्न करने की आवश्यकता है, लेकिन अन्य वेरिएंट नहीं बदले हैं, इसलिए उनके कैश्ड अंशों का पुन:उपयोग किया जाता है। लॉग में, हम देख सकते हैं कि संस्करण और उत्पाद आंशिक दोनों एक बार प्रस्तुत किए जा रहे हैं।
Started GET "/products" for 127.0.0.1 at 2018-03-30 14:52:04 +0200
Processing by ProductsController#index as HTML
Rendering products/index.html.erb within layouts/application
Product Load (0.3ms) SELECT "products".* FROM "products"
Variant Load (1.2ms) SELECT "variants".* FROM "variants" WHERE "variants"."product_id" IN (27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51)
Rendered variants/_variant.html.erb (0.5ms)
Rendered products/_product.html.erb (13.3ms) [cache miss]
Rendered products/index.html.erb within layouts/application (45.9ms)
Completed 200 OK in 78ms (Views: 73.5ms | ActiveRecord: 1.5ms)
अंतिम परिणाम
इस तरह कैश फ़्रेग्मेंट को नेस्ट करके, जब तक कैश पूरी तरह से खाली न हो, तब तक दृश्य लगभग पूरी तरह से प्रस्तुत नहीं किया जाता है। यहां तक कि जब डेटा बदलता है, तो अधिकांश रेंडर किए गए पेज सीधे कैशे से प्रदर्शित होते हैं।
हमें उम्मीद है कि इससे आपको अपने ऐप्स के प्रदर्शन में नई जानकारी प्राप्त करने में मदद मिली होगी। इसलिए हम यहां हैं। यदि आपको कैशिंग पर यह लेख पसंद आया है, और आप और अधिक के लिए भूखे हैं, तो कुछ अतिरिक्त स्नैक्स हैं ActiveRecord के काउंटर कैश के बारे में हमारी पोस्ट, रेल में कैश स्टोर के बारे में एक, संग्रह कैशिंग के बारे में पोस्ट और एक टुकड़ा के बारे में रेल में कैशिंग हमने पहले पोस्ट में उल्लेख किया था।