Posts Tagged :

cache

ASP.Net _ Data Cache 1024 608 mezo

ASP.Net _ Data Cache


Merhaba arkadaşlar bir önceki yazımızda sayfamızı bir bütün olarak nasıl  cache leyebileceğimizi gördük . Bu yazımızda ise senaryomuz farklı . Bir e-ticaret sitemizin olduğunu varsayalım ve bu sayfa üzerinde birden fazla alan bulunmakta kategoriler, markalar, yeni ürünler , indirimli ürünler gibi ayrı ayrı ama hepsi veritabanından gelen veriler bulunmakta. Bu sayfamızı bütün olarak cache e koyduğumuzda ürünlerde indirimli ürünler gibi sürekli değişebilirliği bulunan alanlarda aynı cache içersinde bulunacağından değişiklikler kullanıcılara yansımayacaktır. Peki nasıl olacak bu iş ?
Biz sayfamız içersinde değişmeyecek alanlarımızın olduğunu biliyoruz örneğin kategoriler markalar gibi alanlar bunlar kolay kolay değişmez yada güncellenmez. Sayfayı komple cache işlemine almaktansa sadece bu alanların doldurulduğu DataTable nesnesini cache işlemine alsak yani sadece sayfada istediğimiz alanları cache işlemine dahil etsek  süper olmaz mı ? Tıpkı aşağıdaki resimdeki alanlar gibi.

İşte bu işlemide data cache ile yapabiliriz kullanımı OutputCache den biraz farklı ama eminimki seveceksiniz.  Bu işlem için DataTable döndüren bir property  e ihtiyacım olacak bu property içersinde bilgileri alıp cache işlemine dahil edeceğiz.

Property ‘miz hazır artık içersine bir Datable gönderdiğimizde içersinde cache işlemini yaparak tekrar cache lenmiş datatable döndürecek.  Bu property i hazırladıktan sonra işimiz çok kolay sadece en basit olarak datalarımızı veritabanından çekmek kalıyor.

Datamızı çekerken bir noktaya dikkatinizi çekmek istiyorum öncelikle MyData boşmu diye kontrol ettikten sonra bağlantımızı kurup sorgumuzu yollayıp verilerimizi alıyoruz ve Datatable ile karşıladığımız verilerimizi MyData ya atıyoruz. Ardından Repeater nesnemizin DataSource ‘ una MyData yı verdiğimizde cachelenmiş veri nesnemizin veri kaynağı olarak belirleniyor ve belirtilen süre içerisinde  bu veriler diğer alanları etkilemeyecek şekilde cache işlemine dahil edilmiş oluyor. Fakat bu işlemi uyguladığımızda  eğer veritabanında değişiklik olursa ve belirttiğimiz cache süresi bitmeden sayfaya istekte bulunursak görünürde bilgiler hiç güncellenmiyormuş gibi görünecek çünkü MyData içersinde veriyi cache işlemine dahil ederken kullandığımız Cache.NoAbsoluteExpriration deyimi cache süresinde kayma yapar.

Yani cache süremizi 30 dakika olarak düşünürsek ilk sayfa için istekte bulunulduğunda datamız cache lenecek daha sonra 30 dakika hiç istek olmazsa veritabanından yeni verileri çekerek yeni bir cache oluşturacak. Peki ya bu 30 dakika dolmadan 15. Ci dakikada bir istekte bulunulursa o zaman ne oluyor ? o zamanda “sliding” yani kaydirma işlemi yapılarak istekte bulunulduğu dakikaya bir 30 dakika daha ekleyerek cache süresini uzatıyor.  Yani 12:00 da istekte bulunulan sayfada cache yenileme süresi 12:30 oalcaktır fakat 12:15 de  tekrar bir istekte bulunulduğunda cache in yenilenme süresi 12:45 olarak değişecektir.

Bu yöntemden başka yöntemlerde var.  Biz MyData içersine datatable gönderdiğimizde içerdeki işlemler sırasında eğer NoAbsoulateExpiration değilde NoSlidingExpiration kullanırsak bu kez bizim sayfa isteklerimizi dikkate  almadan sadece belirttiğimiz cache süresinin bitmesini bekleyecek ve süre bitiminde cache işlemini yeniler.

Böylelikle sayfamız içersinde belirttiğimiz üzere birden  fazla database ile ilgili bölüm olsada biz sadece Kategoriler bölümünü yada sadece markalar bölümünü Cache işlemine dahil etmiş olacağız bu bilgi için tekrar tekrar DB ye bağlanmak zorunda kalmayacağız.

Umarım yararlı olur. Görüşmek üzere.

Bilgiyle Kalın…
M. Zeki Osmancık

ASP.Net _ Output Cache 469 492 mezo

ASP.Net _ Output Cache


Merhaba Arkadaşlar
Bu yazımda sizlere ASP.Net ile dinamik web siteleri yaparken performansı etkileyecek bir yapıdan bahsetmek istiyorum. Genellikle bu tip web sayfalarında veriler veritabanından çekilir. Bir sayfada, her seferinde veritabanına bağlanmak ve özellikle farklı tablolardan veri çekiyorsak, performansı önemli derecede etkiler .Herseferinde veritabanına gidip farklı tabloları bulup verileri web sayfası üzerine çekmek sayfayı yavaşlatır kullanıcıyı usandırır. Yavaş bir web kullanıcı üzerinde negatif bir etki yaratır. Bunun için ne yapmak gerekiyor peki ?
Sayfalarımızda bulunan verinin güncellenme sıklığına göre belirli bir süre tüm verileri Cache işlemine tabi tutsak ve kullanıcı sayfayı çağırdığında her seferinde veritabanına bağlanmaktansa cache te var olan veriyi göstersek çok daha performanslı olmazmı ? Belirtilen süre bittiğinde ise 1 sefer gidip veritabanından bilgileri alıp tekrar cache içersine doldurduğumuzda tadından yenmez . 😀
Peki sayfamızı Cache dediğimiz yapı içersine almak için ne yapmak gerekiyor ?

Yapmamız gereken sadece aspx sayfamızın ilk satırlarına yukardaki yapı gibi
<%@ OutputCache Duration=”30″ VaryByParam=”none” %> kodunu eklemek olacak böylelikle sayfamız outputcache ile komple cache işlemine tabi olacak ve Duration kısmında belirttiğimiz saniye cinsinden süre kadar cache de kalacak. Sizde bir sayfa üzerine basitçe veritabanından veri çekerek bu işlemi uygulayın ve veritabanını güncelledikten sonra sayfanızıda güncelleyin verdiğiniz Duration süresi boyunca sürekli güncellemeden önceki bilgiler gelecek.Duration süresi bittikten sonra tekrar veritabanına bağlanarak tekrar bir cache yapacaktır. Bunu sizin de yapmanızı istedim çünkü etkisini mutlaka görmelisiniz.

Senaryomuz şu olsun : Diyelimki biraz önce belirttiğim sayfanız üzerine çektiğiniz bilgi ürün kategorileri olsun. Bu kategoriler hangi sıklıkla güncellenir? Ancak yeni bir ürün grubu geldiğinde değilmi ? Buna göre sayfa üzerinde  sürekli veritabanına bağlanıp güncel kategori bilgileri ile dönmesinin bir anlamı olmaz. Bu sayfayı 1  günlük cache işlemine aldığımızda ilk kullanıcı sayfayı açtığında veriler cache atılacak daha sonra tüm gün veritabanına bağlanmayacak SqlServer için ne kadar rahatlatıcı değilmi ?J

Kategorilerin olduğu sayfayı cache e attık çok güzel!  Birde bu kategorilere tıkladığımzda o kategoriye ait olan ürünleri gösteren bir  Ürünler sayfamız olsa ve QueryString ile gelen kategoriID si ne göre ürünleri gösterse ve bu ürünler sayfasınıda Cache atmak istesek aynı işlemi uygulasak ????

Belirttiğimiz süre içersinde hangi kategoriye tıklarsak tıklayalım hep aynı kategoriye ait ürünler görülecektir.

Bu sorunuda <%@ OutputCache Duration=”30″ VaryByParam=”CatID” %>  kodu içersinde belirttiğimiz VarybyParam değeri ile düzenleyebiliyoruz. Bu değer bize cache işleminin hangi parametrelere göre yapılacağını belirttiğimiz bir değer. Buna göre VaryByParam değerine querystring deki kategoriID sini taşıyan parametreyi verirsem kategoriler sayfasında kategorilerden hangisine tıklarsam tıklayayım diğer sayfadaki cache işlemi o kategoriID sine göre düzenlenerek bize farklı kategorilerdeki ürünlerinde görüntülenmesini sağlayacaktır.

Her zaman kategori bilgisini farklı sayfadan göndermeyebiliriz. Bir sayfa içersinde bir dropdownlist içersine listelenmiş kategori bilgileri ilede aynı sayfa üzerinde ilgili ürünleri listelediğimizi varsayarsak. Aynı  yöntemle yapmaya kalkarsak yine sorun çıkacaktır çünkü burada parametre olarak querystring kullanmıyoruz bir kontrol kullanıyoruz. Bu kez ise VaryByParam yerine VaryByControl kullanıyoruz.  <%@ OutputCache Duration=”30″ VaryByControl=”DropDownList1″ %>

Parametrenin hangi değere göre cache işlemine gireceğini değeri nereden alacağını belirtmiş oluyoruz. Böylece aynı sayfa içersinde bulunan controllerin durumuna görede cache işlemini şekillendirmiş oluyoruz.

Gelin biraz işin içine , işin dibine , işin altında yatan koca ayzberge (iceberg)  bakalım 😀

OutputCacheModule ASP.Net içersinde bir HTTP Modul olarak implement olmuştur ve  System.Web.Caching namespace i içersinde yer alır. Bu modül sayfa içersindeki isteklerin yaşam alanı içersinde  gerçekleşecek olan olayları dinler ve ilgili bir olay(event) çalışırsa harekete geçer.HTTPModule  OutputCacheModule’ e ,  ResolveRequestCache ve UpdateRequestCache olayları ile katkıda bulunur.  ResolveRequestCache olayı tetiklendiğinde, modul gelen isteğin sonucunda dönecek olan sayfanın outputcache dahilinde olup olmadığına karar verir. Eğer cache işlemi varsa cache version bilgisi döner,cache bilgisi yoksa sayfa normal render edilir.  Geriye dönen cache bilgisine göre UpdateCacheModule çalışır. Bu modül çalıştığı zaman ise render edilen sayfa cache işlemine alınır.

Aşağıdaki diagram outputcachemodülünün çalışmasıyla ilgili bir fikir verecektir.

Başka yazılarda tekrar görüşmek üzere

Bilgiyle Kalın…
M.Zeki Osmancık

 

    Join our Newsletter

    We'll send you newsletters with news, tips & tricks. No spams here.