در ذخیره سازی جنگو استاد شوید! این راهنما شامل پشتیبان های مختلف ذخیره سازی، تنظیمات حافظه پنهان، ذخیره سازی قطعه الگو و بهترین شیوه ها برای عملکرد مطلوب برنامه های وب است.
ذخیره سازی پایتون جنگو: راهنمای جامع یکپارچه سازی چارچوب حافظه پنهان
ذخیره سازی یک تکنیک اساسی برای بهبود عملکرد و مقیاس پذیری برنامه های وب است. با ذخیره کردن داده های پرکاربرد در یک حافظه پنهان، می توانید بار روی پایگاه داده و سرور خود را کاهش دهید، که منجر به زمان پاسخگویی سریعتر و تجربه کاربری بهتری می شود. جنگو، یک چارچوب وب پایتون سطح بالا، یک چارچوب ذخیره سازی قدرتمند و انعطاف پذیر ارائه می دهد که به شما امکان می دهد به راحتی ذخیره سازی را در برنامه های خود ادغام کنید.
چرا از ذخیره سازی در جنگو استفاده کنیم؟
قبل از پرداختن به جزئیات ذخیره سازی جنگو، اجازه دهید مزایای کلیدی آن را بررسی کنیم:
- بهبود عملکرد: ذخیره سازی تعداد پرس و جوهای پایگاه داده و سایر عملیات پرهزینه را کاهش می دهد و منجر به زمان بارگذاری صفحه بسیار سریعتر می شود.
- کاهش بار پایگاه داده: با ارائه داده ها از حافظه پنهان، بار روی سرور پایگاه داده خود را کاهش می دهید و به آن اجازه می دهید درخواست های بیشتری را مدیریت کند.
- مقیاس پذیری پیشرفته: ذخیره سازی برنامه شما را قادر می سازد تا حجم بیشتری از ترافیک را بدون نیاز به ارتقاء سخت افزاری گران قیمت مدیریت کند.
- تجربه کاربری بهتر: زمان پاسخگویی سریعتر منجر به تجربه کاربری روان تر و لذت بخش تر می شود و تعامل و رضایت کاربر را افزایش می دهد.
چارچوب ذخیره سازی جنگو: یک مرور کلی
چارچوب ذخیره سازی جنگو یک رابط واحد برای تعامل با پشتیبان های مختلف ذخیره سازی ارائه می دهد. این سطوح مختلفی از ذخیره سازی را ارائه می دهد که به شما امکان می دهد کل سایت ها، نماهای فردی یا قطعات الگوی خاص را ذخیره کنید.
پشتیبان های حافظه پنهان
یک پشتیبان حافظه پنهان، مکانیسم ذخیره سازی زیربنایی است که برای ذخیره داده های ذخیره شده استفاده می شود. جنگو از چندین پشتیبان حافظه پنهان داخلی و همچنین پشتیبان های شخص ثالث که می توانند به راحتی یکپارچه شوند پشتیبانی می کند.
- Memcached: یک سیستم ذخیره سازی شی در حافظه توزیع شده با کارایی بالا. این برای ذخیره داده های پرکاربرد در حافظه ایده آل است.
- Redis: یک فروشگاه ساختار داده در حافظه است که به عنوان پایگاه داده، حافظه پنهان و کارگزار پیام استفاده می شود. Redis ویژگی های پیشرفته تری نسبت به Memcached ارائه می دهد، مانند ماندگاری داده ها و پیام رسانی pub/sub.
- ذخیره سازی پایگاه داده: از پایگاه داده خود به عنوان پشتیبان حافظه پنهان استفاده می کند. این برای توسعه یا استقرارهای در مقیاس کوچک مناسب است، اما به طور کلی به دلیل محدودیت های عملکرد برای محیط های تولید توصیه نمی شود.
- ذخیره سازی مبتنی بر فایل: داده های ذخیره شده را در فایل ها در سیستم فایل ذخیره می کند. این گزینه دیگری برای توسعه یا استقرارهای در مقیاس کوچک است، اما برای وب سایت های پر ترافیک ایده آل نیست.
- ذخیره سازی حافظه محلی: داده های ذخیره شده را در حافظه سرور ذخیره می کند. این سریعترین گزینه است، اما برای محیط های چند سروری مناسب نیست.
تنظیمات حافظه پنهان
تنظیمات حافظه پنهان جنگو در فایل `settings.py` پیکربندی شده اند. تنظیم `CACHES` یک دیکشنری است که پیکربندی هر پشتیبان حافظه پنهان را تعریف می کند. در اینجا یک مثال از نحوه پیکربندی Memcached آورده شده است:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
این پیکربندی به جنگو می گوید که از پشتیبان حافظه پنهان Memcached استفاده کند و به یک سرور Memcached در حال اجرا بر روی `127.0.0.1` (localhost) پورت `11211` متصل شود. می توانید چندین پشتیبان حافظه پنهان را پیکربندی کنید و نام های مختلفی به آنها اختصاص دهید.
استفاده اساسی از حافظه پنهان
جنگو یک API ساده برای تعامل با حافظه پنهان ارائه می دهد. می توانید از شی `cache` از ماژول `django.core.cache` برای دریافت، تنظیم و حذف داده ها از حافظه پنهان استفاده کنید.
from django.core.cache import cache
# Set a value in the cache
cache.set('my_key', 'my_value', 300) # Store for 300 seconds
# Get a value from the cache
value = cache.get('my_key') # Returns 'my_value' if the key exists, otherwise None
# Delete a value from the cache
cache.delete('my_key')
استراتژی های ذخیره سازی در جنگو
جنگو چندین استراتژی ذخیره سازی را ارائه می دهد که نیازهای مختلف و معماری های برنامه را برآورده می کند. بیایید رایج ترین رویکردها را بررسی کنیم:
ذخیره سازی در هر سایت
ذخیره سازی در هر سایت کل پاسخ را برای یک وب سایت ذخیره می کند. این ساده ترین شکل ذخیره سازی است و می تواند به طور قابل توجهی عملکرد وب سایت های استاتیک یا وب سایت هایی با محتوای به ندرت در حال تغییر را بهبود بخشد. برای فعال کردن ذخیره سازی در هر سایت، باید `UpdateCacheMiddleware` و `FetchFromCacheMiddleware` را به تنظیم `MIDDLEWARE` در `settings.py` خود اضافه کنید. بسیار مهم است که ترتیب درست باشد. `UpdateCacheMiddleware` باید اول و `FetchFromCacheMiddleware` باید آخر باشد.
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
همچنین باید تنظیمات `CACHE_MIDDLEWARE_ALIAS` و `CACHE_MIDDLEWARE_SECONDS` را برای تعیین پشتیبان حافظه پنهان و زمان انقضای حافظه پنهان، به ترتیب، پیکربندی کنید.
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_SECONDS = 600 # Cache for 10 minutes
نکته مهم: ذخیره سازی در هر سایت به طور کلی برای وب سایت هایی با محتوای پویا یا تجربیات کاربری شخصی سازی شده مناسب نیست، زیرا می تواند منجر به نمایش اطلاعات نادرست یا قدیمی شود.
ذخیره سازی در هر نما
ذخیره سازی در هر نما به شما امکان می دهد خروجی نماهای فردی را ذخیره کنید. این یک رویکرد دانه ای تر از ذخیره سازی در هر سایت است و برای وب سایت هایی با ترکیبی از محتوای استاتیک و پویا مناسب است.
می توانید با استفاده از دکوراتور `cache_page` ذخیره سازی در هر نما را فعال کنید:
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # Cache for 15 minutes
def my_view(request):
# ...
return render(request, 'my_template.html', {'data': data})
دکوراتور `cache_page` زمان انقضای حافظه پنهان را بر حسب ثانیه به عنوان آرگومان می گیرد. این کل پاسخ تولید شده توسط نما، از جمله الگو و هر داده دیگری را ذخیره می کند.
ذخیره سازی قطعه الگو
ذخیره سازی قطعه الگو به شما امکان می دهد بخش های خاصی از یک الگو را ذخیره کنید. این دانه ای ترین رویکرد ذخیره سازی است و برای وب سایت هایی با محتوای بسیار پویا که فقط بخش های خاصی از صفحه نیاز به ذخیره شدن دارند مناسب است.
برای استفاده از ذخیره سازی قطعه الگو، باید کتابخانه تگ الگوی `cache` را در الگوی خود بارگیری کنید:
{% load cache %}
سپس، می توانید از تگ `cache` برای بسته بندی قطعه الگویی که می خواهید ذخیره کنید استفاده کنید:
{% cache 500 sidebar %}
<!-- Sidebar content -->
<ul>
{% for item in sidebar_items %}
<li>{{ item.title }}</li>
{% endfor %}
</ul>
{% endcache %}
تگ `cache` دو آرگومان می گیرد: زمان انقضای حافظه پنهان بر حسب ثانیه و یک پیشوند کلید حافظه پنهان. از پیشوند کلید حافظه پنهان برای شناسایی قطعه ذخیره شده استفاده می شود. اگر به یک vary on context نیاز است، از پارامتر `vary on` به این صورت استفاده کنید:
{% cache 500 sidebar item.id %}
<!-- Sidebar content -->
<ul>
{% for item in sidebar_items %}
<li>{{ item.title }}</li>
{% endfor %}
</ul>
{% endcache %}
جنگو به طور خودکار یک کلید حافظه پنهان منحصر به فرد برای هر قطعه بر اساس پیشوند و هر متغیری که در داخل قطعه استفاده می شود، تولید می کند. هنگامی که الگو رندر می شود، جنگو بررسی می کند که آیا قطعه قبلاً ذخیره شده است یا خیر. اگر اینطور باشد، جنگو قطعه را از حافظه پنهان بازیابی می کند و آن را در الگو وارد می کند. در غیر این صورت، جنگو قطعه را رندر می کند و آن را برای استفاده در آینده در حافظه پنهان ذخیره می کند.
مثال: وب سایت خبری بین المللی
یک وب سایت خبری بین المللی را در نظر بگیرید که مقالات خبری، پیش بینی های آب و هوا و نرخ های سهام را نمایش می دهد. مقالات خبری و پیش بینی های آب و هوا به طور مکرر به روز می شوند، در حالی که نرخ های سهام کمتر به روز می شوند. در این سناریو، می توان از ذخیره سازی قطعه الگو برای ذخیره قطعه نرخ های سهام استفاده کرد و بار روی سرور نرخ های سهام را کاهش داد.
{% load cache %}
<div class="news-article">
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
</div>
<div class="weather-forecast">
<h3>Weather Forecast</h3>
<p>{{ weather.temperature }}°C</p>
<p>{{ weather.description }}</p>
</div>
{% cache 3600 stock_quotes %}
<div class="stock-quotes">
<h3>Stock Quotes</h3>
<ul>
{% for quote in stock_quotes %}
<li>{{ quote.symbol }}: {{ quote.price }}</li>
{% endfor %}
</ul>
</div>
{% endcache %}
ابطال حافظه پنهان
ابطال حافظه پنهان فرآیند حذف داده های قدیمی از حافظه پنهان است. بسیار مهم است که اطمینان حاصل شود که حافظه پنهان حاوی جدیدترین اطلاعات است. جنگو چندین تکنیک برای ابطال حافظه پنهان ارائه می دهد:
- انقضای مبتنی بر زمان: تنظیم زمان انقضا برای داده های ذخیره شده تضمین می کند که پس از یک دوره معین به طور خودکار از حافظه پنهان حذف می شوند. این ساده ترین شکل ابطال حافظه پنهان است.
- ابطال دستی: می توانید به صورت دستی ورودی های حافظه پنهان را با استفاده از متد `cache.delete()` ابطال کنید. این زمانی مفید است که نیاز دارید ورودی های حافظه پنهان خاص را بر اساس رویدادهای خاص ابطال کنید.
- ابطال مبتنی بر سیگنال: می توانید از چارچوب سیگنال جنگو برای ابطال ورودی های حافظه پنهان زمانی که مدل های خاص ایجاد، به روز یا حذف می شوند استفاده کنید. این تضمین می کند که هر زمان که داده های زیربنایی تغییر می کنند، حافظه پنهان به طور خودکار به روز می شود.
- استفاده از نسخه سازی: یک شماره نسخه را در کلید حافظه پنهان قرار دهید. هنگامی که داده های زیربنایی تغییر می کنند، شماره نسخه را افزایش دهید. این باعث می شود جنگو داده های به روز شده را از پایگاه داده بازیابی کند.
مثال ابطال حافظه پنهان مبتنی بر سیگنال
فرض کنید یک مدل `Product` دارید و می خواهید هر زمان که یک محصول ایجاد، به روز یا حذف می شود، حافظه پنهان را باطل کنید. می توانید از سیگنال های جنگو برای دستیابی به این هدف استفاده کنید.
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.core.cache import cache
from .models import Product
@receiver(post_save, sender=Product)
def product_saved(sender, instance, **kwargs):
cache.delete('product_list') # Invalidate the product list cache
cache.delete(f'product_detail_{instance.id}') # invalidate the product detail cache
@receiver(post_delete, sender=Product)
def product_deleted(sender, instance, **kwargs):
cache.delete('product_list') # Invalidate the product list cache
cache.delete(f'product_detail_{instance.id}') # invalidate the product detail cache
این کد دو گیرنده سیگنال را ثبت می کند: یکی برای سیگنال `post_save` و دیگری برای سیگنال `post_delete`. هر زمان که یک شی `Product` ذخیره یا حذف می شود، گیرنده سیگنال مربوطه فراخوانی می شود و ورودی حافظه پنهان `product_list` را باطل می کند. این تضمین می کند که لیست محصولات همیشه به روز است.
نکته مهم: ابطال حافظه پنهان می تواند یک کار پیچیده باشد، به خصوص در محیط های توزیع شده. مهم است که به دقت الزامات سازگاری داده های برنامه خود را در نظر بگیرید و استراتژی ابطال مناسب را انتخاب کنید.
بهترین شیوه ها برای ذخیره سازی جنگو
برای استفاده موثر از ذخیره سازی در برنامه های جنگو خود، بهترین شیوه های زیر را در نظر بگیرید:
- شناسایی فرصت های ذخیره سازی: عملکرد برنامه خود را تجزیه و تحلیل کنید و مناطقی را که ذخیره سازی می تواند بیشترین تأثیر را داشته باشد شناسایی کنید. بر ذخیره کردن داده های پرکاربرد و عملیات پرهزینه تمرکز کنید.
- انتخاب پشتیبان حافظه پنهان مناسب: یک پشتیبان حافظه پنهان را انتخاب کنید که الزامات برنامه شما را از نظر عملکرد، مقیاس پذیری و ماندگاری داده ها برآورده کند. Memcached و Redis به طور کلی گزینه های خوبی برای محیط های تولید هستند.
- تنظیم زمان های انقضای مناسب: زمان های انقضا را برای داده های ذخیره شده با دقت در نظر بگیرید. زمان های انقضای خیلی کوتاه می توانند مزایای ذخیره سازی را از بین ببرند، در حالی که زمان های انقضای خیلی طولانی می توانند منجر به داده های قدیمی شوند.
- پیاده سازی ابطال موثر حافظه پنهان: یک استراتژی ابطال قوی حافظه پنهان را توسعه دهید تا اطمینان حاصل شود که حافظه پنهان حاوی جدیدترین اطلاعات است.
- نظارت بر عملکرد حافظه پنهان: عملکرد حافظه پنهان خود را برای شناسایی مشکلات احتمالی و بهینه سازی پیکربندی آن نظارت کنید. از آمار ذخیره سازی برای ردیابی نرخ ضربه و نرخ تخلیه حافظه پنهان استفاده کنید.
- از نسخه سازی حافظه پنهان برای نقاط پایانی API استفاده کنید: هنگام برخورد با API ها، نسخه سازی را پیاده سازی کنید و شماره نسخه را در کلید حافظه پنهان قرار دهید. این به شما امکان می دهد به راحتی حافظه پنهان را هنگام انتشار نسخه جدیدی از API باطل کنید.
- استفاده از شبکه تحویل محتوا (CDN) را در نظر بگیرید: برای دارایی های استاتیک مانند تصاویر، فایل های CSS و فایل های JavaScript، استفاده از CDN را برای توزیع محتوای خود در چندین سرور در سراسر جهان در نظر بگیرید. این می تواند به طور قابل توجهی زمان بارگذاری صفحه را برای کاربران در مناطق جغرافیایی مختلف بهبود بخشد.
مثال: ذخیره کردن یک پرس و جو پیچیده پایگاه داده
فرض کنید یک پرس و جو پیچیده پایگاه داده دارید که لیستی از محصولات را بر اساس چندین معیار بازیابی می کند. این پرس و جو می تواند کند و منابع فشرده باشد. می توانید نتایج این پرس و جو را برای بهبود عملکرد ذخیره کنید.
from django.core.cache import cache
from .models import Product
def get_products(category, price_range, availability):
cache_key = f'products_{category}_{price_range}_{availability}'
products = cache.get(cache_key)
if products is None:
products = Product.objects.filter(
category=category,
price__range=price_range,
availability=availability
)
cache.set(cache_key, products, 3600) # Cache for 1 hour
return products
این کد ابتدا یک کلید حافظه پنهان بر اساس پارامترهای پرس و جو می سازد. سپس، بررسی می کند که آیا نتایج قبلاً ذخیره شده اند یا خیر. اگر اینطور باشد، نتایج را از حافظه پنهان بازیابی می کند. در غیر این صورت، پرس و جو پایگاه داده را اجرا می کند، نتایج را ذخیره می کند و آنها را برمی گرداند.
تکنیک های پیشرفته ذخیره سازی
چارچوب ذخیره سازی جنگو همچنین از تکنیک های پیشرفته تر ذخیره سازی پشتیبانی می کند، مانند:
- تغییر بر اساس هدرهای درخواست: می توانید حافظه پنهان را برای تغییر خروجی خود بر اساس هدرهای درخواست خاص، مانند هدر `Accept-Language` پیکربندی کنید. این به شما امکان می دهد محتوای ذخیره شده مختلف را بر اساس ترجیح زبان کاربر ارائه دهید. این کار با استفاده از هدر `Vary: Accept-Language` انجام می شود.
- استفاده از پیشوندهای کلید حافظه پنهان: می توانید از پیشوندهای کلید حافظه پنهان برای گروه بندی ورودی های حافظه پنهان مرتبط استفاده کنید. این کار ابطال چندین ورودی حافظه پنهان را به طور همزمان آسان تر می کند.
- ادغام با کتابخانه های ذخیره سازی شخص ثالث: می توانید چارچوب ذخیره سازی جنگو را با کتابخانه های ذخیره سازی شخص ثالث، مانند `django-redis` و `django-memcached` ادغام کنید تا از ویژگی های پیشرفته و بهینه سازی های عملکرد آنها استفاده کنید.
- درخواستهای GET شرطی: از درخواستهای GET شرطی HTTP استفاده کنید. با استفاده از هدرهای `ETag` یا `Last-Modified`، مرورگر میتواند بررسی کند که آیا منبع تغییر کرده است یا خیر. اگر نه، سرور با یک 304 Not Modified پاسخ میدهد که باعث صرفهجویی در پهنای باند و منابع سرور میشود.
ذخیره سازی جنگو: نتیجه گیری
ذخیره سازی یک تکنیک اساسی برای بهبود عملکرد و مقیاس پذیری برنامه های وب جنگو است. با درک استراتژی های مختلف ذخیره سازی، پشتیبان های حافظه پنهان و تکنیک های ابطال حافظه پنهان، می توانید به طور موثر ذخیره سازی را در برنامه های خود ادغام کنید و تجربه کاربری سریعتر و پاسخگوتر ارائه دهید. به یاد داشته باشید که به دقت الزامات خاص برنامه خود را در نظر بگیرید و استراتژی و پیکربندی ذخیره سازی مناسب را انتخاب کنید.
با پیروی از بهترین شیوه های ذکر شده در این راهنما، می توانید مزایای ذخیره سازی جنگو را به حداکثر برسانید و برنامه های وب با کارایی بالا ایجاد کنید که می توانند حجم زیادی از ترافیک را مدیریت کنند. به طور مداوم استراتژی ذخیره سازی خود را نظارت و بهینه سازی کنید تا از عملکرد بهینه و تجربه کاربری یکپارچه اطمینان حاصل کنید.