खोज…


रूसी गुड़िया कैशिंग

आप अन्य कैश्ड अंशों के अंदर कैश्ड अंशों को घोंसला बनाना चाहते हैं। इसे 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



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow