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