ورود

View Full Version : مقاله: Cache در Asp.net



eyes_shut_number1
جمعه 29 شهریور 1387, 12:37 عصر
cache : همون طور که ميدونيد کش کردن يعني اطلاعاتي را به طور موقت در حافظه که عموما حافظه موقت نام ميدن .اين کار باعث ميشه که هزينه هاي همچون مراجه به سرور و باز خواني از آن کم بشه ولي خوب از نظرف صرف حافظه هزينه بر است.
اکثر ما برنامه نويسها فکر ميکنيم که کش کردن و استفاده از آن الزامي نيست.البتهخ درسته الزامي نيست اما اگر بدونمي 2-3 و در بعضي مواقع تا 10 برابر پرفورمنس رو بالا ميبره.
البته به شرط درست استفاده کردن.
به طور کلي کش کردن به دوس دسته تقسيم ميشه.
Output Caching , Data Caching
out put : اخرين صفحه اي که رندر شده را براي کلاينت بعدي در کش نگه ميدارد و آن را تحويل کلاينت بعدي که در خواست همان صفحه را دارد ميدهد.
(منظورم المانهاي html است)
Data : اطلاعاتي مثل ديتاست را نگه داري ميکند.البته به صورت خودکار درون بر روي صفحات وب اعمال ميشود.تقريبا شبيه application state است
اما خيلي براي Server Friendly تر ميباشد چون وقتي حجم آن بالا رفت به طور خود به خود آن را خالي مي کند
fragment cache(Output Cache مربوط به):
به جاي آنکه html را بر روي تمامي صفحات کش کند آن را براي قسمتي کش مي کند.
Data source caching(مربوط به Data caching) : کشي است که در داخل datasource control هايي مثل
sqldatasource,objectdatasource,Xmldatasource
درست ميشود.از نظر فني شبيه datacaching است اما نياز به به دست گيري صريح آن و نيست
(not Explicity)
نکته : شايد asp.net منابع ثابتي مثل عکس را نتواند کش کند اما نگران نباشيد چون IIS به خوبي اين کار را به صورت خود کار انجام مي دهد
براي کش کردن 2 راه وجود دارد:
راه اول :
در رويداد لود صفحه کد زير را وارد کنيد


lbl1.text=datetime.now.tolongtimestring()

و حال در صفحه aspxخود اين تگ را اضافه کنيد


<%@ outputcache duration="20" varyByParam="None" %>


صفحه را اجرا کنيد.در بار اول ساعت فعلي را ميبينيد.دوباره آن را باز سازي کنيد.شگفت انگيزه نه؟ به مدت 20 ثانيه ساعت اوليه رو نشون ميده!
حتما متوجه شدين Duration مقدار زماني که Asp.net اين صفحه رو در کش نگه داري ميکنه است

ادامش باشه برای بعد ببینیم اصلا به درد کسی خورده یا نه
ممنون از توجهتون

eyes_shut_number1
جمعه 29 شهریور 1387, 18:43 عصر
اين روش بر روي سايت هايي با حجم بالا نتيجه چشم گيري داره(لوستر بايد چشمگير باشه!)
اگه شما صفحه اي که شامل نمايش محصولات هست رو 20 ثانيه کش کنيد يعني تعداد عملايت را محدود کرده ايد(حدود 3 فرمان در دقيقه(
بدون کش به ازاي هر فرمان يک بار بايد به سرور مراجعه شود
البته اين بدان معني نيست .!(کدوم معني؟)
اگر سيستم مبع داده را ضعيف ببينه آن را release ميکنه
با وجود اين خاصيت مي توانيم بدون ترس از کش استفاده کنيم

در قسمت اول در مورد varybyparam صحبت نکردم.کسي هم نپرسيد!
ما مقدار آن را برابر None قرار داديم
اين بدان معناست که شما احتياج به نگهداري يک کپي از صفحه را داريد.
حالا تصور کنيد ورود به آن صفحه با querystring باشد.
به نظر شما آيا کش براي يک کاري به اين پويايي کاربرد داره؟
وقتي که اطلاعات را به کوئري استرينگ وارد شويد.صفحاتي که در کش داريد expire ميشوند.
براي اين منظور مقدار varybyparam attribute را برابر "*"
وقتي اطلاعات را مي فرستيم asp.net ابتتدا querystring را امتحان مي کند که آيا با قبلي يکي است و اگر بله آيا داخل کش است يا نه.
اگه جواب هردو درست باشد صفحه از کش ارسال مي شود در غير اين صورت يک کپي جديد داخل کش گذاشته ميشود.

modify کردن cache :


<%@ outpucache duration="30" cacheprofile="pro1" varybyparam="None" %>
in web config :
<system.web>
<caching>
<outputcachesetting>
<outputcacheprofile>
<add name="pro1" duration="60" />


</outputcacheprofile>
</outputcachesetting>
</caching>
</system.web>

eyes_shut_number1
جمعه 29 شهریور 1387, 18:45 عصر
نکاتي پيرامون کش :
the cache object is thread-safe :براي هر بار اضافه کردن کش نيازي به lock&unlock کردن آن نيست
اگر آبجکتي داشته بتشيم که بيشتر از يک کلاينت به آن دسترسي داشته باشد که ممکن است داده invalid وارد کند.
items in the cache are removed automaticlly : اگر داده expire شده باشد آنها را رها مي کند.
the cache object is support dependencies : شما مي توانييد link شي کش را به يک ديتابيس -جدول -فايل.
اگر اين منبع تغيير تغيير کند شيء کش شما به صورت خودکار نامعتبر و آزاد مي شود.

kezack
جمعه 29 شهریور 1387, 19:38 عصر
دستتون درد نکه بابت مطالب مفیدتون

kezack
جمعه 29 شهریور 1387, 19:49 عصر
یک سوال برام پیش اومده شما از مزایای cache گفتین می خواستم بدونم معایب استفاده از ان جیه؟

eyes_shut_number1
جمعه 29 شهریور 1387, 20:00 عصر
راستش دوست عزیز عرض کنم به نظر بنده اگه به موقع و به جا ازش استفاده بشه عیبی نداره بلکه عالیه
درضمن همیشه کش کردن هزینه بره و حافظه رو اشغال میکنه
ولی ما باید اینو فدا کنیم برای بالا بردن کارایی
توی صفحه اخبارتون مثلا از این قضیه استفاده کننید تا رضایت بینندگان سایتتون رو ببینید

eyes_shut_number1
جمعه 29 شهریور 1387, 20:03 عصر
راه دوم :
اضافه کردن ايتم به کش است به روش زير:




cache.insert("ItemName",object,dependency,تاريخ انقضا, مدت زمان اعتبار بدون استفاده)

ItemName:نام ايتم مود نظر براي اضافه کردن به کش است
Object:مقداري است که به ايتم نسبت داده مي شود
dependency : بعدا توضيح ميدم
تاريخ انقضا: مدت زماني که اعتبار دارد
مدت زمان اعتبار بدون استفاده:مدت زماني که بعد از استفاده نشده از آن وشي آزاد مي شود.
exp:


cache.insert("myitem","Farshad",nothing,datetime.maxvalue,timespan.minute(10))


مقدار فرشاد را داخل متغيير myitem ميريزد و اگر پس از 10 دقيقه اگر استفاده نشود آزاد مي شود.

eyes_shut_number1
شنبه 30 شهریور 1387, 15:37 عصر
در اين مثال ديتا ستي را پر ميکنيم و آن را کش ميکنيم و در صفحه ديگر اطلاعات آن راباز خواني ميکنيم.
مثال : پر کردن اطلاعات درون ديتاست-اضافه کردن به کش'
'In Form 1
'In Button_Click
Dim cnn As New sqlconnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True")
Dim dap As New SqlDataAdapter(" SELECT * FROM [Alphabetical list of products]", cnn)
Dim ds As New Data.DataSet
dap.Fill(ds)
Cache.Insert("ds", ds)
Response.Redirect("default2.aspx")
باز خواني از کش و نمايش'
'In Form 2
'In form_Load
Dim ds As Data.DataSet
ds = CType(Cache("ds"), Data.DataSet)
For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
Response.Write(ds.Tables(0).Rows(i)(1).ToString)
Next

eyes_shut_number1
شنبه 30 شهریور 1387, 16:50 عصر
Cache Dependency :در مورد اين موضع گفتم بعدا بحث ميکنم .
اين مورد به شما اجازه مي دهد که يک Cache Item رو به يک يا چند منبع خاص نسبت دهديد.
اما اين کار چه فايده اي داره؟
فرض کنيد يک ديتا ست رو پر کردين از يک جدول
اما اين جدول شما تغيير کردن
نفري که ميخواد از صفحه استفاده کنه اطلاعات جديد رئ نميبينه
اما اگر از cache dependency استفاده کنيد و اون ديتابيس رو بهش نسبت بدين به محض تغير در داخل آن اين ايتم به طور خود کار پاک مي شود.
کد :


Dim CD1 as new CacheDependency(server.mappath("1.xml"))
cache.insert("myitem",ds,CD1)


Combine Cache Dependency(aggrigate Cache Dependency):
حالا فرض کنيد بخواين ايتم خودتون رو به چند منبع وابسته کيند به روش زي عمل ميکنيد .
کد :


Dim CD1 as new CacheDependency(server.mappath("1.xml"))
Dim CD2 as new CacheDependency(server.mappath("2.xml"))
Dim CD() as new CacheDependency={CD1,CD2}
Dim ACD as new aggrigateCatcheDependency()
Acd.add(CD)
cache.insert("myitem",ds,Acd)

silverfox
جمعه 03 آبان 1387, 10:58 صبح
چجوری می تونم اطلاعات رو تا موقعی که توی دیتابیس آپدیت نشدن کش کنم و وقتی که آپدیت شدن توی صفحه هم اطلاعات جدید بیاد؟!

pourhabibi
یک شنبه 27 اردیبهشت 1388, 15:28 عصر
چه تفاوتي بين نگهداري اطلاعات توي cach يا نگهداي اونها توي session هست؟ كدوم يكي كارايي بالاتري دارند و فشار كمتري رو به منابه وب سرور وارد مي كنند؟
من يه سيستم تحت وب دارم كه براي نگهداري داده هاي بزرگم(خيلي بزرگم) مثل يك جدولي كه از sql بازيابي كردم، از session استفاده مي كنم. آيا اين كار اشتباه نيست؟ راهكار بهتر كدومه؟

mehr83
شنبه 02 خرداد 1388, 17:47 عصر
از کد زیر برای cache در page استفاده می کنم

<%@ outputcache duration="20" varyByParam="None" %>
اما برای مدت زمان زیاد مثلا چهار ساعت جواب نمیده
برای چهار ساعت duration را برابر 14400 قرار میدم
اما عملا کمتر از 20 دقیقه تو حافظه نگه میداره.

ali.akhbary
یک شنبه 03 خرداد 1388, 12:17 عصر
http://barnamenevis.org/forum/showthread.php?t=147845&page=3