6,000,000 تومان
3,000,000 تومان
در این مقاله جامع، قرار است یکبار برای همیشه تفاوت این چهار مفهوم را به زبان ساده اما فنی بررسی کنیم تا بدانید در هر سناریو، کدام ابزار بهترین گزینه برای شماست.
سادهترین، سریعترین و در دسترسترین نوع کش.
IMemoryCache در ASP.NET Core به شما اجازه میدهد دادهها را مستقیماً در RAM همان سروری که اپلیکیشن روی آن در حال اجراست، ذخیره کنید.
نحوه کارکرد: دادهها به صورت کلید-مقدار (Key-Value) در حافظه سرور قرار میگیرند.
سرعت: فوقالعاده بالا (چون هیچ شبکه یا دیسکی در میان نیست).
بزرگترین نقطه ضعف: اگر اپلیکیشن ریاستارت شود یا سرور خاموش شود، تمام دادهها پاک میشوند. همچنین، این دادهها بین چند سرور به اشتراک گذاشته نمیشوند.
چه زمانی از Memory Cache استفاده کنیم؟
زمانی که اپلیکیشن شما روی یک سرور واحد اجرا میشود و حجم دادههایی که میخواهید کش کنید کم است (مثلاً لیست استانها یا تنظیمات ثابت سایت).
وقتی قرار است بزرگ فکر کنید!
اگر اپلیکیشن شما روی چندین سرور (Load Balancer) اجرا میشود، Memory Cache دیگر جوابگو نیست؛ چون هر سرور کش مخصوص به خودش را دارد. اینجاست که IDistributedCache وارد میشود.
نحوه کارکرد: دادهها در یک سرویس خارجی (مثل Redis یا SQL Server) ذخیره میشوند. همه سرورهای اپلیکیشن به این منبع واحد متصل میشوند.
سرعت: کمی کندتر از Memory Cache (به دلیل تاخیر شبکه)، اما هنوز بسیار سریعتر از دیتابیس اصلی.
مزیت اصلی: پایداری دادهها (Persistence). اگر یک سرور کرش کند، بقیه سرورها هنوز به کش دسترسی دارند.
کش کردن در سطح پروتکل HTTP.
Response Caching لزوماً دادهها را در سرور شما ذخیره نمیکند، بلکه به مرورگر کاربر یا پروکسیهای میانی (مثل Cloudflare) دستور میدهد که پاسخ یک درخواست را برای مدتی ذخیره کنند.
نحوه کارکرد: این روش با استفاده از هدرهای HTTP مثل Cache-Control کار میکند.
مثال: وقتی سرور هدر max-age=60 را میفرستد، مرورگر تا ۶۰ ثانیه بعد برای همان آدرس، درخواستی به سرور نمیفرستد و نسخه ذخیره شده را نشان میدهد.
محدودیت: شما کنترل زیادی روی حذف کش (Invalidation) ندارید. اگر دادهای تغییر کند، تا زمانی که زمان انقضا نرسد، مرورگر کاربر همچنان نسخه قدیمی را نشان میدهد.
قدرت مطلق در 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) و از "تگها" برای مدیریت کش استفاده کنید.
فرض کنید یک فروشگاه اینترنتی دارید:
لیست دستهبندیها: چون به ندرت تغییر میکند و حجم کمی دارد، از Memory Cache استفاده کنید.
سبد خرید کاربران: چون باید در تمام سرورها در دسترس باشد و با ریاستارت شدن سرور نپرد، از Distributed Cache (Redis) استفاده کنید.
فایلهای CSS و تصاویر: از Response Caching استفاده کنید تا مرورگر کاربر اصلاً برای این فایلها به سرور شما مراجعه نکند.
صفحه جزئیات محصول: از Output Caching استفاده کنید. چرا؟ چون میتوانید آن را با یک "تگ" (مثل ProductId) ذخیره کنید و به محض اینکه قیمت محصول در پنل مدیریت تغییر کرد، فقط کش همان محصول را به صورت آنی پاک کنید.
یک نکته فنی کوچک
در محاسبات مربوط به انقضای کش، ما معمولاً با دو مفهوم سروکار داریم:
Absolute Expiration: زمان دقیق انقضا (مثلاً ساعت ۱۰ شب).
Sliding Expiration: تمدید زمان انقضا در صورت استفاده مجدد (اگر انقضا ۱۰ دقیقه باشد و در دقیقه ۹ استفاده شود، ۱۰ دقیقه دیگر تمدید میشود).
در فرمولهای پیچیده مدیریت حافظه، رابطه بین این دو را میتوان به صورت زیر در نظر گرفت (البته به صورت انتزاعی):
$$Expiration = \min(Absolute, LastAccess + Sliding)$$
اگر به دنبال سرعت خالص در یک سرور هستید: Memory Cache.
اگر سیستم شما چند سروره (Cloud) است: Distributed Cache.
اگر میخواهید بار شبکه را کم کنید: Response Caching.
اگر میخواهید کنترل هوشمندانهای روی کش شدن خروجی صفحات داشته باشید: Output Caching.
استفاده هوشمندانه از ترکیبی از این ابزارها، تفاوت بین یک سایت "کند و آزاردهنده" و یک سایت "بسیار سریع و حرفهای" را رقم میزند.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.