Django

روز ۳۷: کش (Caching) در جنگو افزایش سرعت سایت

کش یا Caching در جنگو یکی از مهم‌ترین ابزارهایی است که برای بهینه‌سازی عملکرد سایت‌های واقعی استفاده می‌شود. زمانی که تعداد کاربران افزایش پیدا می‌کند، اجرای مداوم Viewها، کوئری‌های دیتابیس و رندر قالب‌ها فشار زیادی به سرور وارد می‌کند. جنگو به‌صورت پیش‌فرض امکانات قدرتمندی برای کش در اختیار توسعه‌دهنده قرار می‌دهد تا بتواند نتایج پردازش‌های تکراری را ذخیره کرده و در درخواست‌های بعدی، بدون محاسبه مجدد، به کاربر نمایش دهد. استفاده صحیح از کش می‌تواند سرعت سایت را چندین برابر افزایش دهد و تجربه کاربری بسیار بهتری ایجاد کند.

راه‌اندازی اولیه کش در جنگو

برای استفاده از کش، ابتدا باید Backend کش را در فایل settings.py تنظیم کنیم. ساده‌ترین حالت استفاده از کش حافظه‌ای (Local Memory Cache) است که برای محیط توسعه و پروژه‌های آموزشی کاملاً مناسب است. جنگو این نوع کش را به‌صورت داخلی پشتیبانی می‌کند و نیاز به نصب هیچ ابزار جانبی ندارد. این روش به ما کمک می‌کند منطق کش را به‌خوبی یاد بگیریم قبل از اینکه سراغ Redis یا Memcached برویم.

# settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
        'LOCATION': 'unique-django-cache'
    }
}

بعد از این تنظیم، جنگو آماده استفاده از کش است و می‌توانیم در بخش‌های مختلف پروژه از آن بهره ببریم.

کش کردن Viewها با مثال کاربردی

یکی از رایج‌ترین و ساده‌ترین روش‌ها برای استفاده از کش در جنگو، کش کردن Viewهاست. فرض کنید صفحه لیست مقالات وبلاگ شما برای همه کاربران یکسان است و فقط هر چند دقیقه یک‌بار تغییر می‌کند. در چنین حالتی، کش کردن خروجی View باعث می‌شود جنگو فقط یک بار آن را پردازش کند و در درخواست‌های بعدی، نتیجه ذخیره‌شده را نمایش دهد.

from django.views.decorators.cache import cache_page
from django.shortcuts import render
from .models import Article

@cache_page(60 * 5)
def article_list(request):
    articles = Article.objects.all()
    return render(request, 'articles/list.html', {'articles': articles})

در این مثال، خروجی View به مدت ۵ دقیقه کش می‌شود. یعنی اگر هزار کاربر همزمان این صفحه را باز کنند، فقط یک بار Query به دیتابیس زده می‌شود و بقیه درخواست‌ها مستقیماً از کش پاسخ داده می‌شوند.

کش در Class Based Viewها

در پروژه‌های واقعی جنگو، معمولاً از Class Based View استفاده می‌شود. جنگو این امکان را فراهم کرده که کش را به‌راحتی روی CBVها هم اعمال کنیم. این کار باعث می‌شود بدون تغییر ساختار کلی کد، عملکرد سایت بهینه شود.

from django.views.generic import ListView
from django.views.decorators.cache import cache_page
from django.utils.decorators import method_decorator
from .models import Article

@method_decorator(cache_page(60 * 10), name='dispatch')
class ArticleListView(ListView):
    model = Article
    template_name = 'articles/list.html'

در این حالت، کل View به مدت ۱۰ دقیقه کش می‌شود و برای سایت‌های محتوایی بسیار کاربردی است.

استفاده مستقیم از cache API در جنگو

گاهی نیاز داریم فقط بخشی از داده‌ها را کش کنیم، نه کل View. جنگو یک API ساده برای این کار در اختیار ما می‌گذارد. این روش زمانی مفید است که بخواهیم خروجی یک Query یا یک محاسبه سنگین را ذخیره کنیم.

from django.core.cache import cache
from .models import Article

def popular_articles():
    articles = cache.get('popular_articles')
    if articles is None:
        articles = Article.objects.filter(is_popular=True)
        cache.set('popular_articles', articles, 60 * 15)
    return articles

در این مثال، اگر داده‌ها در کش موجود نباشند، از دیتابیس گرفته می‌شوند و سپس به مدت ۱۵ دقیقه در کش ذخیره می‌شوند. این الگو یکی از حرفه‌ای‌ترین روش‌های استفاده از کش در جنگو است.

کش کردن Template‌ها برای بخش‌های پرتکرار

گاهی فقط بخش‌هایی از یک صفحه نیاز به کش دارند، مثل منوی سایت یا سایدبار. جنگو امکان کش کردن بخش‌هایی از Template را هم فراهم کرده است. این روش باعث می‌شود محتوای داینامیک صفحه به‌روز بماند، اما بخش‌های ثابت سریع‌تر لود شوند.

{% load cache %}

{% cache 600 sidebar %}
    {% include "includes/sidebar.html" %}
{% endcache %}

در این مثال، سایدبار سایت به مدت ۱۰ دقیقه کش می‌شود و بار پردازشی سایت به شکل محسوسی کاهش پیدا می‌کند.

انتخاب Backend مناسب برای کش در پروژه‌های واقعی

در پروژه‌های کوچک، کش حافظه‌ای کافی است، اما در پروژه‌های بزرگ و چندسروره، باید از Backendهایی مثل Redis یا Memcached استفاده کرد. جنگو به‌صورت کامل از این ابزارها پشتیبانی می‌کند و تنها با تغییر تنظیمات می‌توان آن‌ها را فعال کرد. استفاده از Redis معمولاً انتخاب اول در پروژه‌های حرفه‌ای جنگو است، چون هم سریع است و هم امکانات پیشرفته‌ای برای مدیریت کش ارائه می‌دهد.

تأثیر کش بر سئو و تجربه کاربری

سرعت لود صفحات یکی از مهم‌ترین فاکتورهای رتبه‌بندی گوگل است. استفاده صحیح از کش باعث می‌شود صفحات سایت سریع‌تر نمایش داده شوند، نرخ پرش کاربران کاهش پیدا کند و زمان حضور آن‌ها در سایت افزایش یابد. این عوامل به‌صورت غیرمستقیم روی سئو تأثیر مثبت دارند و باعث می‌شوند سایت شما در نتایج جستجو جایگاه بهتری بگیرد.

جمع‌بندی روز ۳۷ دوره جنگو

در این روز یاد گرفتیم کش چیست، چرا اهمیت دارد و چطور می‌توان آن را به‌صورت عملی در جنگو پیاده‌سازی کرد. از کش کردن Viewها گرفته تا Template و داده‌های دیتابیس، همه این تکنیک‌ها به شما کمک می‌کنند پروژه‌هایی سریع، مقیاس‌پذیر و حرفه‌ای بسازید. تسلط بر کش، شما را یک قدم بزرگ به سطح توسعه‌دهندگان واقعی جنگو نزدیک‌تر می‌کند و پایه‌ای محکم برای مباحث پیشرفته‌تر روزهای بعد خواهد بود.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

18 + 7 =

دکمه بازگشت به بالا