پادشاهِ کُدنویسا شو!
کینگتو - آموزش برنامه نویسی تخصصصی - دات نت - سی شارپ - بانک اطلاعاتی و امنیت

تفاوت بین Response Caching, Output Caching, Memory Cache, Distributed Cache در ASP.NET CORE

8 بازدید 0 نظر ۱۴۰۴/۱۲/۰۹
در دنیای توسعه وب با ASP.NET Core، «سرعت» حرف اول را می‌زند. کاربری که بیش از ۳ ثانیه منتظر لود شدن یک صفحه بماند، به احتمال زیاد آن را می‌بندد. اینجاست که کشینگ (Caching) به عنوان منجی وارد عمل می‌شود. اما وقتی وارد مستندات مایکروسافت می‌شوید، با اصطلاحات مختلفی مثل Memory Cache، Distributed Cache، Response Caching و Output Caching روبرو می‌شوید که ممکن است در ابتدا گیج‌کننده به نظر برسند.

در این مقاله جامع، قرار است یک‌بار برای همیشه تفاوت این چهار مفهوم را به زبان ساده اما فنی بررسی کنیم تا بدانید در هر سناریو، کدام ابزار بهترین گزینه برای شماست.

 

حافظه پنهان محلی یا Memory Cache

ساده‌ترین، سریع‌ترین و در دسترس‌ترین نوع کش.

IMemoryCache در ASP.NET Core به شما اجازه می‌دهد داده‌ها را مستقیماً در RAM همان سروری که اپلیکیشن روی آن در حال اجراست، ذخیره کنید.

  • نحوه کارکرد: داده‌ها به صورت کلید-مقدار (Key-Value) در حافظه سرور قرار می‌گیرند.

  • سرعت: فوق‌العاده بالا (چون هیچ شبکه یا دیسکی در میان نیست).

  • بزرگترین نقطه ضعف: اگر اپلیکیشن ری‌استارت شود یا سرور خاموش شود، تمام داده‌ها پاک می‌شوند. همچنین، این داده‌ها بین چند سرور به اشتراک گذاشته نمی‌شوند.

چه زمانی از Memory Cache استفاده کنیم؟

زمانی که اپلیکیشن شما روی یک سرور واحد اجرا می‌شود و حجم داده‌هایی که می‌خواهید کش کنید کم است (مثلاً لیست استان‌ها یا تنظیمات ثابت سایت).

 

حافظه پنهان توزیع‌شده یا Distributed Cache

وقتی قرار است بزرگ فکر کنید!

اگر اپلیکیشن شما روی چندین سرور (Load Balancer) اجرا می‌شود، Memory Cache دیگر جوابگو نیست؛ چون هر سرور کش مخصوص به خودش را دارد. اینجاست که IDistributedCache وارد می‌شود.

  • نحوه کارکرد: داده‌ها در یک سرویس خارجی (مثل Redis یا SQL Server) ذخیره می‌شوند. همه سرورهای اپلیکیشن به این منبع واحد متصل می‌شوند.

  • سرعت: کمی کندتر از Memory Cache (به دلیل تاخیر شبکه)، اما هنوز بسیار سریع‌تر از دیتابیس اصلی.

  • مزیت اصلی: پایداری داده‌ها (Persistence). اگر یک سرور کرش کند، بقیه سرورها هنوز به کش دسترسی دارند.

 

پاسخ‌دهی کش شده یا Response Caching

کش کردن در سطح پروتکل HTTP.

Response Caching لزوماً داده‌ها را در سرور شما ذخیره نمی‌کند، بلکه به مرورگر کاربر یا پروکسی‌های میانی (مثل Cloudflare) دستور می‌دهد که پاسخ یک درخواست را برای مدتی ذخیره کنند.

  • نحوه کارکرد: این روش با استفاده از هدرهای HTTP مثل Cache-Control کار می‌کند.

  • مثال: وقتی سرور هدر max-age=60 را می‌فرستد، مرورگر تا ۶۰ ثانیه بعد برای همان آدرس، درخواستی به سرور نمی‌فرستد و نسخه ذخیره شده را نشان می‌دهد.

  • محدودیت: شما کنترل زیادی روی حذف کش (Invalidation) ندارید. اگر داده‌ای تغییر کند، تا زمانی که زمان انقضا نرسد، مرورگر کاربر همچنان نسخه قدیمی را نشان می‌دهد.

 

کش خروجی یا Output Caching

قدرت مطلق در ASP.NET Core 7.0 و نسخه‌های جدیدتر.

مایکروسافت در .NET 7 ویژگی جدیدی به نام Output Caching معرفی کرد که تکاملی بر Response Caching است. این ویژگی برخلاف مورد قبلی، پاسخ را در سمت سرور ذخیره می‌کند.

  • نحوه کارکرد: وقتی درخواستی می‌رسد، ASP.NET Core خروجی نهایی (HTML یا JSON) را تولید کرده و در سرور (Memory یا Distributed) ذخیره می‌کند. درخواست‌های بعدی اصلاً به مرحله اجرای کد اکشن (Action Method) نمی‌رسند.

  • تفاوت با Response Caching: در اینجا شما کنترل کاملی دارید. می‌توانید به صورت دستی کش را خالی کنید (Eviction)، برای گروه‌های مختلف کاربران نسخه‌های متفاوت کش بسازید (Vary by boundary) و از "تگ‌ها" برای مدیریت کش استفاده کنید.

 

سناریوی دنیای واقعی

فرض کنید یک فروشگاه اینترنتی دارید:

  1. لیست دسته‌بندی‌ها: چون به ندرت تغییر می‌کند و حجم کمی دارد، از Memory Cache استفاده کنید.

  2. سبد خرید کاربران: چون باید در تمام سرورها در دسترس باشد و با ری‌استارت شدن سرور نپرد، از Distributed Cache (Redis) استفاده کنید.

  3. فایل‌های CSS و تصاویر: از Response Caching استفاده کنید تا مرورگر کاربر اصلاً برای این فایل‌ها به سرور شما مراجعه نکند.

  4. صفحه جزئیات محصول: از Output Caching استفاده کنید. چرا؟ چون می‌توانید آن را با یک "تگ" (مثل ProductId) ذخیره کنید و به محض اینکه قیمت محصول در پنل مدیریت تغییر کرد، فقط کش همان محصول را به صورت آنی پاک کنید.

یک نکته فنی کوچک

در محاسبات مربوط به انقضای کش، ما معمولاً با دو مفهوم سروکار داریم:

  • Absolute Expiration: زمان دقیق انقضا (مثلاً ساعت ۱۰ شب).

  • Sliding Expiration: تمدید زمان انقضا در صورت استفاده مجدد (اگر انقضا ۱۰ دقیقه باشد و در دقیقه ۹ استفاده شود، ۱۰ دقیقه دیگر تمدید می‌شود).

در فرمول‌های پیچیده مدیریت حافظه، رابطه بین این دو را می‌توان به صورت زیر در نظر گرفت (البته به صورت انتزاعی):

$$Expiration = \min(Absolute, LastAccess + Sliding)$$

 

نتیجه‌گیری

  • اگر به دنبال سرعت خالص در یک سرور هستید: Memory Cache.

  • اگر سیستم شما چند سروره (Cloud) است: Distributed Cache.

  • اگر می‌خواهید بار شبکه را کم کنید: Response Caching.

  • اگر می‌خواهید کنترل هوشمندانه‌ای روی کش شدن خروجی صفحات داشته باشید: Output Caching.

استفاده هوشمندانه از ترکیبی از این ابزارها، تفاوت بین یک سایت "کند و آزاردهنده" و یک سایت "بسیار سریع و حرفه‌ای" را رقم می‌زند.

 
 
لینک استاندارد شده: F7RsYAT

0 نظر

    هنوز نظری برای این مقاله ثبت نشده است.
جستجوی مقاله و آموزش
دوره‌ها با تخفیفات ویژه