Makale Özeti

Bu makalemizde ASP.NETin en büyük performans avantajlarından olan önbellekleme(caching)in sayfa bazında nasıl kullanılabileceğini inceliyoruz.

Makale

ASP.NET ile sayfa bazında önbellekleme yapmak oldukça kolaydır. Yapmamız gereken sayfa belirteci olarak OutputCache ifadesini kullanmaktır.

<%@OutputCache Duration="zaman" Location="yer" %>

Bu ifadede Duration zamanı ifade etmektedir. Bu sayfanın ne kadar süre ile önbellekte kalacağını belirtiriz. Birimi saniyedir. Örneğin Duration="600" dediğimizde sayfa 600 saniye yani 10 dakika boyunca önbellekte tutulacaktır.

Location ise önbellekleme işleminin nerede gerçekleşmesini istediğimizi belirttiğimiz değerdir. Verebileceğimiz değerleri listeleyecek olursak:

Any Önbellekleme işleminin herhangi bir yerde olabileceğini belirtir. Hiçbirşey belirtmediğinizde bu seçenek aktif olmaktadır.
Client Sayfa çıktısı istemci tarafında önbelleklenir.
Downstream İstemciye sayfa ulaşmadan bir Proxy sunucu arada yer alıyorsa önbellekleme işleminin onun üzerinde gerçekleşmesini sağlar.
None O sayfa için önbellekleme işleminin olmayacağını belirtir.
Server Önbelleklemenin isteği ele alıp sayfayı üreten sunucu tarafında gerçekleştirilmesini sağlar.

OutputCache ifadesini kullandığınızda önbellekleme işlemi bellek yerine sabit disk üzerinde gerçekleşir ve böylece önbellekleme yaparken bellek hafızasından kaybetmeden çok daha hızlı bir çözüm üretmiş oluruz. Bu yöntem çok fazla kaynak kullanmadığı için iyi bir performans çözümüdür.

Bir örnek yaparak konuyu somutlaştırma zamanı geldi. Bu örnekte bir elektronik ticaret uygulaması olduğunu düşünelim. Bu tür uygulamalarda çeşitli navigasyon ardından en önemli yere yani ürün detay bilgisine erişilir. Şimdiye kadar öğrendiklerimize göre sayfalar yeniden çağırıldığında eğer önbellekleme kullanırsak daha hızlı bir şekilde istemciye ulaşacaktır. Hemen bakalım;

<%@ Page Language="VB" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>

<script runat=server>
Sub Page_Load (Sender as Object, E as EventArgs)
mesaj.text = "Bu ürün bilgisine " & _
"eriştiğiniz zaman" & _
" " + datetime.now.ToString("T")
End Sub
</script>
<html>
<body>
<font size=3>Ürün Detay Bilgisi sayfasına eriştiniz. </font><br>
<asp:label ID=mesaj Runat=server Font-Bold=True />
</body>
</html>

Bu örnekkodu onbellekleme_1.aspx olarak kaydedelim ve internet explorerdan çağıralım. Karşımıza Şekil 1deki gibi bir ekran görüntüsü gelecektir:

Şekil 1

Şimdi neler olduğunu adım adım inceleyelim. Öncelikle sayfa sunucudan istendi. Sunucu sayfanın içerisinde yer alan OutputCache ifadesini gördü ve böyle bir sayfanın daha önce önbellekte olup olmadığını kontrol etti. Olmadığı için bu sayfa ilk defa derlendi ve Duration="60" ifadesi kullandığımız için bu sayfa 60 saniye boyunca önbellekte tutulsun bilgisine dayanarak önbelleğe yerleştirildi. Eğer bu sayfa 60 saniye içerisinde yeniden çağrılırsa önbellekten geleceği için yani hazırlanmış bir sayfayı sunucu bize sunacağı için çok hızlı olacaktır. Fakat 60 saniye sonrasında bu sayfanın önbellekleme süresi dolacağından dolayı yeniden aynı işlemler gerçekleşecek ve yeni bir 60 saniye daha önbellekte tutulacaktır.

Sayfa bazında bu tür işlemler yaparak performansı ciddi bir şekilde arttırmak mümkün. Peki bu bir ürün detay sayfası olduğuna göre ve eğer iyi bir yazılım geliştiricisi olarak tek bir ürün detay sayfasını parametrik olarak çağırıp farklı ürünler için tek sayfa kullanmamız gerektiğini bilerek bu sayfayı ürün kodunu parametrik bir şekilde alan hale getirmeliyiz. İşte soru; 60 saniye içerisinde kullanıcı farklı bir ürün bilgisi için aynı sayfayı çağırdığında önbellekte diğer ürün için saklanmış olan sayfa olduğu için istemciye hatalı sayfa gönderilmeyecek midir? Tabiki hayır, dikkatinizi çeken ve şimdiye kadar açıklamadığım VaryByParam işte bu işe yarıyor.

Sayfanıza önbellekleme uygularken ek parametreler kullanabilirsiniz : VaryByParam, VaryByHeader ve VaryByCustom. VaryByParam ile hangi parametreler gönderildiğinde sayfanın önbellekten değil yeniden çalıştırılarak görüntüleneceğini belirlersiniz. Az önceki örneği hatırlarsanız none değeri vermiştik. Bu hiçbir querysting parametresini göz önüne alma demektir. Az önceki örneğin bu satırlarını şu şekilde değiştirisek;

<%@ Page Language="VB" %>
<%@ OutputCache Duration="60" VaryByParam="urun_id" %>

<script runat=server>
Sub Page_Load (Sender as Object, E as EventArgs)
mesaj.text = "Bu ürün bilgisine " & _
"eriştiğiniz zaman" & _
" " + datetime.now.ToString("T")
End Sub
</script>
<html>
<body>
<font size=3>
<b>Başlık:</b> <%=request.querystring("baslik")%></font><br><br>
<font size=3>
<%=request.querystring("urun_id")%> kodlu
Ürün Detay Bilgisi sayfasına eriştiniz. </font><br>
<asp:label ID=mesaj Runat=server Font-Bold=True />
</body>
</html>

Bu sayfayı da onbellekleme_2.aspx olarak kaydedelim. Bu sayfanın ilkinden farklı iki farklı parametre almasıdır: urun_id ve baslik. Urun_idnin ürünün kodu olduğunu farzedelim, baslik ise sayfanın başlık bilgisi olsun. Bizim için önemli olan ürün detay sayfası her çağrıldığında sahip olduğu urun_id değerine göre farklı içerik getirmesidir. OutputCachea VaryByParam="urun_id" dediğimiz zaman bunu yapabiliriz. Sunucu bizden urun_id ve baslik bilgisini alır ve önbellekte sayfa oluşturur ama sayfanın aldığı urun_id parametresi değişirse o sayfa yeni parametreli hali ile farklı olarak önbelleklenir. Şekilleri inceleyelim:

Şekil 2

Şekil 2de 3 nolu ürün için sayfamız hazırlanmıştır. Bu sayfayı 60 saniye içerisinde yeniden istememiz ile bu sayfa önbellekten çok hızlı bir şekilde gelecektir. Fakat biz bu süre içinde dahi olsa urun_id parametresini farklı verirsek;

Şekil 3

Şekil 3te de görüldüğü gibi sayfa yeniden hazırlanacak ve farklı bir önbellekleme yapılacaktır. Ürün bilgisine erişilen zamanlara baktığınızda aynı 60 saniye içerisinde farklı iki sayfa üretildiğini görebilirsiniz.

Peki ya baslik parameteri değişseydi ne olurdu? Hiçbirşey olmazdı sayfa önbellekten gelirdi çünkü sadece urun_id VaryByParam olarak belirlenmiştir.

VaryByHeader ise aynen VaryByParam gibi parametrelere bakarak çalışmaktadır, farkı querystring değerlerine değil de HTTP Başlık bilgilerine bakmasıdır. VaryByCustom ise HTTP başlık bilgisi veya querstring değerlerine değil de tarayıcı adı, versiyonu gibi bilgilere göre önbellekleme yapabilmemizi sağlar.

Böylelikle bu makalemizin de sonuna geldik, bilgiyi paylaştığımız yeni bir makalede daha görüşmek dileklerimle...

Mehmet Nuri ÇANKAYA

cankaya@aspnedir.com