কী-ভিত্তিক ক্যাশিং কীভাবে কাজ করে?


10

আমি সম্প্রতি 37 সিগন্যাল ব্লগে একটি নিবন্ধ পড়েছি এবং আমি ভাবছি যে এগুলি কীভাবে তারা ক্যাশে পেয়েছে

একটি ক্যাশে কী থাকা সবকিছুই ঠিক আছে এবং এতে অবজেক্টের টাইমস্ট্যাম্প অন্তর্ভুক্ত রয়েছে (এর অর্থ আপনি যখন অবজেক্টটি আপডেট করবেন তখন ক্যাশে অবৈধ হবে); আপনি কীভাবে ক্যাচ থেকে আনার চেষ্টা করছেন এমন কোনও বস্তুর জন্য ডিবি হিট না করে আপনি কীভাবে টেমপ্লেটে ক্যাশে কী ব্যবহার করবেন?

বিশেষত, যেখানে উদাহরণস্বরূপ আপনি কোনও পোস্টের মন্তব্যগুলি উপস্থাপন করছেন সেখানে এটি এক থেকে একাধিক সম্পর্কের উপর কীভাবে প্রভাব ফেলবে।

জাজানো উদাহরণ:

{% for comment in post.comments.all %}
   {% cache comment.pk comment.modified %}
     <p>{{ post.body }}</p>
   {% endcache %}
{% endfor %}

রেলগুলিতে ক্যাশে করা কি কেবল ম্যাকচেড করার অনুরোধের জন্য উদাহরণস্বরূপ (আমি জানি যে তারা আপনার ক্যাশে কীটিকে অন্যরকম কিছুতে রূপান্তর করে)। তারা কি ক্যাশে কীটি ক্যাশে করে?


একটি জ্যাঙ্গো উদাহরণের জন্য rossp.org/blog/2012/feb/29/fraament- কেচিংএকবার দেখুন !
vdboor

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

এটি সত্য, 37 টি সিগন্যাল কোডের সাথে এটিও ঘটে, এটি রেন্ডারিং কোডের দিকে মনোনিবেশ করা হয়। কৌশলটি অন্য কোনও ধারককেও পুরো তালিকাটি ক্যাশে করা বা অন্য কোথাও বস্তুর পুনরুদ্ধার ক্যাশে করা।
vdboor

আসলে তাদের ক্যাশিং কৌশলটি কিছুটা বেশি শিক্ষিত বলে মনে হচ্ছে। : আমি ভাল হিসাবে এই নিবন্ধটি সুপারিশ 37signals.com/svn/posts/...
JensG

দেখে মনে হচ্ছে আপনার কোড স্নিপেটের একটি টাইপ রয়েছে - তা কি post.bodyউদ্দেশ্য ছিল comment.body?
ইজকাটা

উত্তর:


3

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

37 টি সিগন্যাল ব্লগের প্রথম উদাহরণ Project -> Todolist -> Todoহায়ারার্কি হিসাবে ব্যবহার করে। জনবহুল উদাহরণটি দেখতে এরকম হতে পারে:

Project: Foo (last_modified: 2014-05-10)
   Todolist:  Bar1 (last_modified: 2014-05-10)
       Todo:  Bang1 (last_modified: 2014-05-09)
       Todo:  Bang2 (last_modified: 2014-05-09)

   Todolist:  Bar2 (last_modified: 2014-04-01)
       Todo:  Bang3 (last_modified: 2014-04-01)
       Todo:  Bang4 (last_modified: 2014-04-01)

সুতরাং, ধরা যাক Bang3আপডেট হয়েছে। এর সমস্ত বাবা-মাও আপডেট হয়:

Project: Foo (last_modified: 2014-05-16)
   Todolist:  Bar2 (last_modified: 2014-05-16)
       Todo:  Bang3 (last_modified: 2014-05-16)

তারপরে যখন রেন্ডার করার সময় আসে তখন Projectডাটাবেস থেকে লোড করা মূলত অনিবার্য। আপনি শুরু করতে একটি পয়েন্ট প্রয়োজন। তবে, এটি এটির সমস্ত শিশুদেরlast_modified একটি সূচক, তাই বাচ্চাদের লোড করার চেষ্টা করার আগে আপনি এটি ক্যাশে কী হিসাবে ব্যবহার করেন।


ব্লগ পোস্টগুলি পৃথক টেম্পলেট ব্যবহার করার সময়, আমি সেগুলিকে একের মধ্যে একসাথে মিশ্রিত করব। আশা করি এক জায়গায় সম্পূর্ণ ইন্টারঅ্যাকশনটি এটিকে আরও পরিষ্কার করে দেবে।

সুতরাং, জ্যাঙ্গো টেমপ্লেটটি এর মতো দেখতে পারে:

{% cache 9999 project project.cache_key %}
<h2>{{ project.name }}<h2>
<div>
   {% for list in project.todolist.all %}
   {% cache 9999 todolist list.cache_key %}
      <ul>
         {% for todo in list.todos.all %}
            <li>{{ todo.body }}</li>
         {% endfor %}
      </ul>
   {% endcache %}
   {% endfor %}
</div>
{% endcache %}

বলুন আমরা এমন একটি প্রকল্পে পাস করি যার cache_keyক্যাশে এখনও বিদ্যমান। যেহেতু আমরা প্যারেন্টের সাথে সম্পর্কিত সমস্ত বস্তুর পরিবর্তনের প্রচার করি, সেই নির্দিষ্ট কীটি এখনও বিদ্যমান তা হ'ল পুরো রেন্ডার করা সামগ্রীগুলি ক্যাশে থেকে টানতে পারা যায়।

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

আমি todo.cache_keyএই টেমপ্লেটটিতে কীভাবে ব্যবহার করছি না তাও লক্ষ্য করুন । এটি লাভজনক নয়, যেহেতু আপনি প্রশ্নে বলেছেন, bodyইতিমধ্যে ডাটাবেস থেকে টানা হয়েছে। যাইহোক, ডাটাবেস হিটগুলি কোনও কারণকে ক্যাশে করার একমাত্র কারণ নয়। উদাহরণস্বরূপ, কাঁচা মার্কআপ পাঠ্য গ্রহণ করা (যেমন আমরা স্ট্যাকএক্সচেঞ্জে প্রশ্ন / উত্তর বাক্সগুলিতে কী লিখি) এবং এটি এইচটিএমএলে রূপান্তর করা যথেষ্ট সময় নিতে পারে যে ফলাফলটি ক্যাশে করা আরও কার্যকর হবে।

যদি তা হয় তবে টেমপ্লেটের অভ্যন্তরীণ লুপটি আরও দেখতে লাগতে পারে:

         {% for todo in list.todos.all %}
            {% cache 9999 todo todo.cache_key %}
               <li>{{ todo.body|expensive_markup_parser }}</li>
            {% endcache %}
         {% endfor %}

সুতরাং সবকিছু একসাথে টানতে, আসুন এই উত্তরটির শীর্ষে আমার মূল ডেটাতে ফিরে যাই। যদি আমরা ধরে নিই:

  • সমস্ত বস্তু তাদের মূল অবস্থায় ক্যাশে করা হয়েছিল
  • Bang3 সবেমাত্র আপডেট করা হয়েছিল
  • আমরা সংশোধিত টেম্পলেট রেন্ডার করছি (সহ expensive_markup_parser)

তারপরে সবকিছু এভাবে লোড হবে:

  • Foo ডাটাবেস থেকে পুনরুদ্ধার করা হয়
  • Foo.cache_key (2014-05-16) ক্যাশে বিদ্যমান নেই
  • Foo.todolists.all()অনুসন্ধান করা হয়: Bar1এবং Bar2ডাটাবেস থেকে উদ্ধার করা হয়
  • Bar1.cache_key(2014-05-10) ইতিমধ্যে ক্যাশে বিদ্যমান ; এটি পুনরুদ্ধার এবং আউটপুট
  • Bar2.cache_key (2014-05-16) ক্যাশে বিদ্যমান নেই
  • Bar2.todos.all()অনুসন্ধান করা হয়: Bang3এবং Bang4ডাটাবেস থেকে উদ্ধার করা হয়
  • Bang3.cache_key (2014-05-16) ক্যাশে বিদ্যমান নেই
  • {{ Bang3.body|expensive_markup_parser }} রেন্ডার করা হয়
  • Bang4.cache_key(2014-04-01) ইতিমধ্যে ক্যাশে রয়েছে ; এটি পুনরুদ্ধার এবং আউটপুট

এই ক্ষুদ্র উদাহরণে ক্যাশে থেকে সঞ্চয়গুলি হ'ল:

  • ডাটাবেস হিট এড়ানো: Bar1.todos.all()
  • expensive_markup_parserএড়িয়ে যাওয়া 3 বার: Bang1, Bang2, এবংBang4

এবং অবশ্যই, পরের বার এটি দেখার পরে, Foo.cache_keyএটি সন্ধান করা হবে, সুতরাং কেবলমাত্র রেন্ডারিংয়ের ব্যয় হ'ল Fooডাটাবেস থেকে একা পুনরুদ্ধার করা এবং ক্যাশে অনুসন্ধান করা।


-2

আপনার মন্তব্যটি যদি প্রতিটি মন্তব্যের জন্য কিছু তথ্য পুনরুদ্ধার বা প্রক্রিয়াজাতকরণ প্রয়োজন হয় তবে এটি ভাল। আপনি যদি কেবল শরীর গ্রহণ করেন এবং এটি প্রদর্শন করেন - ক্যাশে অকেজো হবে। তবে আপনি সমস্ত মন্তব্য গাছকে ক্যাশে করতে পারেন (% for এর জন্য {% সহ)। এই ক্ষেত্রে আপনার প্রতিটি যুক্ত মন্তব্য দিয়ে এটি অবৈধ করা দরকার, যাতে আপনি সর্বশেষ মন্তব্য টাইমস্ট্যাম্প বা মন্তব্য পোস্টে কোথাও গণনা করতে পারেন এবং এর সাথে মন্তব্য ক্যাশে কী তৈরি করতে পারেন। আপনি যদি আরও সাধারণকরণের ডেটা পছন্দ করেন এবং শুধুমাত্র একটি পৃষ্ঠায় মন্তব্য ব্যবহার করেন, আপনি মন্তব্য সংরক্ষণে কেবল একটি ক্যাশে কী সাফ করতে পারেন।

আমার জন্য, পোস্টে মন্তব্য গণনা সংরক্ষণ করা যথেষ্ট ভাল দেখাচ্ছে (যদি আপনি মন্তব্যগুলি মুছতে এবং সম্পাদনা করতে অনুমতি না দেন) - আপনার পোস্টের সাথে কোথাও দেখানোর জন্য একটি মান এবং ক্যাশে দেওয়ার জন্য কী রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.