استفاده از استراتژی caching (حافظه پنهان) و بکارگیری آن به تنهایی میتواند یکی از مهم ترین عوامل موثر در بهینه سازی عملکرد در برنامه های نوشته شده تحت پلتفرم زبان asp.net باشد. استفاده از caching در بهینه سازی عملکرد ASP.Net شامل موارد زیر خواهد شد که هر یک می تواند به تنهایی در asp.net مورد استفاده قرار گیرد:
- Output caching
- Partial page caching
- Cache API
قابلیت caching (استفاده از حافظه پنهان) در برنامه های نوشته شده تحت پلتفرم asp.net باعث کاهش هزینه نرخ دسترسی به داده در برنامه کاربردی ما خواهد شد و این امر تسریع در ارائه خروجی را به همراه خواهد داشت. اطلاع از نحوه دسترسی صفحات شما به داده های مورد نیاز میتواند شما را در طراحی کارآمد و استفاده از استراتژی های caching هدایت نماید.
استفاده از caching هنگامی می تواند موثر واقع شود که برنامه تحت وب شما بر اساس داده های موجود در منابع خارجی مانند پایگاه های داده ، سرویس های تحت وب ،برنامه های تحت سرور و دیگر منابع خارجی ، بنا شده باشد. در برنامه های متمرکز بر روی پایگاه داده، استفاده از قابلیت caching میتوانند کاهش بار بر روی سرور پایگاه داده را به همراه داشته و بدنبال آن بهینه سازی کاربرد برنامه مذکور را بدنبال خواهد داشت.
هنگام استفاده از caching در طراحی خود بایستی چه مواردی را در نظر گرفت؟
- داده هایی که نرخ بالای دسترسی در ایجاد و دسترسی دارند را شناسایی نمایید.
این امر باعث کاهش بار سرور پایگاه داده شما خواهد شد.
- ارزیابی داده ها از نظر فراریت
جهت موثر بودنcaching ، باید این قابلیت را برای داده هایی با اصلاح کم و یا داده های ایستا مورد استفاده قرار داد. به عنوان مثال لیست کشور ها ،zipcode و … میتواند نمونه ای از انواع داده ای باشد که caching میتواند بر روی آن اعمال شود.
- ارزیابی میزان استفاده
استفاده از caching در در داده ها یی که بیشترین استفاده را دارند میتواند تاثییر بسزایی در در بهینه سازی عملکرد خروجی داشته باشد.
- جداسازی دادهای فرار از داده های غیر فرار
طراحی کنترل های کاربری جهت محفوظ کردن داده های ایستا کمک شایانی در جداسازی داده های فرار از داده های غیر فرار خواهد داشت و همچنین این امر در کاهش بار سرور موثر خواهد بود.
- انتخاب مکانیزم caching مناسب
Asp.net از یک مکانیزم داخلی و ساختار یافته جهت بروز رسانی cache خود بهره میبرد.
فرآیند caching در asp.net فرآیندی بسیار آسان و اثرگذار است که در نهایت به کاهش زمان latency و بهینه سازی عملکرد منجر خواهد شد. این فرآیند یک امکان زمانی را برای انقضاء داده های cache شده و همچنین وابستگی این داده ها را بر روی فایل های خارجی بررسی می نماید ، و همچنین مکانیزمی جهت صدا کردن تابعی با نام callback که وقتی موردی در cache منقضی میگردد، فراهم می سازد. همچنین در asp.net مواردی که کمترین مورد استفاده اخیر را داشته اند از cache توسط الگوریتم LRU پاکسازی خواهند شد.
همان طور که در ابتدای این مطلب نیز بیان شد asp.net caching نوع دارد که هر یک به شرح در زیر بیان شده اند.
Cache API
باید از cache از نوع رابط برنامه کاربردی به صورت برنامه ریزی شده در طول برنامه خود بر روی داده هایی که توسط چندین کاربر مورد استفاده قرار میگیرند ، استفاده کرد و همچنین این نوع caching برای مواقعی که میخواهیم داده را قبل از آنکه در اختیار کاربر قرار گیرد مورد ویرایش قرار دهیم ، مورد استفاده قرار میگیرد. از انواع این داده ها میتوان به رشته ها ، ارایه ها و data set ها اشاره کرد.
چه سناریو هایی برای Cache API مورد استفاده زیادی دارند؟
- Headline ها:
در بیشتر مواقع Headline ها یا سرتیتر ها به صورت بیدرنگ بروزرسانی نمی شوند و زمانی بین ۱۰ تا ۲۰ دقیقه بروزرسانی آنها به طول خواهد انجامید ، پس سر تیتر ها همواره کاندید خوبی بری استفاده از Cache API هستند.
- Product Catalogs :
کاتالوگ های محصول نیز قبل از آنکه در اختیار کاربر قرار گیرند ، مورد ویرایش و دستکاری و در طول برنامه در اختیار کاربران قرار میگیرند ، فلذا میتوانند کاندیدای خوبی برای استفاده از Cache API باشند.
در برخی سناریو ها نیز باید از استفاده از cache api اجتناب نمود که به شرح ذیل می باشند :
- Date یا تاریخ و زمان :
از آنجا که date یا تاریخ و زمان به صورت لحظه ای و بیدرنگ بروزرسانی می شود بهتر است از Session state استفاده گردد.
- استفاده از Output Caching :
برنامه شما در مرحله کاربردی است و نیازی نمی بینید که کد برنامه را تغییر دهید در این صورت میتوانید از Output caching استفاده نمایید.
در صورت کلی Cache API این دسترسی را به شما میدهد که آیتم های مورد caching خود را بر اساس شروط خارجی در cache قرار دهید .برای این امر کافیست از تابعی با نام cache.insert() مربوط به کلاس CacheDependency استفاده نمایید. کلاس مذکور از ۸ تابع سازنده متفاوت برای پیاده سازی caching استفاده می نماید. همچنین میتوانید از متود HttpCachePolicy.AddValidationCallback جهت کد خود استفاده نمایید.
OutPut Caching
این مکانیزم caching جهت Cache کردن مقداری از صفحات کلی شما برای زمانی خاص کاربرد دارد . output caching این اجازه را به شما میدهد که کل یک صفحه یا مقداری از صفحه را بر اساس پرس و جوی رشته ای ، سرتیتر ها و رشته های UserAgent در جایی مشخص cache نماید.
Output caching همچنین در رندر سازی خروجی بهینه سازی های لازم را انجام می دهد که این عمل باعث کاهش load شدن صفحات خواهد شد. باید در نظر داشت زمانی میتوان از output caching استفاده نمود که اطلاعات پویا ایجاد شده بر روی صفحات ما دارای نرخ بالای تغییر در هر بار درخواست کاربر نباشد.
برخی از سناریو های معمول که برای Output Chaching مورد استفاده زیادی دارند به شرح ذیل می باشند:
- صفحاتی که نرخ بالای بازدید دارند
همانطور که گفته شد outpu caching باعث افزایش و بهینه سازی کارایی برنامه تحت پلتفرم .net ما پس از مرحله تولید نرم افزار خواهد شد ، حال لازم به ذکر است که این امر تنها با فعال کردن output caching بر روی صفحات پر بازدید محقق خواهد شد .
- Reports یا گزارش ها
فایلهای گزارشی که تنها دارای نرخ تغییر کوچکی هستند نیز کاندید مناسبی برای استفاده از output caching می باشند .
در برخی سناریو ها نیز باید از استفاده از output caching اجتناب نمود که به شرح ذیل می باشند :
- در مواقعی که دسترسی برنامه نویسی شده به داده هایی مشخص بر روی صفحه ای خاص دارید که باید از Api Caching استفاده نمایید.
- تنوع صفحات خیلی بیشتر از آن است که بخواهید output cahing را بر روی آنها اعمال نمایید.
- صفحه شما شامل ترکیبی از اطلاعات مختلفی چون اطلاعات ایستا ، پویا و … است که در این صورت بهتر است از fragment caching استفاده نمایید.
Fragment Caching یا Partial Page
این نوع از مکانیزم caching در واقع زیر شاخه ای از output caching می باشد با این تفاوت که این نوع از caching شامل کنترل های کاربری است (در فایل ascx) که اجازه cache کردن محدوده ای یا منطقی از صفحات شما را توسط کنترل های کاربری ذکر شده در اختیار قرار می دهد.
چه سناریو هایی برای fragment Chaching مورد استفاده زیادی دارند؟
- منو های ثابت
که معمولا مختص کاربری خاص نیستند کاندید مناسبی جهت استفاده در این نوع از caching هستند.
- Header و Footer سایت
در برخی سناریو ها نیز باید از استفاده از fragment caching اجتناب نمود که به شرح ذیل می باشند :
- تنوع صفحات خیلی بیشتر از آن است که بخواهید fragment cahing را بر روی آنها اعمال نمایید.
- کنترل های کاربری بخواهد بر روی صفحاتی اعمال شود که باید با هر درخواست کاربر بروزرسانی شوند.
راهنمای کلی استفاده از مکانیزم Caching
همواره موارد زیر را در طراحی استراتژی Caching مد نظر داشته باشید :
- همواره داده های ایستا و پویا را در صفحات خود از هم جدا سازی نمایید
برای مثال صفحه ای مانند زیر را در نظر بگیرید ( فایل main.aspx) که شامل اطلاعات پویا و ایستا است
[main.aspx]
<html>
<body>
<table>
<tr><td colspan=3>Application Header Welcome John Smith</td></tr>
<tr><td>Menu</td><td>Dynamic Content</td><td>Advertisments</td></tr>
<tr><td colspan=3>Application Footer</td></tr>
</table>
</html>
می توان اطلاعات این صفحه را مانند زیر تقسیم بندی کرده و caching را مانند زیر بر روی آن اعمال نمود:
[main.aspx]
<%@ Register TagPrefix=”app” TagName=”header” src=”header.ascx” %>
<%@ Register TagPrefix=”app” TagName=”menu” src=”menu.ascx” %>
<%@ Register TagPrefix=”app” TagName=”advertisements”
src=”advertisements.ascx” %>
<%@ Register TagPrefix=”app” TagName=”footer” src=”footer.ascx” %>
<html>
<body>
<table>
<tr><td colspan=3><app:header runat=server /></td></tr>
<tr><td><app:menu runat=server /></td><td>Dynamic
Content</td><td><app:advertisements runat=server /></td></tr>
<tr><td colspan=3><app:footer runat=server /></td></tr>
</table>
</html>
[header.ascx]
<%@Control %>
Application Header Welcome <% GetName() %>
[menu.ascx]
<%@Control %>
<%@ OutputCache Duration=”۳۰″ VaryByParam=”none” %>
Menu
[advertisements.ascx]
<%@Control %>
<%@ OutputCache Duration=”۳۰″ VaryByParam=”none” %>
Advertisements
[footer.ascx]
<%@Control %>
<%@ OutputCache Duration=”۶۰″ VaryByParam=”none” %>
Footer
- همواره محدودیت حافظه را اعمال نمایید
تعریف و بهینه سازی مصرف حافظه امری اجتناب ناپذیر در بهینه سازی کارکرد caching خواهد بود، هنگامی که از مدل پردازشی Asp.net بهره میبرید میتوایند این محدودیت حافظه را در فایل machine.config خود مانند زیر تعریف نمایید :
<processModel memoryLimit=”۵۰″>
- همواره اطلاعات درست و دقیق را cache نمایید
همواره باید سعی نمایید اطلاعات دقیق را در cache خود دریافت نمایید زیرا حتی لحظه ای کوتاه در دریافت اطلاعات نادرست در cache می تواند منجر به کارکرد نادرست برنامه شما گردد.
- بروزرسانی فرآیند caching خود را به درستی و در زمان درست انجام دهید
اگر داده های شما هر ۱۰ دقیقه بروزرسانی میشوند دلیلی ندارد فرآیند caching شما نیز هر ۱۰ دقیقه صورت گیرد ، و باید زمان مذکور را طبق نیاز های خود تعریف نمایید.
- داده های خود را در فرم صحیح cache نمایید
یکی از مواردی که حتما باید رعایت شود این است که اگر نیاز است تا داده های خود را مورد ویرایش قرار دهید قبل از آنکه فرآیند caching را بر روی آنها اعمال نمایید ، حتما از فرم صحیح caching برای دریافت داده های مورد نظر استفاده نمایید.
- از مکانیزم output caching حتما در cache کردن اطلاعات صفحات مرتبط استفاده نمایید
- مکان مناسبی برای داده های cache شده خود استفاده نمایید
@OutputCache به شما این اجازه را میدهد که محل ذخیره سازی داده های cache شده خود را مشخص نمایید (با تعریف صفتی با نام Location) که میتواند پارامتر های زیر را داشته باشد
Any
Client
DownStream
None
ServerAndClient
Server
سوالات متداول