Caching در MVC

در این مقاله درباره افزایش کارایی اپلیکیشن با استفاده از تکنولوژی Caching در MVC بحث خواهیم کرد.

در اینجا از ویژوال استودیو ۲۰۱۲ استفاده کرده ایم. همانطور که می دانید در MVC همه چیز بر پایه رویدادها (action) است و درهر زمانی با توجه به درخواست کاربر، رویدادی فراخوانی می شود.

به عنوان مثال، زمانی که کاربر یک view را درخواست می کند، controller را صدا زده و نتیجه را دریافت می کنیم و سپس داده ها را به view متصل (Bind) می کنیم.

حال اگر کاربر این view را ظرف ۲ دقیقه ۵۰ بار درخواست کند، چه؟ در حالت عادی این اتفاق نمی افتد، اما وضعیت های نادری وجود دارد که وضعیتی شبیه به این مثال اتفاق بیفتد.

در این شرایط استفاده از تکنولوژی مفید Caching پیشنهاد می شود.

این تکنولوژی این اطمینان را به ما می دهد که هیچ رویدادی وجود ندارد که در یک بازه زمانی تکرار شود.

بنابراین اگر کاربر در همان بازه زمانی دوباره view را درخواست کند، controller دوباره آن را انجام نخواهد داد.

بلکه همان view را که پیش از این اجرا کرده است، دوباره برمی گرداند.

در این مقاله خواهیم دید که چگونه از این تکنولوژی استفاده کنیم.

همانطور که می دانید، زمانی که صحبت از کارایی می شود، معمولا کاربران از کارایی اپلیکیشن ها راضی نیستند.

بنابراین ما از هر ابزار و تکنولوژی برای بهبود کارایی استفاده می کنیم. یکی از روش های بهبود کارایی، Caching می باشد.

Caching در MVC

این تکنولوژی از رویدادهای ناخواسته یا مکرری که رخ می دهند، با Output Caching جلوگیری می کند (در ASP.Net 5 این تکنولوژی به نام ResponseCache است). Viewای که به تازگی اجرا شده است، در یک بازه زمانی محدود controller را فراخوانی نمی کند، بلکه نتیجه ای که اخیرا اجرا شده است را دوباره نمایش می دهد.

درواقع، مقداری را که controller برمی گرداند، Cache می کند.

فرض کنید controller ای دارید که تراکنش حساب بانکی شما را از دیتابیس برمی گرداند و دیتابیس معمولا هفته ای یکبار update می شود.

به طور معمول هر بار که کاربر controller را فراخوانی کند، controller به دیتابیس متصل شده و داده ها را واکشی کرده و نمایش می دهد.

اما با استفاده از این تکنولوژی، نیازی به اتصال به دیتابیس در طول یک هفته نیست، چون داده ها تغییری نکرده اند.

بنابراین می توانیم Output Caching را تنظیم کنیم تا محتوای controller، Cache شده و view داده های Cache شده را نمایش دهد.

فعال کردن Output Caching:

در ابتدا یک اپلیکیشن ساده در ویژوال استودیو ایجاد می کنیم.

 مزایا و معایب Caching کاربرد های Caching

حال یک Control در اپلیکیشن MVC خود ایجاد می کنیم.

 Caching در MVC

 

بنابراین Controller ما آماده است، حالا باید یک view ساده بسازیم و پس از آن index action مربوط به controller را به صورت زیر تغییر دهیم:

public ActionResult Index()
        {
            return Content(DateTime.Now.ToString("T"));
        }

بنابراین زمان جاری سیستم را از طریق controller برمی گردانیم.

حال به طور متناوب view خود را refresh نمایید مثلا دوبار در ۵ دقیقه. خروجی که دریافت می کنید چگونه است؟

Caching در MVC Caching چیست

 

همانطور که متوجه شدید، ما در این ۵ دقیقه دو بار controller را فراخوانی کردیم.

حالا می خواهیم از Output Cache استفاده کنیم. Controller خود را به شکل زیر تغییر می دهیم:

[OutputCache(Duration = 300, VaryByParam = "none")]
        public ActionResult Index()
        {
            return Content(DateTime.Now.ToString("T"));
        }

در اینجا، بازه Cache را روی ۵ دقیقه (۵*۶۰ ثانیه) تنظیم کردیم.

حال اگر دوباره همان کار قبلی را انجام دهیم، مشاهده می کنیم که controller تنها یک بار در ۵ دقیقه فراخوانی می شود.

با این حال، محدودیت هایی در استفاده از Caching وجود دارد.

به محض اینکه با کمبود حافظه مواجه می شویم، داده های Cache شده آزاد می شوند و دیگر داده ها Cache نمی شوند.

در این مثال، ما تنها از یک view ساده استفاده کردیم که زمان را از controller نمایش می داد.

حال اگر controller ای داشته باشیم که عملیات دیتابیسی انجام می دهد، برای هر درخواست کاربر باید به دیتابیس متصل شویم.

به عبارت دیگر، Chaching به کاهش مقدار کاری که باید بین وب سرور و دیتابیس انجام شود، کمک می کند.

محتوای Cache شده کجا ذخیره می شود:

حال می خواهیم تمام جاهایی که می توانیم داده های Cacheشده را ذخیره کنیم، ببینیم. معمولا محتوای cacheشده در سه مکان قرار می گیرند:

  • وب سرور
  • پروکسی سرور
  • مرورگر

شما می توانید، محل ذخیره سازی داده های Cacheشده را با استفاده از ویژگی (property) location مشخص کنید که روی سرور باشد، سمت کاربر و یا هر دوی سرور و کلاینت باشد. به طور پیش فرض، مقدار location برابر ‘any’ است.

 Caching چیست

مواردی هستند که نباید داده ها را روی سرور Cache کنیم.

فرض کنید controller ای داریم که نام کشوری را که کاربر از آن وارد اپلیکیشن شده است، برمی گرداند.

به عنوان مثال، من از “ایران” هستم، زمانی که وارد سایت می شوم باید نام کشور “ایران” نمایش داده شود.

حال اگر این داده در سرور cache شود، حال اگر کاربری از “ایرلند” وارد سایت شود، چه اتفاقی می افتد؟

[OutputCache(Duration = 10, VaryByParam = "none")]
        public ActionResult Index()
        {
            User u = new User();
            return Content(u.getUserCountry());
        }

به طور مختصر می توان گفت، داده های شخصی نباید در سرور Cache شوند.

اما راه حل این مشکل چیست؟ بسیار ساده، این داده ها را سمت کاربر Cache می کنیم.

به این منظور می توانیم controller خود را به شکل زیر تغییر دهیم:

[OutputCache(Duration = 10, VaryByParam = "none", 
	Location=OutputCacheLocation.Client, NoStore=true)]
        public ActionResult Index()
        {
            User u = new User();
            return Content(u.getUserCountry());
        }

برای استفاده از OutputCachelocation باید فضای نام System.Web.UI را به پروژه اضافه نماییم.

همانطور که مشاهده می نمایید، مقدار NoStore=true را قرار داده ایم که به proxy server اعلام می کند که هیچ کپی از این داده ها در سرور ذخیره نکند.

استفاده از ویژگی VaryByParam:

حال می خواهیم درباره استفاده از VaryByParam بحث کنیم.

مثال زیر را در نظر بگیرید، رویدادی با نام ‘GetEmployee’ تمام Employee های شرکت ما را برمی گرداند.

حال اگر روی لینک هر یک از کارمندان کلیک کنیم، view دیگری به نام ‘GetEmployeeDetails’ تمام جزئیات کارمند نمایش داده می شود (مانند اطلاعات اکانت، اطلاعات ورود و خروج، اطلاعات شخصی).

حال اگر داده های Cache شده GetEmployeeDetails را ذخیره کنیم، چه اتفاقی می افتد؟ برای تمام کارمندان، GetEmployeeDetails یکسان نمایش داده خواهد شد.

به همین دلیل، controller را به شکل زیر تغییر می دهیم:

[OutputCache(Duration = 10, VaryByParam = "none")]
       public ActionResult GetEmployee()
       {
           Employee e = new Employee();
           return Content(e.getEmployees());
       }

[OutputCache(Duration = 10, VaryByParam = "empID")]
      public ActionResult GetEmployeeDetail(int empID)
      {
          Employee e = new Employee();
          return Content(e.getEmployeeDetails(empID));
      }

با این پیاده سازی مطمئن هستیم که برای کاربران متفاوت، جزئیات کاربری متفاوتی تولید خواهد شد.

Cache Profiles:

Cache Profiles، روش دیگری برای دستیابی به caching است که یک تگ در فایل web.config می باشد و می توان آن را برای controller های مختلف اعمال کرد.

در این روش، می توان cache profile یکسانی برای کنترل های مختلف داشت.

همچنین، از آنجا که cache profile تنها یک تگ در web.config است، ایجاد تغییرات در آن بسیار ساده تر است.

Cache profile را به صورت زیر می توان پیاده سازی کرد:

caching
outputCacheSettings
    outputCacheProfiles
        add name="Admin" 
        duration="86420" varyByParam="none"/
    /outputCacheProfiles
/outputCacheSettings
/caching

Cache profile بالا می تواند برای هر کنترل adminای که برای یک روز (۶۰*۶۰*۲۴) cache می شود، استفاده شود.

می توانید از این profile به شکل زیر استفاده نمایید:

[OutputCache(CacheProfile="Admin")]

موفق باشید !

داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط