রেলের বিল্ট-ইন ফ্র্যাগমেন্ট ক্যাশিংয়ের বাইরে আপনার ক্যাশিংকে আরও উন্নত করার কৌশল হিসেবে আজ আমরা রাশিয়ান ডল ক্যাশিং-এ ডুব দেব।
ফ্র্যাগমেন্ট ক্যাশিং
রেলের বিল্ট-ইন ফ্র্যাগমেন্ট ক্যাশিং ব্যবহার করার সময়, রেন্ডার করা ভিউগুলির অংশগুলি ভিউ ফ্র্যাগমেন্ট হিসাবে সংরক্ষণ করা হয় এবং আবার অনুরোধ করা হলে পুনরায় ব্যবহার করা হয়। এই ক্যাশে করা টুকরোগুলি বাসি না হওয়া পর্যন্ত পুনরায় ব্যবহার করা হয় , মানে সেগুলি পুরানো কারণ তারা যে ডেটা প্রদর্শন করে তা খণ্ডটি তৈরি করার পর পরিবর্তিত হয়েছে৷ আপনি যদি আরও পড়তে চান, এই আগের পোস্টে আমরা খণ্ড ক্যাশিংকে আরও গভীরভাবে ব্যাখ্যা করি৷
👋 এবং আপনি যদি ক্যাশে করার চেয়ে আরও বিস্তৃত কর্মক্ষমতা সম্পর্কে পড়তে চান তবে আমাদের রুবি পারফরম্যান্স মনিটরিং চেকলিস্টটি দেখুন৷
যদিও এটি একটি চমৎকার গতি বৃদ্ধি করে, বিশেষ করে জটিল দৃশ্য বা প্রচুর রেন্ডার করা আংশিক দৃশ্যগুলির জন্য, আমরা রাশিয়ান ডল ক্যাশিং নামের একটি পদ্ধতির সাথে দ্বিগুণ করে এটিকে আরও উন্নত করতে পারি। .
এই ক্যাশিং পদ্ধতি ব্যবহার করার সময়, ভিউ টুকরো একে অপরের ভিতরে স্থাপন করা হয়, অনেকটা "ম্যাট্রিওশকা" পুতুলের মতো কৌশলটির নামকরণ করা হয়েছে। ক্যাশে করা টুকরোগুলোকে ছোট ছোট টুকরো করে বিভক্ত করে, বাইরের ক্যাশে দ্রুত রেন্ডার করা যেতে পারে যখন শুধুমাত্র একটি নেস্টেড টুকরো পরিবর্তিত হয়।
একটি রাশিয়ান পুতুল ক্যাশিং উদাহরণ
উদাহরণ হিসাবে, আসুন এমন একটি দোকান ব্যবহার করি যা পণ্য বিক্রি করে। প্রতিটি পণ্যের বেশ কয়েকটি বৈকল্পিক থাকতে পারে, যা একটি আইটেমের একাধিক রঙ বিক্রি করার অনুমতি দেয়, উদাহরণস্বরূপ। সূচীতে, আমরা প্রতিটি পণ্য প্রদর্শন করব যা বিক্রয়ের জন্য উপলব্ধ, সেইসাথে এর সমস্ত রূপগুলিও৷
পণ্যের সূচীতে, আমরা প্রতিটি পণ্যকে একটি ক্যাশে
দিয়ে আংশিকভাবে মোড়ানো করেছি ব্লক আমরা পণ্য
ব্যবহার করছি ক্যাশে কী তৈরি করার জন্য অবজেক্ট, যা ক্যাশে করা খণ্ডটিকে অবৈধ করতে ব্যবহৃত হয়। এটি অবজেক্টের আইডি নিয়ে গঠিত, এটি আপডেট করা হয়েছে_এ তারিখ, এবং টেমপ্লেট ট্রির একটি ডাইজেস্ট, তাই বস্তুটি পরিবর্তন হলে বা টেমপ্লেটের বিষয়বস্তু পরিবর্তন হলে এটি স্বয়ংক্রিয়ভাবে বাসি বলে বিবেচিত হয়।
# app/views/products/index.html.erb
<h1>Products</h1>
<% @products.each do |product| %>
<% cache product do %>
<%= render product %>
<% end %>
<% end %>
টিপ :আমরা স্পষ্টতার জন্য পুরো ব্লকটি লিখছি, কিন্তু আপনি <%=রেন্ডার আংশিক:'products/product', collection:@products, cached:true %><ব্যবহার করে প্রতিটি পণ্যকে ক্যাশে ব্লকে রেন্ডার করতে পারেন /কোড> পরিবর্তে।
পণ্যের আংশিক ক্ষেত্রে, আমরা পণ্যের প্রতিটি রূপের জন্য একটি সারি রেন্ডার করি।
# app/views/products/_product.html.erb
<article>
<h1><%= product.title %></h1>
<ul>
<% product.variants.each do |variant| %>
<%= render variant %>
<% end %>
</ul>
</article>
ক্যাশে অবৈধকরণ
যদিও রেলের ফ্র্যাগমেন্ট ক্যাশিং-এর ক্যাশে কীগুলি ক্যাশে অবৈধকরণকে সহজ করে তোলে, আপনি কখনই ক্যাশে যাচাইকরণ (কম্পিউটার বিজ্ঞানের বিখ্যাত দুটি কঠিন জিনিসগুলির মধ্যে একটি) সম্পর্কে উদ্বেগ থেকে সম্পূর্ণ মুক্ত নন৷
এই উদাহরণে, আমরা পণ্যগুলিকে আংশিক ক্যাশে করি, যার মধ্যে পণ্যের বৈকল্পিকগুলির একটি তালিকা রয়েছে। যেহেতু ক্যাশে কী ভেরিয়েন্ট সম্পর্কে কোনো তথ্য অন্তর্ভুক্ত করে না, তাই নতুন যোগ করা কোনো ভেরিয়েন্ট প্রদর্শিত হবে না যদি না পণ্যটি নিজেই পরিবর্তন হয়।
এটি ঠিক করার উপায় হল পণ্যটি করছে তা নিশ্চিত করা পরিবর্তন যখন কোনো কিছুর পরিবর্তন হয়। এটি করতে, আমরা পণ্যটির updated_at
আপডেট করব বৈশিষ্ট্য যখনই ঘটবে। যেহেতু এটি খুবই সাধারণ, তাই belongs_to
এর জন্য একটি যুক্তি আছে (এবং ActiveModel-এর অন্যান্য সম্পর্ক পদ্ধতি), যাকে বলা হয় :touch
, যা স্বয়ংক্রিয়ভাবে আমাদের জন্য মূল বস্তুর আপডেট_এটি আপডেট করবে।
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>
টিপ :আমরা স্পষ্টতার জন্য পুরো ব্লকটি লিখছি, কিন্তু আপনি <%=রেন্ডার আংশিক:'variants/variant', collection:product.variants, cached:true %> ব্যবহার করে প্রতিটি ভেরিয়েন্টকে ক্যাশে ব্লকে রেন্ডার করতে পারেন
পরিবর্তে।
ঠান্ডা ক্যাশে (আপনি 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 এর কাউন্টার ক্যাশে সম্পর্কে আমাদের পোস্ট, রেলের ক্যাশে স্টোর সম্পর্কে একটি, সংগ্রহ ক্যাশিং সম্পর্কে পোস্ট এবং একটি টুকরো সম্পর্কে রেলে ক্যাশিং আমরা আগে পোস্টে উল্লেখ করেছি।