PDA

View Full Version : سوال: مزایای Caching؟؟؟ و چرا اینقدر تاکید به استفاده می شه؟؟؟



baran_mehr
شنبه 26 بهمن 1387, 16:13 عصر
سلام دوستان
چرا اینقدر تاکید میشه که از Caching استفاده کنیم وکلا چطور باید ازش استفاده کرد .
چه خصوصیت و مزایایی داره؟؟
ممنون میشم یکی از دوستاد مختصری در رابطه با این موضوع توضیح بدن.

milade
شنبه 26 بهمن 1387, 16:29 عصر
سلام
کش کردن یعنی اینکه ما یه صفحه رو که خیلی ازش استفاده میکنیم و بیشتر ثابت هست رو برای جلوگیری از فشار روی سرور ازش استفاده میکنیم .
چون میدونید که هر بار بخواد سرور صفحه رو کامپایل و ... کنه کمی از کارایی رو از دست میده که در تعداد بالای کاربر دردسر ساز هست مخصوصا با بانک هم باشه که دیگه ... .
در مورد استفاده هم سرچ کن . اگه پیدا نکردی خبر بده تا دوستان راهنمایی کنن . ( هر چند فکر کنم قبلا اشاراتی شده بود هر چند پراکنده )

موفق باشید

mehdi.mousavi
شنبه 26 بهمن 1387, 16:40 عصر
سلام دوستان چرا اینقدر تاکید میشه که از Caching استفاده کنیم وکلا چطور باید ازش استفاده کرد . چه خصوصیت و مزایایی داره؟؟ ممنون میشم یکی از دوستاد مختصری در رابطه با این موضوع توضیح بدن.


سلام.
بدست آوردن برخی از اطلاعات هزینه بر هستش، در نتیجه، بهتره که بعد از دفعه اول که Load شد اطلاعات، اونها رو در حافظه موقتی (تحت عنوان Cache) ذخیره کرد تا برای درخواستهای مشابه بعدی، اون اطلاعات از حافظه موقت خونده بشه و به Client برگرده. فرض کنید سایتی ساختید که اطلاعات مشخصی رو بازای درخواستهای مشخصی از بانک میخونه و بر میگیردونه. وقتی شما تو این صفحه از Caching استفاده کنید و اطلاعات درخواستی رو فقط 15 ثانیه در Cache ذخیره کنید، ظرف یک دقیقه حداکثر 4 بار برنامه شما سراغ بانک اطلاعاتی میره. در صورتیکه اگر اطلاعات مزبور رو Cache نکنید، بازای هر درخواست برنامه شما سراغ بانک اطلاعاتی میره و ممکنه تعدادش به بیش از 1000 بار هم برسه...

هدف اصلی استفاده از Cache در واقع بالا بردن کارایی سرویسی هستش که داره ارائه میشه. اینطوری از Resource های سیستمی هم بهتر بهره برده شده. البته، استفاده بیش از حد و نامناسب از Cache هم میتونه سرور رو بزانو در بیاره.

اگر میخواهید با نحوه کار Caching در ASP.NET آشنا بشید (بصورت عملی)، بهتون توصیه میکنم فصل 11 از کتاب Pro ASP.NET 3.5 in C# 2008 (http://www.amazon.com/Pro-ASP-NET-2008-Second-Windows-Net/dp/1590598938) نوشته Matthew MacDonald و Mario Szpuszta رو حتما مطالعه کنید.

Behrouz_Rad
شنبه 26 بهمن 1387, 16:56 عصر
کش کردن یعنی اینکه ما یه صفحه رو که خیلی ازش استفاده میکنیم و بیشتر ثابت هست رو برای جلوگیری از فشار روی سرور ازش استفاده میکنیم .

لزوماً صفحه Cache نمیشه.
Caching انواع مختلفی داره که Page Caching فقط یک نمونش هست.

موفق باشید.

baran_mehr
شنبه 26 بهمن 1387, 17:15 عصر
ممنون از راهنمایی شما.

چون میدونید که هر بار بخواد سرور صفحه رو کامپایل و ... کنه کمی از کارایی رو از دست میده که در تعداد بالای کاربر دردسر ساز هست مخصوصا با بانک هم باشه که دیگه ... .
اگر اطلاعات خونده شده از بانک متغییر باشه چی؟؟ فرض کنید قسمت جستجوی کاربر که ممکنه هر دفعه یه اسمی جستجو بشه؟


بدست آوردن برخی از اطلاعات هزینه بر هستش، در نتیجه، بهتره که بعد از دفعه اول که Load شد اطلاعات، اونها رو در حافظه موقتی (تحت عنوان Cache) ذخیره کرد تا برای درخواستهای مشابه بعدی، اون اطلاعات از حافظه موقت خونده بشه و به Client برگرده.
یعنی بر فرض من یک سری داده ها رو از دیتابیس خوندم.و بار دوم بخوام بخونمشون دیگه سراغ سرور نمیره؟؟


فرض کنید سایتی ساختید که اطلاعات مشخصی رو بازای درخواستهای مشخصی از بانک میخونه و بر میگیردونه. وقتی شما تو این صفحه از Caching استفاده کنید و اطلاعات درخواستی رو فقط 15 ثانیه در Cache ذخیره کنید، ظرف یک دقیقه حداکثر 4 بار برنامه شما سراغ بانک اطلاعاتی میره. در صورتیکه اگر اطلاعات مزبور رو Cache نکنید، بازای هر درخواست برنامه شما سراغ بانک اطلاعاتی میره و ممکنه تعدادش به بیش از 1000 بار هم برسه...
میشه این مثالتونو یکم بازش کنید.مثلا در رابطه با 15 ثانیه که چه اتفاقایی می افته؟؟

میشه نوع های دیگه Caching رو هم بگید .اخه میخوام دربارشون تحقیق کنم.
از توجه همگی ممنون.

milade
شنبه 26 بهمن 1387, 17:52 عصر
اگر اطلاعات خونده شده از بانک متغییر باشه چی؟؟ فرض کنید قسمت جستجوی کاربر که ممکنه هر دفعه یه اسمی جستجو بشه؟
سلام
وقتی رفتی داخل مبحث کش میفهمی که میشه صفحه رو بر اساس یه سری پارامتر کش کرد
مثلا همین سایت . وقتی یه سرچ میکنی اون رو جستجو میکنه و ازش یه کش میگیره و دفعات بعد ( تا مدتی که مشخص کردن ) هر کس اون ادرس / واژه ( دقیق نمیدونم کدومه ) رو بزنه دقیقا نتیجه رو میبینه که فرد اول دیده بود .
مثلا شما میتونید توی قسمت سرچ مشخص کنید اگه اون واژه ای که به صفحه X پاس میشه کش شده بود ... وگرنه سرچ کن
بحث سنگینی نیست .

یعنی بر فرض من یک سری داده ها رو از دیتابیس خوندم.و بار دوم بخوام بخونمشون دیگه سراغ سرور نمیره؟؟
بله . دقیقا !
تا زمانی که شما تعیین میکنید نه . ولی همین که منقضی شد دوباره میره و کش میکنه و ...

میشه این مثالتونو یکم بازش کنید.مثلا در رابطه با 15 ثانیه که چه اتفاقایی می افته؟؟
فرض کنید من میام برنامه نویسی Web با استفاده از ASP.NET (http://barnamenevis.org/forum/forumdisplay.php?f=25) رو میزنم .
مدیر سایت میاد تعیین میکنه که صفحه پس از خونده شدن از بانک 100 ثانیه کش بشه
خوب تو این 100 ثانیه هر کی این ادرس رو بزنه با صفحه کش شده رو به رو میشه و بطبع اگه توی این 100 ثانیه تاپیک جدیدی ساخته بشه قابل مشاهده نیست .
اما بعد از 100 ثانیه دوباره خونده میشه ، کش میشه و تکرار !
برا همین هست میگم اونایی که زود به زود اپدیت میشه رو کش نکن !

میشه نوع های دیگه Caching رو هم بگید .اخه میخوام دربارشون تحقیق کنم.
شما هر چیزی رو میتونید کش کنید .
کش دیتاست ، یه متغیر ف یه صفحه ، و ...
موفق باشید

mehdi.mousavi
شنبه 26 بهمن 1387, 17:56 عصر
یعنی بر فرض من یک سری داده ها رو از دیتابیس خوندم. و بار دوم بخوام بخونمشون دیگه سراغ سرور نمیره؟؟نه، بد متوجه شدید! اگر از Page Caching استفاده کرده باشید، کل Page پس از Cache شدن به Client ارسال میشه. دفعه بعد که همون Page درخواست میشه، اگر Page مزبور در Cache باشه، دیگه برای Retrieve کردن اطلاعات سراغ بانک نمیره و نسخه Cache شده رو بر میگردونه. بعبارت دیگه، Page Cycle شما اصلا اجرا نخواهد شد!

اما اگر از Data Caching استفاده کرده باشید، دیگه کنترل دست شماست. شما هر بار از Cache استفاده می کنید و اگر Cache تهی بود، متوجه می شید که بار اول هستش و پس از رجوع به بانک و پر کردن Cache، کار رو بر اساس اطلاعات Cache شده ادامه می دید. اگر هم تهی نبود، که خوب براحتی از Cache استفاده می کنید (بعبارت دیگه خودتون سراغ بانک نمیرید، چون Data مورد نظرتون رو میدونید در Cache وجود داره).


میشه این مثالتونو یکم بازش کنید.مثلا در رابطه با 15 ثانیه که چه اتفاقایی می افته؟؟ میشه نوع های دیگه Caching رو هم بگید. اخه میخوام دربارشون تحقیق کنم.

متاسفانه فرصت اینکارو ندارم. همونطوری که قبلا هم گفتم، به کتاب Matthew MacDonald رجوع کنید. اما فقط بعنوان یک Hint، میتونم اینا رو بهتون بگم. ما کلا دو نو Caching داریم:



Output Caching
Data Caching

دو نوع ویژه هم از Caching داریم که بر اساس دو مدل فوق ساخته شده:


Fragment Caching
Data Source Caching


پاورقی 1: هیچکسی تو انجمن ها نمیتونه کارکردن با یک تکنولوژی رو یاد بگیره! اینجا فقط سرنخ دستتون میاد، بقیه کار بعهده خودتون هستش.

پاورقی 2: اسم اینکاری که شما می کنید تحقیق نیست!

baran_mehr
شنبه 26 بهمن 1387, 20:10 عصر
پس عمل کش مربوط به دستگاه کاربرها نمیشه و اگر هر کدومشون این کار رو انجام بده برای سایر کاربران هم اعمال میشه.

پاورقی 1: هیچکسی تو انجمن ها نمیتونه کارکردن با یک تکنولوژی رو یاد بگیره! اینجا فقط سرنخ دستتون میاد، بقیه کار بعهده خودتون هستش.
مطمئنن همینطور هست ،منم بیکار ننشستم دارم از منابع دیگه هم کسب اطلاعات میکنم.تا بعد امتحان کنم

پاورقی 2: اسم اینکاری که شما می کنید تحقیق نیست!
اسم این کار من کسب اطلاعات هست.من منظور از تحقیق برای این سایت نبود دوست من ، منظورم این بو که با هاش اشنا بشم و بعد در بارش تحقیق و جستجو کنم.

mehdi.mousavi
یک شنبه 27 بهمن 1387, 09:27 صبح
پس عمل کش مربوط به دستگاه کاربرها نمیشه و اگر هر کدومشون این کار رو انجام بده برای سایر کاربران هم اعمال میشه.

بله، Cache کردن اطلاعات سمت سرور رخ میده و سمت Client ها چیزی نگهداری نمیشه.

milade
یک شنبه 27 بهمن 1387, 12:28 عصر
بله، Cache کردن اطلاعات سمت سرور رخ میده و سمت Client ها چیزی نگهداری نمیشه.
سلام
مدتی هست از کش استفاده نکردم
اما یادمه یه مقدار میشد ست کرد در خصیصه Duration هکه هم سرور هم کلاینت نگهداری میشد .
این طوری :

Duration"Client"
پیروز باشید و پایدار

mehdi.mousavi
یک شنبه 27 بهمن 1387, 13:04 عصر
سلام مدتی هست از کش استفاده نکردم اما یادمه یه مقدار میشد ست کرد در خصیصه Duration هکه هم سرور هم کلاینت نگهداری میشد . این طوری :

Duration"Client"پیروز باشید و پایدار

سلام.
احتمالا منظورتون اینه:


<%@ OutputCache Duration="60" Location="Client" VaryByParam="None" %>

و درسته، با اینکار اطلاعات سمت Client ذخیره خواهد شد. اما وقتی یه Client دیگه، درخواست مشابه رو ارسال کنه، سرور باید Page Cycle رو طی کنه و دوباره HTML مربوطه رو ایجاد کنه، چون سمت سرور صفحه مزبور Cache نشده! ضمن اینکه، تا اونجاییکه یادمه، این قابلیت برای User Control ها وجود نداره...

baran_mehr
یک شنبه 27 بهمن 1387, 13:14 عصر
پس با اینکار عملا وقتی یک کاربر صفحه رو باز میکنه مثلا اگر زمانه Cache رو 15 ثانیه گذاشته باشیم ،تا 15 ثانیه بعد دیگر کاربران با صفحه باز شده توسط کاربر مواجه میشن مگر اینکه درخواستشون متفاوت باشه.
حالا بعد از کاربر اول اگر سایر کاربرها هم همون صفحه رو بخوان سرور چه عکس العملی رو نشون میده؟

milade
یک شنبه 27 بهمن 1387, 13:29 عصر
سلام.
احتمالا منظورتون اینه:
ببخشید
مدتی هست از کش استفاده نکردم
بله ! درسته .

و درسته، با اینکار اطلاعات سمت Client ذخیره خواهد شد. اما وقتی یه Client دیگه، درخواست مشابه رو ارسال کنه، سرور باید Page Cycle رو طی کنه و دوباره HTML مربوطه رو ایجاد کنه، چون سمت سرور صفحه مزبور Cache نشده! ضمن اینکه، تا اونجاییکه یادمه، این قابلیت برای User Control ها وجود نداره...
خوب دیگه هر کدومش برا یه موقع خوبه !
اگه میخواید کاربر راحت باشه Client . اگه سرور ... و ...


حالا بعد از کاربر اول اگر سایر کاربرها هم همون صفحه رو بخوان سرور چه عکس العملی رو نشون میده؟
منظورتون گنگ هست
اگه منظورتون پس از پایان 15 ثانیه است که دوباره کش میشه .
اگه هم نه واضح تر بیان کنید
موفق باشید

mh19842008
یک شنبه 27 بهمن 1387, 18:51 عصر
با سلام
با تشکر از دوستان
فکر کنم این میتونه به اطلاعات شما در زمینه کشینگ کمک کنه
SQL Cache Dependencyهم یکی از روش های خوبه
(كش كردن داده به تغييرات صورت گرفته درپايگاه داده وابسته باشد)
در این زمینه هم تحقیق کن

baran_mehr
یک شنبه 27 بهمن 1387, 22:41 عصر
از توجه mh19842008 جان خیلی ممنون، حتما دربارش تحقیق خواهم کرد.

منظورتون گنگ هست
فرض کنید صفحه کش شده و هنوز 15 ثانیه تمام نشده. حالا 100 تا کاربر میان و صفحه رو درخواست میکنن و درخواستشون هم مثل همون درخواست کاربر اول هست پس کش جدید انجام نمیشه و باید همون صفحه کش شده نشون داده بشه، حالا سرور چه عکس العملی رو نشون میده؟؟یعنی جواب این 100 نفر رو چطور میده؟؟ چطوری بارش کمتر میشه اخه به هر حال باید 100 تا صفحه تحویل بده دیگه!!

milade
دوشنبه 28 بهمن 1387, 07:12 صبح
حالا سرور چه عکس العملی رو نشون میده؟؟یعنی جواب این 100 نفر رو چطور میده؟؟
سرور کش رو از حافظه میخونه و نمایش میده

چطوری بارش کمتر میشه اخه به هر حال باید 100 تا صفحه تحویل بده دیگه!!
شما فرض کن یه سایت داری که روزی ده هزار نفر ازش بازدید میکنن .
خوب حالا فرض کن توی صفحه اول یه سری دیتا ( هر چی میخواد باشه ) رو نگه میداری که بالفرض از SQL خونده میشه ، یه سری عملیات سنگین انجام میشه و در اخر صفحه رندر میشه برا کاربر
حالا با این حساب این بار برا سرورهای شیر شده خیلی سنگین هست و کاربر 1 سال باید منتظر پردازش باشه تا سرور جواب بده !
اما این طوری نه ! کاربر اول 1 سال میمونه D: و بقیه وقتی می ان از همون صفحه کش شده استفاده میکنن .
البته این کش معایبی هم داره که امروزه کمتر مورد استفادس از جمله وقتی که شما یه سری اطلاعات به روز داری ، یه سری ایتمها میخواد تغییر کنه ( تبلیغات ) ، یه سری دیتا باید وارد بشه ( درخواست ایپی ) و ...
اما به هر حال برا سایتهایی که این رو واجب دارن بسیار مهم هستش !
پیروز باشید

baran_mehr
دوشنبه 28 بهمن 1387, 10:10 صبح
با تشکر از دوستان گلم.اگر مطلبی به نظرتون امد که باید گوش زد کنید خوشحال میشم بگید.
من بازم ممکنه برام سوال پیش بیدا،از دوستان خواهش میکنم بعدا هم کمکم کنند.
مرسی

reza_moon_mordad
سه شنبه 22 اردیبهشت 1388, 09:43 صبح
۱- مقدمه ای بر Caching در ASP.NET

• Caching عبارت است از قرار دادن حاصل اجرای يک صفحه در يک حافظه سريع جهت دسترسی سريع و استفاده مجدد از آن در ارجاعات بعدی.
• Caching مهمترين فاکتور در ايجاد يک برنامه تحت وب با توانائی و کارائی بالا می باشد.
• محل های Caching عبارتند از Web server, proxy server و client browsers.
• انواع Caching عبارتند:

Output caching
Fragment caching
Data caching


۲- Output Caching

Output Caching چيست؟
• صفحاتی که از Output Caching استفاده می کنند برای بار اول اجرا می شوند و سپس حاصل آن cache می گردد. جهت پاسخگوئی به درخواستهای بعدی برای همين صفحه، از نسخه cache شده استفاده می گردد.
• فوايد Output Caching در کاهش محسوس زمان پاسخ دهی سرور و کاهش بار اضافی بر روی CPU در سرور می باشد.
• استفاده صحيح از Output Caching سرعت و کارائی سايت را بطور محسوسی افزايش می دهد.
• از Output Caching می توان در فايل های با پسوند asmx. ،.aspx و ascx. استفاده نمود.
• با استفاده از دايرکتيو OutputCache @ در بالای فايلهای فوق بصورت زير می توان Output Caching را فعال کرد:


<%@ OutputCache Duration="600" Location="Any" VaryByParm="none" %>



• يا از درون برنامه بصورت زير هم می توان اين کار را انجام داد:


[C#]
Response.Cache.SetExpires(DateTime.Now.AddSeconds( 600));
Response.Cache.SetCacheability(HttpCacheability.Pu blic);




صفات OutputCaching
• Duration: مدت زمان معتبر بودن cache را مشخص می کند. مقداردهی اين صفت الزامی است و مقدار آن بر اساس ثانيه است.

• Location: محل قرار گرفتن cache را مشخص می کند.
در حالت Server صفحه cache شده در حافظه سرور نگهداری می شود.
در حالت Downstream صفحه cache شده بر روی proxy server نگهداری می گردد.
در حالت Client صفحه cache شده بر روی مرورگر کاربر قرار می گيرد.
در حالت Any صفحه cache شده بر روی هر يک از موارد فوق می تواند قرار گيرد.
در حالت None صفحه مربوطه عملا در هيچ کجا cache نخواهد شد.

• VaryByParam: نسخه های cache متفاوتی از صفحه مورد نظر براساس پارامترهای موجود در QueryString و Form يا ترکيبی از آنها ايجاد می گردد.


<%@ OutputCache Duration="10" VaryByParam="location;count" %>




• VaryByHeader: نسخه های cache متفاوتی براساس مقادير مختلف پارامتر تعيين شده در HTTP header ايجاد می گردد.



<%@ OutputCache Duration="60" VaryByHeader="Accept-Language" %>



• VaryByCustom: اگر مقدار اين صفت کلمه خاص "Browser" باشد، cache مورد نظر براساس نوع و نسخه اصلی مرورگرايجاد خواهد شد. اگر مقدار آن يک رشته دلخواه باشد، آنگاه لازم است که شما متد HttpApplication.GetVaryByCustomString را در فايل Global.asax را بگونه دلخواه بازنويسی کنيد.



۳- Fragment Caching

• علاوه بر اينکه شما می توانيد تمام يک صفحه را cache کنيد، شما حتی می توانيد بخشی از يک صفحه را cache کنيد. به اين عمل Fragment Caching گويند.
• بدين منظور لازم است که شما بخش های مورد نظر را بصورت User Control يا کنترل کاربری ايجاد کرده باشيد.
• هر کنترل کاربری دايرکتيو OutputCache@ مخصوص به خود را دارا می باشد.
• صفات مورد استفاده در اينجا عبارتند از VaryByParam و VaryByControl.
• امکان تعيين محل cache با استفاده از صفت Location مقدور نمی باشد و محل cache همواره بر روی سرور در نظر گرفته می شود.

• VaryByControl: ششمين صفت موجود در دايرکتيو Outputcache@ می باشد. تنها می توان در کنترلهای کاربری از آن استفاده کرد. استفاده از آن سبب می شود تا cacheهای متعددی براساس خواص (properties) کنترل کاربری ايجاد گردد.


[*.ascx]
<%@ Language="C#" %>
<%@ OutputCache Duration="10" VaryByControl="State;Country" VaryByParam="*"%>
<script runat=server>
public String State {
get { return state.Value; }
set { state.Value = State; } }

public String Country {
get { return country.Value; }
set { country.Value = Country; } }
</script>


• می توان بصورت تودرتو از کنترلهای کاربری با قابليت cache استفاده نمود. در اين صورت يک cache سلسله مراتبی بسيار قدرتمند خواهيم داشت. اين مساله اگر چه نياز به هيچ نوع برنامه نويسی خاصی ندارد اما می تواند سبب مصرف حافظه زيادی گردد.
• سعی نکنيد بصورت برنامه ای به يک کنترل کاربری موجود در cache دسترسی داشته باشيد. در غير اين صورت شما با يک exception برخورد خواهيد کرد. زيرا اين نوع کنترلها در درخت کنترلهای موجود قرار نمی گيرند.



۴- Data Caching

• با استفاده از data cache می توان داده های برنامه مانند رشته ها، DataSetها و ساير اقلام داده و آبجکت را بصورت زير cache کرد:


Cache ("counter") = mycount.text



• اگرچه اين مساله مانند استفاده از متغيرهای از نوع Application است، اما بسيار قوی تر و کارآمدتر می باشد.
• هر قسمت از برنامه که از داده های موجود در cache استفاده می کند، بايد قادر باشد تا در صورت غيرمعتبر بودن cache، بتواند آن را دوباره بسازد.



Public Function GetProductData() As DataSet
If (IsNothing(Cache("ProductData")) Then
Cache("ProductData") = LoadDataSet()
End If
Return Cache("ProductData")
End Function


• توصيه می شود جهت استفاده از cache همواره از مدل فوق استفاده نمائيد.
• جهت داشتن کنترل بيشتر بر cache يا استفاده از امکانات پيشرفته آن از متدهای Cache.Insert و Cache.Add استفاده نمائيد.
• با استفاده از متد Cache.Remove می توانيد داده مورد نظر را از cache حذف نمائيد.

منبع:IranASP.NET

reza_moon_mordad
سه شنبه 22 اردیبهشت 1388, 09:52 صبح
آشنائی با مفهوم Caching و نحوه استفاده و بکارگيری آن در صفحات ASP.NET

--------------------------------------------------------------------------------
۱- Caching چيست؟ چگونگی و ضعف آن درASP کلاسيک
عمل Caching در صفحات ASP به منظور كاهش بار و ميزبان و افزايش سرعت دريافت صفحات وب می باشد. بدين ترتيب كه با توجه به دستورالعمل گفته شده، يك نسخه از صفحه درخواستی در ميزبان ايجاد می شود و با توجه به شرايط Caching پس از آن اگر درخواستی برای آن صفحه صورت گرفت، به جای اجرا كردن فايل ASP مربوطه يك كپی از نسخه ايجاد شده در ميزبان به مشتری (Client) فرستاده می شود (همانند عمليات ارسال فايل های HTML به طرف مشتری).

اما اين عمل در ASP کلاسيک اگرچه در مواردی مفيد بود اما هيچگاه به عنوان يك ابزار كاملا سودمند به آن پرداخته نشد، زيرا فقط با تعيين يك خصوصيت كه همان زمان مورد نظر برای Caching بود، دستورالعمل پايان می يافت و هيچگاه نمی توانستيم شرايطی را اعمال كنيم كه فقط در آن صورت Caching رخ دهد. همچنين قادر نبوديم كه عمليات Caching را برای عناصر خاصی از صفحه تعريف كنيم. بدين ترتيب كارايی اين روش در ASP کلاسيک چندان بالا نبود. اما در ASP.NET ما شاهد يك تحول شگرف در عمليات Caching هستيم بطوريكه ضعف هايی را كه در ASP کلاسيک شاهد آن بوديم در ASP.NET آنها را برطرف شده می يابيم.

۲- ساختار Caching در ASP.NET چگونه است؟
روش مورد استفاده در ASP.NET با ASP کلاسيک تفاوت دارد. شكل كلی آن به صورت زير است:

<%@ OutputCache Duration = "..." VaryByParam = "..." %>


همانطور كه می دانيد در ASP.NET ما قادر خواهيم بود چندين هدايت كننده ای (<%@ ... %>) را در يك صفحه قرار دهيم. خصوصيات اين هدايت كننده همانطور كه در بالا مشخص شده است Duration و VaryByParam می باشد كه در ادامه مقاله به شرح آن خواهيم پرداخت.

الف- خصوصيت Duration:
اين خصيصه مدت زمان مورد نياز به Caching را به ثانيه تعيين می كند. به مثال زير توجه كنيد. فرض كنيد هدايت كننده Caching مورد نظر به صورت زير باشد:


<%@ OutputCache Duration = "15" VaryByParam = "none" %>

و صفحه ASP.NET ما شامل هدايت كننده فوق و يك Label و Button باشد. به صورتيكه با فشردن دكمه مورد نظر زمان جاری ميزبان در Label مذبور به نمايش درآيد. پس از اينكه صفحه برای اولين بار نمايش داده شد ( فرض كنيد زمان 21:30:45 را نمايش دهد) پس از آن اقدام به فشردن دكمه موردنظر نماييد. خواهيد ديد كه زمان نمايش داده شده تغيير نخواهد كرد. اين عمل را تا ۱۵ ثانيه ادامه دهيد. پس از آن خواهيد ديد كه زمان نمايش داده شده 21:31:00 خواهد بود. البته مهم اين است كه پس از Download شدن صفحه ۱۵ ثانيه بگذرد و پس از آن هر درخواستی كه انجام گيرد به صورت معمول اجرا خواهد شد و بلافاصله پس از اجرا يك دوره جديد Caching به مدت ۱۵ ثانيه ايجاد خواهد شد. مثلا فرض كنيد پس از ۳۰ ثانيه كه از نمايش 21:30:45 گذشت شما دكمه را فشار دهيد. در آن صورت زمان 21:31:15 به نمايش در خواهد آمد و پس از آن يك Caching جديد به مدت ۱۵ ثانيه برای صفحه ايجاد خواهد شد.

ب- خصوصيت VaryByParam:
اين خصيصه كه از ويژگی های جالب Caching در ASP.NET است، معين كننده اين است كه استفاده از Caching در چه صورت انجام نشود يا به عبارت ديگر اگر پارامترهايی كه به صفحه ASP.NET مورد نظر ارسال می شوند همنام با موارد معين شده در خصوصيت VaryByParam بود، ديگر از Caching قبلی استفاده نكند و صفحه جديد را با توجه به مقادير جديد دوباره اجرا و كد HTML ايجاد شده را به مشتری مورد نظر بفرستد. بعنوان مثال فرض كنيد هدايت كننده Caching به صورت زير باشد:


<%@ OutputCache Duration = "120" VaryByParam = "name" %>

همچنين در نظر بگيريد كه فرم وب مورد نظر دارای دو Label باشد. يكی نشاندهنده زمان جاری ميزبان و ديگری نشاندهنده مقدار پارامتر name كه به اين صفحه ارسال می شود. فرض كنيد مقدار Label زمان در هنگامی كه صفحه برای اولين بار درخواست می شود دارای مقدار 21:22:10 باشد. حال فرض كنيد مدت زمان Caching به پايان نرسيده باشد و ما مجددا تقاضای صفحه مذبور را داشته باشيم. اگر همانند قسمت اول بود، يعنی مقدار خصيصه VaryByParam با none تنظيم شده بود، علی الاصول بايد از صفحه Cache شده استفاده كند. ولی در اينجا شرط ديگری داريم كه در واقع می گويد اگر صفحه با مقدار جديدی از پارامتر name درخواست شد، بايد صفحه را اجرا و از Caching صرف نظر كند.

متغيرهايی كه در VaryByParam مشخص نشده باشند در اجرای دوباره صفحه ASP.NET تاثيری ندارد.

توجه كنيد دو خصوصيت ذكر شده با هم OR می شوند. يعنی هر كدام كه شرايط را برقرار كنند باعث انجام عمل مربوطه خواهند شد و برقراری يا عدم برقراری خصوصيت ديگر در اجرای عمل تاثيری ندارد. پس اگر بعد از گذشت ۱۲۰ ثانيه هرگونه تقاضايی شود بدون توجه به پارامترهای ارسالی، صفحه درخواستی مجددا اجرا شده و نتيجه اجرای آن متعاقبا ارسال می گردد. و بالعكس آن يعنی زمانی كه مدت زمان نگهداری Caching به پايان نرسيده باشد و موارد ذكر شده در خصوصيت VaryByParam شرط را برقرار كنند از Caching صرف نظر می كند

دقت کنيد كه شما می توانيد صفحه ASP.NET خود را به تمام پارامترها حساس كنيد. يعنی به جای ذكر تك تك موارد با قرار دادن * برای خصيصه VaryByParam، باعث شويد كه در صورت تغيير هر كدام از پارامترهای ارسالی، صفحه دوباره اجرا گردد. با اين حال توجه كنيد كه اگر در اين حالت هيچ يك از پارامترهای ارسالی تغيير نكند، شرط مورد نظر برقرار نمی شود. حالت مقابل آن none است كه در مثال اول مورد استفاده آن نشان داده شده است.

۳- Caching بخشی از صفحه
يكی ديگر از موارد جالب در Caching صفحات وب در ASP.NET اين است كه شما قادر خواهيد بود قسمت خاصی از صفحه را تحت تاثير Caching قرار دهيد. در واقع تكنيك اين كار استفاده از UserControl ها می باشد (فايل های كه پسوند ascx دارند). بدين ترتيب كه شما يك هدايت كننده Caching را در صفحه UserContol خود قرار می دهيد. مثلا فرض كنيد كه صفحه ASP.NET عادی شما فاقد عمل Caching باشد ولی UserControl قرار داده شده در آن شامل Caching به صورت زير باشد:


<%@ OutputCache Duration = "30" VaryByParam = "none" %>

همچنين UserControl ما شامل يك Label كه زمان جاری سيستم ميزبان را نشان ميدهد باشد. همچنين صفحه اصلی ما نيز شامل يك Label زمان باشد. همچنين در هر دو روال Page_Load مربوط به صفحه اصلی و UserControl نسبت دهی زمان سيستم به اين Label ها قرار داده شود. مشاهده خواهيم برای بار اول درخواست صفحه، زمان نمايش داده شده در هر دو Label يكسان است. اما برای بار دوم درخواست در صورتی كه فاصله زمانی دو درخواست كمتر از ۳۰ ثانيه باشد مقدار زمان موجود در Label صفحه اصلی تغيير می كند ولی زمان Label موجود در UserControl تغيير نمی كند. توجه داشته باشيد كه برای درخواست های با فاصله زمانی بيش از ۳۰ ثانيه زمان هر دو يكسان خواهد بود. به هر حال زمان موجود درLabel صفحه اصلی در هر درخواست تغيير می كند.

بنابراين مشاهده شد كه توسط UserControl ها می توان Caching را فقط در قسمت خاصی از صفحه قرار داد كه اين هم سرعت صفحات را بالا می برد و هم از دوباره كاری جلوگيری می كند. توجه كنيد Caching در UserControl ها می تواند توسط خصوصيت VaryByParam نيز تحت تاثير قرار گيرد كه اين باعث می شود شرايط Caching را گسترده و گسترده تر كرد. بنابراين برعكس ASP کلاسيک كه Caching در آن چندان مورد استفاده قرار نمی گرفت (اگرچه لزوم آن احساس می شد). لزوم استفاده از Caching در بالا بردن سرعت صفحات در ASP.NET به وفور ديده می شود.


منبع:IranASP.NET

bahman_akbarzadeh
سه شنبه 22 اردیبهشت 1388, 10:32 صبح
سلام
ماشاالله دوستان همه چيز رو در مورد Caching گفتن.
فقط يك مورد جا موند كه دوستمون آقاي baran_mehr روش تاكيد داشتن. اونم اينه كه وقتي يك پرس و جو در سرور كش ميشه و كاربري اطلاعات صفحه رو آپديت ميكنه، افراد بعدي كه ميان، با همون اطلاعات كش شده قبلي مواجه ميشن.
براي اين مشكل كافيه همون قسمت كد كه عمليات آپديت اطلاعات انجام ميگيره، كش مورد نظر رو آزاد كرد.


Cache.Remove("CacheName");

ولي در مورد كش شدن صفحه نميدونم چطور ميشه كش رو آزاد كرد ولي مطمئن هستم راهي وجود داره. اگه دوستان زودتر از من به راه حل رسيدن حتما لطف كنن و اطلاع بدن.
ممنون

baran_mehr
دوشنبه 28 اردیبهشت 1388, 18:16 عصر
ســــــــلام من یه چند وقتی بود نتونستم سر بزنمم
از داداش گلم reza_moon_mordad ممنون بابت مطالبی که گذاشتن.
از بهمن هم بابت مطلبی که متذکر شدن ممنون.
دوستان باز هم اگر موردی رو نیاز دونستید که بگید و گفته نشده ممنون میشم بگید.

ali.akhbary
دوشنبه 28 اردیبهشت 1388, 22:15 عصر
این هم چند تا مثال با انواع مختلف از کتاب SAMS - ASP .NET 3.5 Unleashed
Page Output Caching
Partial Page Caching
DataSource Caching
Data Caching




<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="id" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Details</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
<hr />
<asp:DetailsView ID="dtlMovie" DataSourceID="srcMovies" runat="server" />
<asp:SqlDataSource ID="srcMovies" ConnectionString="<%$ ConnectionStrings:Movies %>"
SelectCommand="SELECT * FROM Movies WHERE Id=@Id" runat="server">
<SelectParameters>
<asp:QueryStringParameter Name="Id" Type="int32" QueryStringField="Id" />
</SelectParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>








<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByControl="dropCategories" %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN"
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Master/Details</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
<hr />
<asp:DropDownList ID="dropCategories" DataSourceID="srcCategories" DataTextField="Name"
DataValueField="Id" runat="server" />
<asp:Button ID="btnSelect" Text="Select" runat="server" />
<br />
<br />
<asp:GridView ID="grdMovies" DataSourceID="srcMovies" GridLines="none" runat="server" />
<asp:SqlDataSource ID="srcCategories" ConnectionString="<%$ ConnectionStrings:Movies %>"
SelectCommand="SELECT Id,Name FROM MovieCategories" runat="server" />
<asp:SqlDataSource ID="srcMovies" ConnectionString="<%$ ConnectionStrings:Movies %>"
SelectCommand="SELECT Title,Director FROM Movies
WHERE CategoryId=@CategoryId" runat="server">
<SelectParameters>
<asp:ControlParameter Name="CategoryId" ControlID="dropCategories" />
</SelectParameters>
</asp:SqlDataSource>
</div>
</form>
</body>
</html>

ali.akhbary
دوشنبه 28 اردیبهشت 1388, 22:18 عصر
<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="none" VaryByHeader="User-Agent" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Vary By Header</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
<hr />
<%= Request.UserAgent %>
</div>
</form>
</body>
</html>



<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="none" VaryByCustom="browser" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Vary By Browser</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
<hr />
<%= Request.UserAgent %>
</div>
</form>
</body>
</html>

ali.akhbary
دوشنبه 28 اردیبهشت 1388, 22:21 عصر
<%@ Application Language="C#" %>

<script runat="server">
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (String.Compare(custom, "css") == 0)
{
return Request.Browser.SupportsCss.ToString();
}
return base.GetVaryByCustomString(context, custom);
}
</script>

<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="none" VaryByCustom="css" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
void Page_Load()
{
if (Request.Browser.SupportsCss)
pnlCss.Visible = true;
else
pnlNotCss.Visible = true;
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Vary By Custom</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Panel ID="pnlCss" Visible="false" runat="server">
<span style="font-weight: bold">Hello!</span>
</asp:Panel>
<asp:Panel ID="pnlNotCss" Visible="false" runat="server">
<b>Hello!</b>
</asp:Panel>
</div>
</form>
</body>
</html>

ali.akhbary
دوشنبه 28 اردیبهشت 1388, 22:32 عصر
یه کار با حال.

<configuration>
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache1Hour" duration="3600" varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
</configuration>

حالا به جای اینکه تو هر صفحه شلوغ بازی در بیارید. اسم بیارید.

<%@ OutputCache CacheProfile=”Cache1Hour” %>

ali.akhbary
دوشنبه 28 اردیبهشت 1388, 22:35 عصر
اگه سرتون رو درد اوردم ببخشید. فقط کسایی که server دارن یا سایتهای پر کاربر دارن قدر cache رو میدونند.

baran_mehr
چهارشنبه 30 اردیبهشت 1388, 01:48 صبح
ali.akhbary جان خیلی ممنون از لطفت.
کاشکی کدهاتو تو تک کد میزاستی تا راحت تر خونده بشن.
ممنون

ali.akhbary
جمعه 01 خرداد 1388, 20:44 عصر
سلام.
این هم کد.
موفق باشی.:چشمک: