Ruby on Rails
कैशिंग
खोज…
रूसी गुड़िया कैशिंग
आप अन्य कैश्ड अंशों के अंदर कैश्ड अंशों को घोंसला बनाना चाहते हैं। इसे Russian doll caching
कहा जाता है।
Russian doll caching
का लाभ यह है कि यदि किसी एकल उत्पाद को अद्यतन किया जाता है, तो बाहरी टुकड़े को पुन: उत्पन्न करने पर अन्य सभी आंतरिक टुकड़ों का पुन: उपयोग किया जा सकता है।
जैसा कि पिछले भाग में बताया गया है, एक कैश्ड फ़ाइल समाप्त हो जाएगी यदि updated_at
का मान उस रिकॉर्ड के लिए बदल जाता है जिस पर कैश्ड नया निर्भर करता है। हालाँकि, यह किसी भी कैश को समाप्त नहीं करेगा खंड के भीतर निहित है।
उदाहरण के लिए, निम्नलिखित दृश्य लें:
<% cache product do %>
<%= render product.games %>
<% end %>
जो बदले में इस दृश्य को प्रस्तुत करता है:
<% cache game do %>
<%= render game %>
<% end %>
यदि गेम की कोई विशेषता बदली जाती है, तो updated_at
किया updated_at
मूल्य वर्तमान समय पर सेट हो जाएगा, जिससे कैश समाप्त हो जाएगा।
हालाँकि, क्योंकि updated_at
को उत्पाद ऑब्जेक्ट के लिए नहीं बदला जाएगा, इसलिए कैश समाप्त नहीं होगा और आपका ऐप बासी डेटा की सेवा देगा। इसे ठीक करने के लिए, हम मॉडल को स्पर्श विधि से जोड़ते हैं:
class Product < ApplicationRecord
has_many :games
end
class Game < ApplicationRecord
belongs_to :product, touch: true
end
एसक्यूएल कैशिंग
क्वेरी कैशिंग एक Rails
सुविधा है जो प्रत्येक क्वेरी द्वारा लौटाए गए परिणाम सेट को कैश करती है। यदि Rails
उस अनुरोध के लिए फिर से उसी क्वेरी का सामना करती है, तो यह डेटाबेस के खिलाफ क्वेरी को चलाने के विपरीत सेट किए गए कैश्ड परिणाम का उपयोग करेगा।
उदाहरण के लिए:
class ProductsController < ApplicationController
def index
# Run a find query
@products = Product.all
...
# Run the same query again
@products = Product.all
end
end
दूसरी बार उसी क्वेरी को डेटाबेस के विरुद्ध चलाया जाता है, यह वास्तव में डेटाबेस को हिट करने वाला नहीं है। पहली बार परिणाम उस क्वेरी से लौटाया जाता है जिसे क्वेरी कैश (मेमोरी में) में संग्रहीत किया जाता है और दूसरी बार इसे मेमोरी से खींचा जाता है।
हालाँकि, यह नोट करना महत्वपूर्ण है कि क्वेरी कैश किसी कार्रवाई की शुरुआत में बनाई जाती है और उस कार्रवाई के अंत में नष्ट हो जाती है और इस प्रकार केवल कार्रवाई की अवधि के लिए बनी रहती है। यदि आप क्वेरी परिणामों को अधिक लगातार फैशन में संग्रहीत करना चाहते हैं, तो आप निम्न स्तर के कैशिंग के साथ कर सकते हैं।
खुशबू कैशिंग
ActiveSupport द्वारा प्रदान की गई Rails.cache
उपयोग अनुरोधों के दौरान किसी भी क्रमबद्ध रूबी ऑब्जेक्ट को कैश करने के लिए किया जा सकता है।
किसी दिए गए कुंजी के लिए कैश से मूल्य प्राप्त करने के लिए, cache.read
उपयोग cache.read
:
Rails.cache.read('city')
# => nil
कैश का मान लिखने के लिए cache.write
का उपयोग करें:
Rails.cache.write('city', 'Duckburgh')
Rails.cache.read('city')
# => 'Duckburgh'
वैकल्पिक रूप से, कैश से मूल्य पढ़ने के लिए cache.fetch
का उपयोग करें और यदि कोई मूल्य नहीं है तो वैकल्पिक रूप से डिफ़ॉल्ट लिखें:
Rails.cache.fetch('user') do
User.where(:is_awesome => true)
end
पारित ब्लॉक का रिटर्न वैल्यू दिए गए कुंजी के तहत कैश को सौंपा जाएगा, और फिर वापस आ जाएगा।
आप एक कैश एक्सपायरी भी निर्दिष्ट कर सकते हैं:
Rails.cache.fetch('user', :expires_in => 30.minutes) do
User.where(:is_awesome => true)
end
पेज कैशिंग
आप अलग-अलग पृष्ठों को कैश करने के लिए ActionPack page_caching रत्न का उपयोग कर सकते हैं। यह एक स्थिर HTML फ़ाइल के रूप में एक गतिशील अनुरोध का परिणाम संग्रहीत करता है, जिसे बाद के अनुरोधों पर गतिशील अनुरोध के स्थान पर परोसा जाता है। README में पूर्ण सेटअप निर्देश हैं। एक बार सेट हो जाने के बाद, किसी क्रिया के परिणाम को कैश करने के लिए नियंत्रक में caches_page
वर्ग विधि का उपयोग करें:
class UsersController < ActionController::Base
caches_page :index
end
संग्रहीत HTML फ़ाइल को हटाकर कैश की समय सीमा समाप्त करने के लिए expire_page
का उपयोग करें:
class UsersController < ActionController::Base
caches_page :index
def index
@users = User.all
end
def create
expire_page :action => :index
end
end
expire_page
सिंटैक्स url_for
और दोस्तों की नकल करते हैं।
HTTP कैशिंग
रेल> = 3 बॉक्स से बाहर HTTP कैशिंग क्षमताओं के साथ आता है। यह Cache-Control
और ETag
हेडर का उपयोग यह नियंत्रित करने के लिए करता है कि एक ग्राहक या मध्यस्थ (जैसे कि सीडीएन) एक पेज को कितने समय तक कैश कर सकता है।
नियंत्रक क्रिया में, उस कार्रवाई के लिए कैशिंग की लंबाई निर्धारित करने के लिए expires_in
का उपयोग करें:
def show
@user = User.find params[:id]
expires_in 30.minutes, :public => true
end
किसी भी आने वाले ग्राहक या मध्यस्थ पर कैश्ड संसाधन की तत्काल समाप्ति के लिए expires_now
का उपयोग करें:
def show
@users = User.find params[:id]
expires_now if params[:id] == 1
end
कार्रवाई कैशिंग
पेज कैशिंग की तरह, एक्शन कैशिंग पूरे पृष्ठ को कैश करता है। अंतर यह है कि अनुरोध रेल के ढेर से टकराता है ताकि कैश सेवा करने से पहले फ़िल्टर चलाए जाएं। यह Rails से एक्शनपैक-एक्शन_कास्टिंग मणि तक निकाला जाता है।
एक सामान्य उदाहरण एक कार्रवाई का कैशिंग है जिसे प्रमाणीकरण की आवश्यकता होती है:
class SecretIngredientsController < ApplicationController
before_action :authenticate_user!, only: :index, :show
caches_action :index
def index
@secret_ingredients = Recipe.find(params[:recipe_id]).secret_ingredients
end
end
विकल्पों में शामिल हैं :expires_in
, एक कस्टम :cache_path
(कई मार्गों के साथ क्रियाओं के लिए जिन्हें अलग-अलग कैश किया जाना चाहिए) और :if
/ :unless
कार्रवाई को कैश नहीं किया जाना चाहिए।
class RecipesController < ApplicationController
before_action :authenticate_user!, except: :show
caches_page :show
caches_action :archive, expires_in: 1.day
caches_action :index, unless: { request.format.json? }
end
जब लेआउट में डायनामिक कंटेंट होता है, तो लेआउट को पास करके केवल एक्शन कॉन्टेंट को कैश करें layout: false
।