কম্পিউটার

রেলে খণ্ড ক্যাশিং

যখন একটি Rails অ্যাপ্লিকেশন একটি অনুরোধ গ্রহণ করে, তখন নিয়ামক সাধারণত অনুরোধকৃত ডেটার জন্য মডেলটিকে জিজ্ঞাসা করবে। মডেল তারপর এটি ডাটাবেস থেকে আনয়ন করে এবং কন্ট্রোলারে ফেরত পাঠায়। কন্ট্রোলার অবশেষে ভিউ রেন্ডার করে যা ডেটাকে মানব-পাঠযোগ্য বিন্যাসে উপস্থাপন করে।

কিছু পরিস্থিতিতে, ভিউ রেন্ডার করা একটি ব্যয়বহুল অপারেশন, বিশেষ করে যদি ভিউটিকে প্রচুর ডেটা প্রদর্শনের প্রয়োজন হয়, যেমন দোকানে উপলব্ধ সমস্ত পণ্যের তালিকা দেখানোর সময়, উদাহরণস্বরূপ। এই ধরনের ক্ষেত্রে, প্রত্যাবর্তিত ভিউয়ের অংশগুলি ক্যাশ করা জিনিসগুলির গতি বাড়িয়ে তুলতে পারে, বিশেষ করে যখন ডেটা খুব ঘন ঘন পরিবর্তন হয় না।

👋 এবং আপনি যদি এই নিবন্ধটি পছন্দ করেন তবে রুবি (রেলগুলিতে) পারফরম্যান্স সম্পর্কে আমরা আরও অনেক কিছু লিখেছি, আমাদের রুবি পারফরম্যান্স পর্যবেক্ষণ চেকলিস্টটি দেখুন৷

স্থানীয়ভাবে ক্যাশিং পরীক্ষা করা হচ্ছে

আপনি সর্বদা আপনার অ্যাপ থেকে নতুন প্রতিক্রিয়া পাচ্ছেন তা নিশ্চিত করতে ডিফল্টভাবে বিকাশে ক্যাশিং বন্ধ থাকে। স্থানীয়ভাবে ক্যাশিং পরীক্ষা করার জন্য, আপনাকে আপনার ডেভেলপমেন্ট কনফিগারেশনে এটি চালু করতে হবে।

Rails 5 এ, আপনি সাময়িকভাবে কমান্ড লাইন থেকে ক্যাশিং চালু করতে পারেন। এটি মেমরি স্টোর ব্যবহার করবে, অর্থাৎ ক্যাশে করা টুকরোগুলি ওয়েব সার্ভারের রুবি প্রক্রিয়ায় মেমরিতে রাখা হবে৷

$ rails dev:cache
Development mode is now being cached.

ক্যাশিং ব্যাক অফ করতে আপনি একই কমান্ড চালাতে পারেন।

ফ্র্যাগমেন্ট ক্যাশিং

ধরা যাক আমাদের একটি পৃষ্ঠা রয়েছে যা একটি একক পৃষ্ঠায় একটি দোকানের সমস্ত পণ্য দেখায়৷ এটি করার জন্য, আমাদের কাছে একটি সূচক দৃশ্য রয়েছে যা পণ্যগুলিকে দেখায়৷

# app/views/products/index.html.erb
<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Description</th>
      <th>Image url</th>
      <th>Price</th>
      <th colspan="3"></th>
    </tr>
  </thead>
 
  <tbody>
    <% @products.each do |product| %>
      <%= render product %>
    <% end %>
  </tbody>
</table>

প্রতিটি পণ্যের জন্য, _product.html.erb আংশিক রেন্ডার করা হয়, যা পণ্যের বিবরণ সহ একটি টেবিল সারি প্রদর্শনের যত্ন নেয়।

# app/views/products/_product.html.erb
<tr>
  <td><%= product.title %></td>
  <td><%= product.description %></td>
  <td><%= product.image_url %></td>
  <td><%= product.price %></td>
  <td><%= link_to 'Show', product %></td>
  <td><%= link_to 'Edit', edit_product_path(product) %></td>
  <td><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>

পৃষ্ঠাটি স্থানীয়ভাবে অনুরোধ করা, ডেভেলপমেন্ট মোডে, ডাটাবেসে 25টি পণ্য সহ প্রায় 300 মিলিসেকেন্ড সময় নেয়। সেই সময়ের প্রায় পুরোটাই আংশিক রেন্ডার করতে ব্যয় হয়।

সম্ভবত, বান্ডিল সম্পদ, কম লগিং এবং দ্রুত ওয়েব সার্ভারের কারণে প্রতিক্রিয়াটি উৎপাদনে দ্রুত হবে। যদিও ডেভেলপমেন্টের সংখ্যাগুলি সঠিক নয়, তারা দেখাবে আমাদের অনুরোধের কোন অংশটি সবচেয়ে ধীর, তাই আমরা এটিকে দ্রুত করার চেষ্টা করতে পারি৷

Started GET "/products" for ::1 at 2018-03-13 12:16:08 +0100
Processing by ProductsController#index as HTML
  Rendering products/index.html.erb within layouts/application
  Product Load (0.4ms)  SELECT "products".* FROM "products"
  Rendered products/_product.html.erb (1.4ms)
  Rendered products/_product.html.erb (0.4ms)
  Rendered products/_product.html.erb (0.4ms)
  Rendered products/_product.html.erb (0.3ms)
  Rendered products/_product.html.erb (0.5ms)
  Rendered products/_product.html.erb (2.0ms)
  Rendered products/_product.html.erb (0.9ms)
  Rendered products/_product.html.erb (0.4ms)
  Rendered products/_product.html.erb (0.5ms)
  Rendered products/_product.html.erb (0.5ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.7ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.7ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.5ms)
  Rendered products/_product.html.erb (0.7ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.9ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/_product.html.erb (0.5ms)
  Rendered products/_product.html.erb (0.6ms)
  Rendered products/index.html.erb within layouts/application (257.5ms)
Completed 200 OK in 295ms(Views: 290.4ms | ActiveRecord: 0.4ms)

এই সমস্ত আংশিক রেন্ডার করার সময় বাঁচাতে, আমরা রেলের অন্তর্নির্মিত ফ্র্যাগমেন্ট ক্যাশিং ব্যবহার করতে পারি , যা একটি খণ্ড হিসাবে রেন্ডার করা দৃশ্যের অংশ সংরক্ষণ করে। পরবর্তী অনুরোধের জন্য, পূর্বে সংরক্ষিত খণ্ডটি আবার রেন্ডার করার পরিবর্তে ব্যবহার করা হয়।

একটি খণ্ড ক্যাশে করতে, আপনি cache ব্যবহার করে এটিকে একটি ব্লকে মোড়ানো করুন সাহায্যকারী।

<table>
  # ...
  <tbody>
    <% @products.each do |product| %>
      <% cache(product) do %>
        <%= render product %>
      <% end %>
    <% end %>
  </tbody>
</table>

এই পণ্যগুলি ক্যাশ করা আমাদের প্রতিক্রিয়ার গতি বাড়ায় কিনা তা দেখতে, আমরা পৃষ্ঠাটিকে দুবার অনুরোধ করব৷ দ্বিতীয় অনুরোধটি অনেক দ্রুত কার্যকর করা উচিত, কারণ ভিউতে থাকা প্রতিটি পণ্য ইতিমধ্যেই ক্যাশে প্রি-রেন্ডার করা এবং সংরক্ষণ করা হয়েছে৷

Started GET "/products" for ::1 at 2018-03-13 12:17:29 +0100
Processing by ProductsController#index as HTML
  Rendering products/index.html.erb within layouts/application
  Product Load (0.4ms)  SELECT "products".* FROM "products"
  Rendered products/index.html.erb within layouts/application (21.2ms)
Completed 200 OK in 55ms (Views: 50.8ms | ActiveRecord: 0.4ms)

এটা কাজ করেছে! দ্বিতীয় অনুরোধটি প্রথমটির চেয়ে পাঁচ গুণ বেশি দ্রুত ছিল। নোট করুন যে লগগুলি আংশিকগুলির কোনও রেন্ডারিং দেখায় না, কারণ সেগুলি সরাসরি ক্যাশে থেকে লোড হয়৷

ক্যাশের মেয়াদ শেষ হচ্ছে

cache কল করার সময় উপরের উদাহরণে সাহায্যকারী, আমরা product পাস করেছি বস্তুটি ক্যাশে নির্ভরতা হিসাবে . এটি সাহায্যকারীকে জানতে দেয় যে ক্যাশে করা খণ্ডের বিষয়বস্তু পণ্য বস্তুর উপর নির্ভরশীল৷

অভ্যন্তরীণভাবে, পণ্য বস্তুর একটি #cache_key আছে পদ্ধতি, যা ক্যাশে করা খণ্ডের জন্য একটি কী তৈরি করতে ব্যবহৃত হয়। পুরো খণ্ডের কী দেখতে এইরকম হতে পারে:

views/products/42-20180302103130041320/75dda06d36880e8b0ae6cac0a44fb56d

ক্যাশে কীটি কয়েকটি অংশ নিয়ে গঠিত:

  • "দর্শন/পণ্য" হল ক্যাশে শ্রেণী .
  • 42 হল পণ্যের আইডি
  • 20180302103130041320 পণ্যের আপডেট_তারিখ
  • 75dda06d36880e8b0ae6cac0a44fb56d টেমপ্লেট গাছের একটি ডাইজেস্ট

যখনই পণ্য আপডেট করা হয়, বা টেমপ্লেটের কিছু পরিবর্তন হয় তখনই এই কী পরিবর্তিত হয়। যখন এটি হয়, এটি ক্যাশে একটি মিস সৃষ্টি করে, যার ফলে খণ্ডটি আবার রেন্ডার হয় এবং একটি নতুন খণ্ড সংরক্ষণ করা হয়। এটি নিশ্চিত করে যে খণ্ডটি তাজা থাকে, এমনকি যখন এর উপাদানগুলি পরিবর্তিত হয়।

খণ্ড ক্যাশিং এর বাইরে

যদিও এই উদাহরণে আলোচনা করা ক্যাশে করা টুকরোগুলি একটি ছোট গতি দেয়, আমরা আজকে আলোচনার চেয়ে ক্যাশে করার জন্য আরও অনেক কিছু আছে। রাশিয়ান ডল ক্যাশিং বা ডাটাবেস ক্যোয়ারী ফলাফল ক্যাশে করার মতো নিম্ন স্তরের পদ্ধতিগুলি ব্যবহার করে, বড় গতি সম্পন্ন করা যেতে পারে৷

অবশ্যই, আমরা অ্যাপসিগন্যাল একাডেমির পরবর্তী পর্বে এগুলি নিয়ে যাব। আপনি সম্পর্কে জানতে চান নির্দিষ্ট কিছু? অনুগ্রহ করে আমাদের @AppSignal এ জানাতে দ্বিধা করবেন না। অবশ্যই, আমরা জানতে চাই যে আপনি এই নিবন্ধটি কীভাবে পছন্দ করেছেন, অথবা আপনার যদি অন্য কোনো বিষয় থাকে যে সম্পর্কে আপনি আরও জানতে চান।


  1. এইচটিএমএল আইডি অ্যাট্রিবিউট

  2. এইচটিএমএল চিহ্ন

  3. এইচটিএমএল অনুচ্ছেদ

  4. এইচটিএমএল লেআউট