تصور کن یک کتابخانه بزرگ و قدیمی داری (همون دیتابیس PostgreSQL یا MySQL). هر بار که یک کاربر وارد سایت میشه و میپرسه "لیست پرفروش ترین محصولات چیه؟"، جنگو مجبور میشه بره طبقه منفی ۳، لای هزاران قفسه بگرده، پرونده ها رو باز کنه و جواب رو بیاره بالا. حالا اگر ۱۰۰۰ نفر همزمان همین سوال رو بپرسن چی؟ کتابدار بیچاره (دیتابیس) از نفس میفته و صف طولانی تشکیل میشه (سایت کند میشه).
اینجاست که Redis مثل یک دستیار باهوش و فرز وارد صحنه میشه. دستیاری که یک تخته وایت برد دم دستش داره و جواب سوالات تکراری رو روش مینویسه تا دیگه لازم نباشه کسی تا طبقه منفی ۳ بره.
ردیس (Redis) چیست؟ جادوی سرعت در RAM
ردیس (Remote Dictionary Server) در واقع یک نوع دیتابیسه، اما نه از اون مدل هایی که روی هارد دیسک (HDD/SSD) ذخیره بشن. ردیس تمام اطلاعاتش رو توی RAM (حافظه موقت) نگه میداره.
تفاوت اصلی کجاست؟ دسترسی به RAM هزاران برابر سریع تر از هارد دیسکه.
-
دیتابیس سنتی (SQL): مثل گشتن دنبال یک کتاب خاص توی انباری. (کند، مطمئن، دائمی)
-
ردیس (Cache): مثل خوندن یک یادداشت که چسبوندی روی مانیتورت. (فوقسریع، موقت)
هدف استفاده از Redis در جنگو اینه: "سوالات تکراری و سنگین رو یکبار از دیتابیس بپرس، جوابش رو بذار تو ردیس، دفعات بعد از ردیس بخون."
تفاوت: درخواست مستقیم vs درخواست کش شده (Cached)
بیایید ببینیم وقتی ردیس نداریم چه اتفاقی میفته و وقتی داریم چی میشه:
بدون ردیس (روش سنتی): کاربر ۱: "محصولات تخفیف دار کدوماست؟" -> جنگو میره دیتابیس -> محاسبه سنگین -> جواب به کاربر. کاربر ۲: "محصولات تخفیف دار کدوماست؟" -> جنگو دوباره میره دیتابیس -> محاسبه سنگین تکراری -> جواب به کاربر. نتیجه: فشار بیهوده روی دیتابیس.
با ردیس (Caching): کاربر ۱: "محصولات..." -> جنگو چک میکنه ردیس خالیه -> میره دیتابیس -> جواب رو میگیره -> یه کپی میذاره تو ردیس -> جواب به کاربر. کاربر ۲: "محصولات..." -> جنگو چک میکنه ردیس -> جواب آماده است! -> تحویل به کاربر (بدون مزاحمت برای دیتابیس).
پیادهسازی ردیس در جنگو
یایید دست به کد بشیم. فرض کنید یک "فروشگاه اینترنتی" داریم و محاسبه "پیشنهاد ویژه روز" خیلی زمان بره (چون باید کلی ضرب و تقسیم انجام بده).
۱. نصب و تنظیمات
اول باید کتابخانه رابط بین جنگو و ردیس رو نصب کنیم:
pip install django-redis
حالا میریم سراغ settings.py. اینجا باید به جنگو بگیم که سیستم Caching ما دیگه حافظه معمولی نیست، بلکه ردیسه:
# settings.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1", # آدرس سرور ردیس
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
۲. سرویس سنگین (بدون ردیس)
این یک ویو (View) معمولیه که انگار خیلی کارش طول میکشه:
from django.shortcuts import render
import time
def expensive_view(request):
# شبیهسازی یک کوئری سنگین دیتابیس که ۳ ثانیه طول میکشه
time.sleep(3)
data = "این لیست پیشنهادات ویژه است که خیلی سخت محاسبه شد!"
return render(request, 'home.html', {'data': data})
هر بار که این صفحه رو رفرش کنید، باید ۳ ثانیه زل بزنید به مانیتور!
۳. جادوی ردیس (با Caching)
حالا همون کد رو با ردیس بازنویسی میکنیم. ببینید چطور منطق عوض میشه:
from django.shortcuts import render
from django.core.cache import cache # ابزار جنگو برای کار با ردیس
import time
def smart_view(request):
# مرحله ۱: اول از ردیس بپرس "آیا جواب رو داری؟"
# کلید ما اینجا 'special_offers' هست
data = cache.get('special_offers')
if not data:
# مرحله ۲: اگر تو ردیس نبود (Cache Miss)، یعنی بار اوله
print("اطلاعات در کش نبود، دارم از دیتابیس میخونم...")
# عملیات سنگین (شبیهسازی)
time.sleep(3)
data = "این لیست پیشنهادات ویژه است (نسخه کش شده)!"
# مرحله ۳: جواب رو بده به ردیس تا برای ۱۵ دقیقه (۹۰۰ ثانیه) نگه داره
cache.set('special_offers', data, timeout=900)
else:
print("ایول! اطلاعات رو از ردیس خوندم (بدون معطلی).")
return render(request, 'home.html', {'data': data})
تحلیل فنی: TTL یا زمان مرگ دیتا!
توی کد بالا یک پارامتر مهم داشتیم: timeout=900. این یعنی Time To Live (TTL). چرا این مهمه؟ چون ردیس دیتابیس اصلی شما نیست. قیمت محصولات تغییر میکنه، موجودی انبار عوض میشه. نباید اطلاعات رو تا ابد توی کش نگه داریم. ما به ردیس میگیم: "این داده رو ۱۵ دقیقه نگه دار، بعدش پاکش کن." بعد از ۱۵ دقیقه، اولین کاربری که درخواست بده، دوباره دیتابیس اصلی صدا زده میشه و کش آپدیت میشه. اینطوری هم سرعت رو داریم، هم داده ها خیلی قدیمی نمیشن.
چرخه حیات یک درخواست با ردیس
بیایید پشت پرده رو مرور کنیم وقتی کاربر دکمه اینتر رو میزنه:
-
درخواست (Request): کاربر صفحه "پیشنهادات" رو میخواد.
-
بازرسی (Look up): جنگو سریع به ردیس میگه: "کلید
special_offersرو داری؟" -
سناریوی اول (Cache Hit): ردیس میگه: "آره بفرما". جنگو بدون درگیری با دیتابیس SQL، جواب رو میفرسته. زمان: ۱۰ میلیثانیه.
-
سناریوی دوم (Cache Miss): ردیس میگه: "نه، ندارم یا منقضی شده". جنگو میره سراغ دیتابیس اصلی، جواب رو میگیره، میده به ردیس و بعد به کاربر. زمان: ۳۰۰۰ میلی ثانیه (فقط برای نفر اول).
جمعبندی: چرا باید از ردیس استفاده کنیم؟
استفاده از ردیس در جنگو مثل ارتقای ماشین از موتور پراید به موتور جت نیست، بلکه مثل اینه که بار اضافه صندوق عقب رو خالی کنی تا ماشینت نفس بکشه.
-
کاهش فشار روی دیتابیس: دیتابیس اصلی شما مقدس است، نباید برای هر چیز کوچکی مزاحمش شد.
-
سرعت پاسخگویی: کاربرها عاشق سرعتن. ردیس پاسخ ها رو در حد میلی ثانیه برمیگردونه.
-
مقیاسپذیری (Scalability): وقتی ترافیک سایت بالا میره، به جای خرید سرور های گرونتر، با یک استراتژی کشینگ (Caching) درست، میتونید هزاران کاربر بیشتر رو مدیریت کنید.
پس اگر جنگو کار میکنید و حس میکنید سایتتون داره نفس نفس میزنه، قبل از دستکاری کد ها، یک نیم نگاهی به Redis داشته باشید. شاید دوای دردتون فقط چند خط کد cache.get و cache.set باشه!
نظرات کاربران (0)