Response Caching سفارشی با استفاده از NCache در ASP.NET Core

NCache یک فریم‌ورک کشینگ (caching) توزیع‌شده open-source و cross-platform است. این یک فریم‌ورک کشینگ توزیع‌شده خیلی سریع است که به صورت خطی مقیاس‌پذیر می‌باشد. در این مقاله به بررسی شیوه‌ای که می‌توانیم با NCache و response caching middleware در ASP.NET Core کار کنیم، می‌پردازیم.

Response Caching سفارشی با استفاده از NCache در ASP.NET Core

آکادمی برنامه نویسان ، برگزار کننده دوره های آموزش برنامه نویسی با استفاده از اساتید مجرب و حرفه ای در سراسر ایران .

[ جهت مشاهده دوره های درحال ثبت نام کلیک کنید ]

ارائه مدارک معتبر آموزشی و ورود به بازار کار .

پیش‌نیازها

شما باید ویژوال استودیو و ASP.NET Core را بر روی سیستم خود نصب کنید تا بتوانید با نمونه کدهای مطرح‌شده در این مقاله کار کنید.

کشینگ چیست و چرا مورد نیاز است؟

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

response caching چیست و چرا باید از آن استفاده کنیم؟

Response caching به شما امکان می‌دهد تا پاسخ‌های سرور از یک درخواست را کش کنید تا درخواست‌های بعدی از کش استفاده کرده و انجام شوند. این یک نوع حافظه پنهان است که در آن شما می‌توانید معمولا هدرهای مربوط به کش را در پاسخ‌های HTTP مشخص کنید تا به کلاینت اجازه دهید تا پاسخ‌ها را کش کند. می‌توانید از cache control header استفاده کنید تا سیاست‌های کشینگ مرورگر را در درخواست‌هایی که از کلاینت می‌آید و همچنین پاسخ‌هایی که از سرور می‌آید تنظیم کنید. مثلا cache-control: max-age=90 دلالت بر این دارد که پاسخ سرور برای یک دوره 90 ثانیه‌ای معتبر است. پس از سپری‌ شدن این مدت، مرورگر وب باید نسخه جدیدی از داده‌ها را درخواست دهد.

مزایای اصلی response caching شامل کاهش ترافیک شبکه، بهبود پاسخگویی، و از این رو بهبود عملکرد است. استفاده صحیح از response caching می‌تواند الزامات پهنای باند را کاهش دهد و عملکرد برنامه را بهبود بخشد.

می‌توانید از response caching برای کش کردن آیتم‌هایی که استاتیک بوده و دارای حداقل احتمال تغییر هستند استفاده کنید، مثل فایل‌های CSS و JavaScript و غیره.

چرا از NCache به عنوان response caching middleware استفاده کنیم؟

اگر برنامه وب شما دارای ترافیک بالا است ممکن است نیاز به کشینگ توزیع‌شده داشته باشید. NCache یکی از بهترین response caching middleware ها است. NCache مزایای زیر را به عنوان کش توزیع‌شده ارائه می‌دهد:

صد در صد .NET : NCache در NET. و در NET Core. ساخته شده است. یکی از کش‌های توزیع‌شده نادر است که به طور کامل با استفاده از NET. ساخته شده است.

سریع و مقیاس‌پذیر: NCache مقیاس‌پذیری خطی را ارائه می‌دهد و بسیار سریع است زیرا از یک کش توزیع‌شده در حافظه استفاده می‌کند. کشینگ توزیع‌شده مفهومی است که در آن داده‌های کش شده ممکن است سرورها یا گره‌های متعددی را اندازه بگیرند اما در همان شبکه، بنابراین کشینگ به راحتی مقیاس می‌شود. توانایی مقیاس به صورت خطی، NCache را یک انتخاب عالی برای وقتی می‌سازد که شما چالش‌های عملکرد را در برنامه ASP.NET Core در زمان اوج لود کردن تجربه می‌کنید.

دسترسی‌پذیری بالا: یکی از ویژگی‌های عالی Ncache پشتیبانی از معماری peer clustering است. NCache قادر به کش کردن صفحات وب ASP.NET Core با استفاده از response caching است به طوری که هنگامی که کش کردن سرور از کار می‌افتد، هیچ گونه اتلاف داده‌ای وجود ندارد.

NCache چندین ویژگی ارائه می‌دهد، مثل پشتیبانی مجازی‌سازی و کانتینر کردن، عملیات ناهمزمان، قفل کردن کش (cache locking)، قابلیت جستجو، قابلیت ارتجاعی کش، مدیریت کش و غیره.

ساخت یک برنامه جدید ASP.NET Core MVC

برای ایجاد برنامه وب ASP.NET Core MVC در ویژوال استودیو 2019، مراحل زیر را دنبال کنید:

1. ویرایشگر ویژوال استودیو 2019 را باز کنید.

2. گزینه " Create a new project" را انتخاب کنید.

3. گزینه " ASP.NET Core Web Application" را برای مشخص کردن نوع پروژه انتخاب کنید.

4. "Next" را کلیک کنید.

5. نام پروژه و جایی که می‌خواهید پروژه در آنجا ذخیره شود را مشخص کنید.

6. به صورت اختیاری، می‌توانید چک باکس " Place solution and project in the same directory" را تیک بزنید.

7. " Create" را کلیک کنید.

8. در پنجره "Create a new ASP.NET Core Web Application"، " Web Application (Model-View-Controller)" را به عنوان قالب پروژه انتخاب کنید.

9. ASP.NET Core 3.0 را از دراپ‌دان لیست انتخاب کنید تا ورژن ASP.NET Core را که می‌خواهید استفاده کنید را مشخص کنید.

10. تیک چک‌باکس‌های " No Authentication"، " Configure for HTTPS" و " Enable Docker Support" را بردارید، زیرا در اینجا ما از هیچ کدام از این موارد استفاده نمی‌کنیم.

11. در آخر بر روی " Create" کلیک کنید.

نصب NuGet packages

برای کار با Ncache، باید پکیج‌های زیر را از طریق NuGet Package Manager برای پروژه خود نصب کنید.

Install-Package NCache.Microsoft.Extensions.Caching

توجه داشته باشید که باید اسمبلی Alachisoft.NCache.Caching.Distributed را در برنامه خود قرار دهید تا بتوانید با نوع‌ها در کتابخانه NCache کار کنید. دستور زیر نشان می‌دهد که چطور می‌توانید این کار را انجام دهید.

using Alachisoft.NCache.Caching.Distributed;

گزینه‌های Response caching در NCache

سه روش وجود دارد که با استفاده از NCache می‌توانید response caching را پیاده‌سازی کنید که شامل موارد زیر هستند:

کش کردن مبتنی بر HTTP: این نوعی response caching است که داده را در انتهای مرورگر وب ذخیره می‌کند. ذخیره‌سازی مبتنی بر HTTP می‌تواند هدف قرار دادن سرور را کاهش دهد زیرا درخواست‌های بعدی برای یک منبع خاص می‌تواند از کش استفاده کند.

کش درون حافظه‌ای: این نوع دیگری از response caching است که داده‌ها در حافظه وب سرور کش می‌شوند. توجه داشته باشید که هنگامی که ASP.NET engine ریستارت می‌شود، داده‌های موجود در کش پاک می‌شوند زیرا این کشینگ in-proc mode است. کش کردن درون حافظه‌ای سریع است زیرا در فضای آدرس برنامه شما قرار دارد.

کش توزیع‌شده: این استراتژی دیگری است که در response caching استفاده می‌شود. کش توزیع‌شده یک مورد خارجی برای برنامه است. در این استراتژی، کش در بین چندین سرور در یک web farm توزیع می‌شود. هر کدام از سرورها می‌توانند به درخواست داده از کلاینت پاسخ دهند. می‌توانید از NCache از Alachisoft برای پیاده‌سازی کش توزیع‌شده استفاده کنید. اگر برنامه خود را در یک محیط چند سروری load balanced اجرا می‌کنید،‌ NCache می‌تواند به شما در کشینگ توزیع‌شده داده‌های برنامه کمک کند.

افزودن سرویس‌های response caching

می‌توانید از متد AddResponseCaching() در متد ConfigureServices() کلاس Startup برای کانفیگ response caching استفاده کنید. فایل Startup.cs را باز کنید و کد زیر را در متد ConfigureServices() بنویسید.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCaching();
    services.AddMvc();
}

توجه داشته باشید که response caching middleware به طور ضمنی در ASP.NET Core موجود است. extension method ی UseResponseCaching برای اضافه کردن middleware به pipeline ی پردازش درخواست استفاده می‌شود.

در آخر، متد UseResponseCaching() را برای افزودن response caching middleware به pipeline فراخوانی کنید. به قطعه کد ارائه شده در زیر مراجعه کنید که نشان می‌دهد چگونه می‌توان به این نتیجه رسید.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //Other code
    app.UseResponseCaching();   
}

کانفیگ response cache middleware

Response caching یک ویژگی عالی در ASP.NET Core است و یک قابلیت داخلی است. می‌توانید از این مزیت استفاده کنید تا تعداد درخواست‌های کلاینت به سرور را کاهش دهید. NCache همچنین می‌تواند به عنوان response caching middleware استفاده شود. بیاید بررسی کنیم که چگونه می‌توانیم به این نتیجه برسیم.

برای استفاده از NCache به عنوان response cache middleware، باید موارد زیر را انجام دهید:

1. تنظیمات NCache را در فایل Appsettings.json مشخص کنید.

2. متدهای AddResponseCaching و AddNCacheDistributedCache را در متد ConfigureServices کلاس Startup فراخوانی کنید.

می‌توانید NCache را به عنوان کش توزیع‌شده در دو روش کانفیگ کنید:

با تعیین cache configuration در AppSettings.json

با تعیین cache configuration در IOptions

مشخص کردن cache configuration در فایل AppSettings.json

قطعه کد زیر نشان می‌دهد چگونه می‌توانید تنظیمات cache configuration در فایل AppSettings.json را مشخص کنید. بخشی به نام NCacheSettings اضافه شده است.

{
      "NCacheSettings": {
          "CacheName": "SpecifytheCacheNameHere",
          "EnableLogs": "True",
          "RequestTimeout": "60"
      }
  }

اینترفیس ASP.NET Core IDistributedCache در کتابخانه NCache پیاده‌سازی شده است. این به شما اجازه می‌دهد تا از NCache به عنوان response cache middleware در ASP.NET Core استفاده کنید.

برای استفاده از NCache به عنوان response cache middleware، کد زیر را در متد ConfigureServices() بنویسید.

public void ConfigureServices(IServiceCollection services)
{
  services.AddResponseCaching();
  services.AddNCacheDistributedCache
 (Configuration.GetSection("NCacheSettings"));
  services.AddMvc();
}

مشخص کردن cache configuration در IOptions

شما همچنین می‌توانید جزئیات کانفیگ NCache را به عنوان IOptions نیز مشخص کنید. برای یادگیری این موضوع به قطعه کد زیر مراجعه کنید.

public void ConfigureServices(IServiceCollection services)
{
    //Write code to add other services 
    services.AddMvc();
    services.AddNCacheDistributedCache(options =>
    {
        options.CacheName = "SpecifytheCacheNameHere";
        options.EnableLogs = true;
        options.ExceptionsEnabled = true; 
    });
}

در بخش زیر، نحوه استفاده از NCache به عنوان response caching middleware در action methodها را بررسی می‌کنیم.

استفاده از response caching در action methods

با فرض اینکه response caching middleware را با موفقیت کانفیگ کرده‌اید، می‌توانید از کد زیر استفاده کنید تا از response caching در action methodها استفاده کنید.

public class HomeController : Controller
    {
         public IActionResult Index()
        {
            return View();
        }

        [ResponseCache(Duration = 60, Location = ResponseCacheLocation.None, NoStore = false)]
        public IActionResult GetData()
        {
            //Write your code here
        }
    }

از پارامتر Duration استفاده می‌شود تا مشخص شود چه مدت داده‌ها در کش باقی می‌مانند. ResponseCacheAttribute برای مشخص کردن پارامترها در response caching استفاده می‌شود. می‌توانید از پارامتر Location استفاده کنید تا مشخص شود آیا کلاینت یا پروکسی واسطه‌ای داده‌ها را کش می‌کند. مقادیر احتمالی پارامتر Location عبارتند از: ResponseCacheLocation.None، ResponseCacheLocation.Any و ResponseCacheLocation.Client.

اگر مقدار ResponseCacheLocation.Any باشد، به این معنی است که کلاینت یا پروکسی داده را کش می‌کند. اگر مقدار ResponseCacheLocation.Client باشد، یعنی کلاینت داده را کش می‌کند. پارامتر NoStore می‌تواند مقادیر Boolean باشد و اگر با true ست شود، Cache-Control header با no-store ست می‌شود.

استفاده از Distributed Cache Tag Helper

اکنون که NCache برای response caching کانفیگ شده است، می‌توانید محتوایی که می‌خواهید کش شود را تعیین کنید. برای دستیابی به این هدف، می‌توانید از Distributed Cache Tag Helpers در ASP.NET Core استفاده کنید.

قطعه کد زیر نشان می‌دهد چگونه می‌توانید یک آیتم را برای همیشه کش کنید.

<distributed-cache name="Key:A" >
    <div>@DateTime.Now.ToString()</div>
</distributed-cache>

اگر می‌خواهید برای آیتم کش شده انقضاء بگذارید، آنچه را که باید بنویسید در اینجا است.

<distributed-cache name="Key:B" expires-after ="TimeSpan.FromSeconds(30)">
    <div>@DateTime.Now.ToString()</div><br />
</distributed-cache>

قطعه کد زیر نشان می‌دهد چطور می‌توانید در صورت تغییر مقدار " vary-by" آیتمی را تعیین کنید که فقط از کش پاک شده است.

<distributed-cache name="Key:C" vary-by ="test">
    <div>@DateTime.Now.ToString()</div><br />
</distributed-cache>

تست

برای تست نمونه کدهای ارائه شده در قسمت قبلی، می‌توانید یک برنامه جدید ASP.NET Core MVC ایجاد کنید و کد زیر را در فایل Index.cshtml بنویسید.

<distributed-cache name="Key:A" >
	<div>@DateTime.Now.ToString()</div>
</distributed-cache>
<distributed-cache name="Key:B" expires-after ="TimeSpan.FromSeconds(30)">
	<div>@DateTime.Now.ToString()</div><br />
</distributed-cache>
<distributed-cache name="Key:C" vary-by ="test">
	<div>@DateTime.Now.ToString()</div><br />
</distributed-cache>

هنگام اجرای برنامه، مشاهده خواهید کرد که سه مقدار DateTime در مرورگر وب نشان داده می‌شوند. در حالی که اولین و سومین مورد تغییر نمی‌کنند، مقدار مورد دوم بعد از هر 30 ثانیه تغییر می‌کند.

خلاصه

کشینگ یک تکنیک اثبات‌شده است که در برنامه‌های وب برای بهبود عملکرد و پاسخگویی به کار می‌رود. Response caching یک تکنیک کشینگ است که در آن پاسخ از کش ارائه می‌شود. ASP.NET Core با استفاده از response caching middleware از response caching پشتیبانی می‌کند. برای اطلاعات بیشتر در مورد NCache و نحوه استفاده از آن در ASP.NET Core می‌توانید به مستندات آنلاین آن مراجعه کنید.