Merhaba arkadaşlar,
Bu yazımızda ASP.NET uygulamalarında bize performans kazandıran bir özellik olan Data Caching'e bakacağız.Data Caching'i sitemizde kullanılan bir nesnenin her kullanıcıya tekrardan yaratılmasını engelleyerek bizim belirttiğimiz özellikler(bellekte duracağı süre vb) doğrultusunda tüm ziyaretçilerin Caching işlemi uygulanmış nesneye erişerek tekrardan her bir kullanıcı için nesnemizin yeniden oluşturulmasını engellemek için kullanırız.Aslında bu nesne dediğimizde veritabanından gelen ve içerisinde kayıtlarımızın bulunduğu DataTable,DataSet veya elemanlarımızın bulunduğu koleksiyonlardan başka birşey değildir.Elimizdeki bir veriyi belleğe almak istersek Page sınıfında ki Cache nesnesinin Insert isimli metodunu kullanarak verimizi sunucumuzun belleğinde saklayabiliriz.Verilerimizi belleğe atarken de key-value çiftleri olarak saklakamtayız.
Tabi ki bizim oluşturmak istediğimiz nesneleri bellekte belirlediğimiz süreler doğrultusunda tutabileceğimizi söylemiştik.Saklama işleminde de aşağıdaki iki yöntemi kullanabiliriz;
Sliding Expiration: Bu yöntem ile bellekte ki verimize talep geldikçe sunucumuzda durmasını sağlarız.Şöyle ki mesela veritabanından aldığımız verileri bir DataTable'ye attık ve bu veriyi bellek üzerinde saklamak için Sliding Expration yöntemi ile 10 dk durmasını istediğimiz de ve ziyaretçi bu nesneye eriştiğinde bellekte oluşacak fakat ulaştıktan sonra bellekteki nesneye talep gelmez ise bellekten kaldırılacaktır.Fakat bellek üzerine çıkartılan bir nesnemize hafızada tutulma süresi olarak 10 dk verdiğimizde 18:15'de bir talep geldiğinde nesnemiz 18:25'e kadar bellek üzerinde bulunacaktır.Eğer 18:15'te belleğe çıkartılan nesnemize 18:20'de bir talep gelirse eğer bu sefer verimiz 18:30'a kadar bellek üzerinde duracağını söyleyebiliriz.Yani belirttiğimiz süre içerisinde nesnemize bir talep gelirse bellekteki süremizin üstüne bizim verdiğimiz süre eklenecektir.Aşağıdaki örneğe bakacak olursak veritabanından gelen bilgilerin ilk talep geldiğinde nesneyi belleğe 25 saniyeliğine atıyoruz,bu 25 saniye içinde bir talep gelirse veriler veritabanından tekrar çekilmiyor fakat 25 saniye dolduktan sonra bir talep gelirse sayfamıza tekrardan veritabanından bilgileri okuyum cache'e aktarılıyor yani veritabanımızda değişiklikleri 25 saniye dolduktan sonra anlayabileceğiz.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Cache["ogrenciler"] == null)
{
SqlConnection con = new SqlConnection("data source=.; initial catalog=OKUL; integrated security=true");
SqlDataAdapter da = new SqlDataAdapter("select * from ogrenciler", con);
DataTable dt = new DataTable();
da.Fill(dt);
Cache.Insert("ogrenciler", dt, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(25));
Response.Write("Veriler belleğe çıkarılıp cache aktarıldı");
}
else
Response.Write("Veriler Cache'den çağırıldı");
GridView1.DataSource = Cache["ogrenciler"];
GridView1.DataBind();
Response.Write("<br/>");
Response.Write(DateTime.Now.ToLongTimeString());
}
}
Sayfamızı ilk çalıştırdığımızda aşağıdaki görüntüyü elde edeceğiz.Cache çıkarıldıktan sonra 25 saniye içine tekrar talepde bulunulur ise nesnemiz yeniden oluşturulmayıp cache'den çağıralacaktır.Şu durumda 12:07:29'da veritabanımızdaki kayıtların belleğe çıktığını görüyoruz.

Fakat aşağıdaki resime baktığımızda verilerimizin cache'den geldiğini görüyoruz.Çünkü 12:07:29'da belleğe verilerimizi çıktığında 25 saniye geçmeden tekrar talepde bulunulduğu için bulunulan zamanını üzerine 25 saniye daha eklenmektedir.Sürekli talep geldiğinden zaman ertelenmektedir.Aradaki zaman farkına da bakarsak 41 saniye olduğunu görüyoruz.
Son talepde bulunduğumuzda bellekteki verimize yukarıdaki resime bakacak olursak 12:08:10'da ulaştığımızı görüyoruz.Belleğe çıkartılan nesnemize talep gelmez ise 25 saniye sonra kaldırılacağından 12:08:10 'dan sonra 25 saniye istek olmaz ise cache'lenmiş verimiz sunucumuzun belleğinden kaldırılacaktır.Tekrar istekde bulunulduğu zaman yeniden nesnemiz oluşturularak belleğimiz de cache'lenecektir.Görüldüğü gibi yukarıdaki resimdeki zaman ile aşağıdaki zamana bakacak olursak 40 saniye talep olmadığından verimiz bellektek kaldırıldı ve tekrar istekte bulunulduğunda nesnemiz veritabanımızdaki bilgiler ile doldurulup cache'lendi.
Cache.Insert("ogrenciler", dt, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(25));
Yukarıda ki satırı incelemek gerekirsek nesnemizi Cache'lemek istediğimizde Cache sınıfının Insert metodunu kullandığımızı söylemiştik.İlk parametresi Cache'deki verimize ulaşmak istediğimiz adı veriyoruz.İkinci parametrede vermiş olduğumuz ad ile Cache'lenecek olan nesnemizi veriyoruz ki bu dt adında bir DataTable nesnemiz.Veritabanından gelen kayıtların tutulduğu nesnedir.Üçüncü parametre bizden CacheDependecy tipinden bir değer beklemektedir.Kısaca bahsetmek gerekirsek bir dosyamıza veya veritabanımıza bağlı olarak Cache'leme işlemini yapmamızı sağlar.Burada bu yöntemi kullanmadığımızdan null değerini verip geçtik.Dördüncü parametremizde Cache'leme yöntemizi belirtiyoruz.Beşinci parametremiz de ise nesnemizin tutulma,ertelenme süresini veriyoruz.
Absolute Expiration :Bu yöntemde ise belirlediğimiz süre dolduğunda nesnemizin bellekten kaldırılmasını sağlar.Aşağıdaki kodlar üzerinden konuşacak olursak sayfamıza talepde bulunulduğunda veritabanımızdaki bilgilerimiz dt isimli DataTable nesnemize doldurulacaktır.Daha sonra Insert metodu ile nesnemizi Cache'leyeceğiz.Fakat burada Sliding'e göre farklı bir tanımlama yapacağız.Absolute tanımlı Cache'lemede insert metodunda belirttiğimiz süre dolduğunda belleğimizin üzerinde Cache'lenen nesne kalkacaktır.Sliding gibi Cache olduğu süre içersinde talep geldiğinde zamanın uzatılması gibi bir yapı söz konusun değildir Absolute Exprition tanımla Cache'lemede.Aşağıdaki örneğimize bakacak olursak sayfamız yüklendiğinde dt isimli nesnemiz yaratılacak ve belirtmiş olduğumuz süre 30 saniye olduğundan süre dolduğunda belleğimizden kalkacaktır.Bu süreden sonra tekrar eğer talep gelirse sayfamıza nesnemiz yeniden yaratılarak belleğimiz üzerine Cache'lenecektir.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
public partial class AbsoluteExpiration : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Cache["ogrencilerAbsoulute"] == null)
{
SqlConnection con = new SqlConnection("data source=.; initial catalog=OKUL; integrated security=true");
SqlDataAdapter da = new SqlDataAdapter("select * from ogrenciler", con);
DataTable dt = new DataTable();
da.Fill(dt);
Cache.Insert("ogrencilerAbsoulute", dt, null, DateTime.Now.AddSeconds(30), System.Web.Caching.Cache.NoSlidingExpiration);
Response.Write("Veriler belleğe çıkarılıp cache aktarıldı");
}
else
Response.Write("Veriler Cache'den çağırıldı");
GridView1.DataSource = Cache["ogrencilerAbsoulute"];
GridView1.DataBind();
Response.Write("<br/>");
Response.Write(DateTime.Now.ToLongTimeString());
}
}
Cache.Insert("ogrencilerAbsoulute", dt, null, DateTime.Now.AddSeconds(30), System.Web.Caching.Cache.NoSlidingExpiration);
Yukarıda ki satır üzerine konuşmak gerekirse yine her zaman ki gibi Cache'de saklayacağımız verimize bir key veriyoruz.İkinci parametremiz saklayacağımız nesnemiz olmaktadır.Üçüncü parametrenin CacheDependecy tipinden bir değer istemekte olduğunu fakat şimdilik kullanmak istemediğimizden null değerini veriyoruz.Dördüncü parametrede ise nesnemizin bellek üzerinde ne kadar duracağını söylüyoruz.Bu süre dolduğunda bellekten nesnemiz kaldırılacaktır.Son parametremiz de ise Cache'leme yapısını söylüyoruz.
Yukarıda kodumuzu çalıştırdığımızda aşağıdaki gibi kayıtların okunup belleğe çıkartıldığını görüyoruz.
Verilerimiz belleğe 12:46:49'da çıktığından 30 saniye boyunca bellek üzerinde bulunacaktır.30 saniye içinde talepde bulunulduğunda aşağıdaki gibi Cache'den nesnemizin çağırıldığını yeniden nesnenin oluşturulmadığını görmekteyiz.

Fakat bellek üzerine ilk çıktı zaman olan yani 12:46:49 olan nesnemize 30 saniye dolduktan sonra ulaşmak istediğimizde veritabanından gelen kayıtların yeniden nesnemize eklenip oluşan nesnenin bellek üzerinde Cache'lendiğini görüyoruz.Yani nesnemiz yeniden oluşturuluyor çünkü vermiş olduğumuz süre tamamlanıyor.Sliding Expiration'da ki gibi bir erteleme söz konusu değildir Absolute Expiration'da.
Bu Data Cache'leme yöntemleri ile sunucu-ziyaretci arasında işlemlerin daha hızlı olmasını sağlarız.Her kullanıcıya gösterilen belirli nesneleri bu şekilde cache'leyerek her kullanıcıya yeniden oluşturulmadan gösterebiliriz.Tabi ki sayfamız çok hızlı olsun diye de tüm uygulamayı bellek üzerinde cache'lemek bir süre sonra bellek üzerinde uygulamamızın çalışması için ayrılan alanın azalacağından performans kaybına ve çeşitli problemlerle karşılaşma ihtimali ortaya çıkma ihtimalini göz önüne alarak abartıya kaçmadan bu işlemleri yapmalıyız.
Bir sonraki makalede görüşmek üzere :)
Serhat TAŞ