تصور کن مدیر یک رستوران خیلی شلوغ هستی. بهترین غذای منوی تو "قرمه سبزی" است که پختنش ۵ ساعت طول میکشه (یک پردازش سنگین). حالا ساعت ۱۲ ظهر میشه و مشتری اول میاد: "آقا یک قرمهسبزی لطفا!". آشپز تو (که همون دیتابیس باشه) میره توی آشپزخونه، سبزی خرد میکنه، گوشت تفت میده و ۵ ساعت بعد غذا رو تحویل میده. مشتری راضی میره. ۱۰ ثانیه بعد، مشتری دوم میاد و میگه: "آقا یک قرمهسبزی!". اگر آشپزت "کم هوش" باشه، دوباره میره از اول سبزی خرد میکنه و ۵ ساعت دیگه غذا میده. اینطوری هم مشتری از گرسنگی میمیره (Latency بالا)، هم آشپزت از خستگی سکته میکنه (Server Overload).
اما آشپز باهوش چیکار میکنه؟ دفعه اول که غذا رو پخت، ۱۰ پرس اضافه هم آماده میکنه و میذاره توی "گرمکن" (Cache). حالا وقتی مشتری دوم میاد، آشپز فقط دستش رو دراز میکنه، غذا رو از گرمکن برمیداره و توی ۱ ثانیه میده به مشتری. توی دنیای وب، Caching دقیقاً همون "گرمکن" است. جایی که پاسخهای آماده رو نگه میداریم تا مجبور نباشیم برای هر درخواست، دوباره بریم سراغ دیتابیس بیچاره و محاسبات سنگین انجام بدیم.
تفاوت Caching با Database
خیلی ها میپرسن "مگه دیتابیس خودش جا برای ذخیره اطلاعات نداره؟". بله داره، ولی بذار با همون مثال رستوران بگیم: ۱. دیتابیس (Database): مثل انبار مواد اولیه است که ته زیر زمینه. رفتن به اونجا، پیدا کردن مواد و پختن غذا زمان بره (Reliable but Slow). ۲. کش (Cache): مثل میز کار جلوی دست آشپزه. فضاش کمه (RAM محدود)، گرونه، ولی دسترسی بهش نهایتاً چند میلیثانیه طول میکشه (Volatile but Super Fast).
در واقع: دیتابیس برای "ذخیره دائمی و مطمئن" اطلاعاته. کش برای "دسترسی سریع و موقت" به اطلاعات پرکاربرده.
وقتی کشینگ فعال باشه، جنگو قبل از اینکه بره سراغ دیتابیس، اول جیب هاش (Cache) رو میگرده. اگه جواب اونجا بود (Cache Hit)، همونجا برمیگردونه و تمام! اگه نبود (Cache Miss)، میره سراغ دیتابیس، جواب رو میگیره و یه نسخه هم توی جیبش میذاره برای نفر بعدی.
انواع استراتژیهای کشینگ در جنگو (The Caching Toolkit)
جنگو ابزار های مختلفی داره، از "کش کردن کل دنیا" تا "کش کردن یک تکه کوچک":
۱. Per-Site Cache (کش کردن فلهای)
این ساده ترین و تنبلانه ترین روشه! میگی "آقا هر چی توی سایت من هست رو کش کن". کاربرد: برای سایت های خبری یا وبلاگ هایی که محتواشون هر ثانیه عوض نمیشه عالیه. تنظیمات: فقط کافیه دو تا Middleware به settings.py اضافه کنی. یکی اول لیست، یکی آخر لیست. جنگو بقیه کارها رو میکنه.
۲. Per-View Cache (کش کردن نقطهای)
اینجا هوشمندانه تر عمل میکنی. میگی "صفحه اصلی سایت من سنگینه، این رو ۱۵ دقیقه کش کن، ولی صفحه پروفایل کاربر رو اصلا کش نکن چون اطلاعات شخصیه". نمونه کد: خیلی شیک با یک دکوریتور (Decorator) بالای ویو حلش میکنی:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # نتیجه این ویو رو ۱۵ دقیقه نگه دار
def my_heavy_view(request):
# کلی محاسبات سنگین...
return HttpResponse("Hello World")
۳. Template Fragment Cache (جراحی دقیق)
فرض کن یه صفحه داری که توش قیمت لحظهای دلار (که هر ثانیه عوض میشه) و لیست مقالات (که روزی یکبار عوض میشه) کنار همه. نمیتونی کل صفحه رو کش کنی چون قیمت دلار قدیمی میشه. نمیتونی هم کش نکنی چون لیست مقالات سنگینه. اینجا از تگ توی تمپلیت (HTML) استفاده میکنی و فقط دور اون تیکه سنگین (لیست مقالات) خط میکشی:
{% load cache %}
{% cache 500 sidebar %}
... لیست مقالات سنگین ...
{% endcache %}
<div>قیمت دلار: ... </div>
کجاها باید کش کنیم؟ (Backends)
حالا این اطلاعات رو کجا ذخیره کنیم؟ ۱. Memcached/Redis (حرفهایها): اینا سرویسهای جداگانهای هستن که تمام اطلاعات رو توی RAM نگه میدارن. سرعتشون وحشتناک بالاست و استاندارد طلایی برای سایت های بزرگه. ۲. Database Caching (متوسط): اطلاعات کش رو توی یه جدول خاص توی دیتابیس میریزه. سرعتش به اندازه Redis نیست ولی از هیچی بهتره. ۳. Dummy Caching (الکی!): در واقع هیچی رو کش نمیکنه! فقط برای زمانی خوبه که داری روی لپ تاپت کد میزنی و نمیخوای درگیر کش بشی.
چرا باید از Caching استفاده کنیم؟
شاید بگی "سرور من قویه، نیازی ندارم". اما: ۱. صرفهجویی در پول: هر کوئری دیتابیس هزینه داره (CPU/IO). با کشینگ، فشار روی دیتابیس رو تا ۹۰٪ کم میکنی و نیاز نیست سرور گرونتر بخری. ۲. تجربه کاربری (UX): گوگل عاشق سایت های سریعه. کاربر هم اگر سایتت زیر ۲ ثانیه باز نشه، دکمه Back رو میزنه و میره سراغ رقیبت. ۳. پایداری در ترافیک بالا: وقتی سایتت یهو وایرال میشه و ۱۰۰۰ نفر میریزن توش، دیتابیس بدون کش "ترک" میخوره (Crash میکنه)، اما با کش، سرور خم به ابرو نمیاره.
جمعبندی
همیشه یادت باشه، دیتابیس دوست عزیز اما "کند و خسته ی" ماست. نباید برای هر سوال تکراری بیدارش کنیم. Caching در جنگو یعنی احترام گذاشتن به وقت سرور و اعصاب کاربر. با استفاده درست از کش، تو دیگه نگران نیستی که اگر سایتت شلوغ بشه چی میشه؛ چون آشپز هوشمند تو، غذاها رو از قبل توی گرمکن آماده کرده!
نظرات کاربران (0)