Ana sayfa › Forumlar › PROGRAMLAMA › ASP.NET › asp.net caching
- Bu konu 0 yanıt içerir, 1 izleyen vardır ve en son 12 yıl 8 ay önce özgür tarafından güncellenmiştir.
-
YazarYazılar
-
21 Nisan 2012: 08:18 #12593özgürİzleyici
teknolojisinde önbellekleme (bundan sonra ?caching? olarak anılacaktır ) çok önemli olduğu kadar hassas bir konudur da. En küçükten en büyüğe hemen tüm uygulamalarda tasarımcılar ve ürün geliştiriciler birçok önemli kavramı gözönünde bulundurarak çalışmak zorundalar. Bunlar;
Performans: Caching teknikleri genel olarak uygulama performansını arttırmak için kullanılabilir. Örneğin herhangi bir verinin istemciye her seferinde yeniden yaratılıp gönderilmesindense o verinin istemciye olabildiğince yakın ve yeniden yaratılmasına gerek kalmadan tutulması performansı arttıran özelliklerden biridir.
Ölçeklenebilirlik: Aynı verinin, iş fonksiyonlarının ya da kullanıcı arabirimindeki bazı parçaların uygulamaların içinde birden fazla yerde aynı anda kullanılması çok muhtemel bir durumdur. Bu tür her isteğin gerçekleşmesi için aynı verinin devamlı devamlı işlenmesi kaynakların doğru kullanılmaması demektir. Bunun yerine istenen sonuçların bir yerde tutulup her istekte gönderilmesi özellikle sunucu kaynaklarının aynı işlemler için sabit kullanımını sağlar.
Kullanılabilirlik: Sık olmasını istemesek de bazı durumlarda uygulamalarınıza veri sağlayan servisler o an kullanılabilir (availability) olamayabilir.Bu durumda verinizi başka bir yerde ayrıca tutmak uygulamanızın karşılaşacağı bazı problemleri çözebilir.
Çok iyi bir caching uygulaması için elbette .NET framework?ünün ve Windows işletim sistemlerinin bazı özelliklerinin iyi bilinmesi gerekiyor. Bunun için MS Akademik?in ilgili bölümlerini referans olarak kullanabilirsiniz. Elbette hassas bir iş olduğunu söylediğimiz caching ?i başarılı bir biçimde gerçekleştirmek için bazı sorulara doğru cevapları vermemiz gerekiyor.
Örneğin;
· Ne zaman ve neden bir önbellekleme yapmalıyım?
· Hangi önbellekleme tekniği elimdeki konfigürasyonla en iyi performansı ve ölçeklenebilirliği sağlar?
· Hangi önbellekleme tekniği istemcilerimin güvenlik, izlenebilirlik, ve yönetim, vs gibi ihtiyaçlarını karşılayabilir?
· Önbellekleme yaptığım veri nasıl güncel kalabilir?
Bu arada unutulmaması gereken başka birşey de; caching?in her istediğiniz an uygulamanızın bir yerine kolaylıkla sonradan ekleyebileceğiniz birşey olmadığı gerçeğidir. Tasarım aşamasında uygulamanızın önbellekleme teknikleriyle çalışıp çalışmayacağına karar vermeli ve ona göre ilerlemelisiniz.
Sık kullanılan verilerin hafızada tutulması aslında ASP kullanıcıları için pek yeni bir kavram değil. ASPciler Session ve Application objeleri sayesinde bazı verileri tutabiliyorlardı. Ancak ASP.NET?te karşımıza yepyeni bir obje çıkıyor; Cache. Cache objesine HttpContext (System.Web) sınıfının ya da Page objesinin Cache özelliğini kullanarak da referans verebilirsiniz Ötesinde UserControl class?ının Cache özelliğini kullanarak cache?lenmiş bir bilgiye de ulaşabilirsiniz. Bu sizin direkt olarak bir UserControl?deki cache bilgisine ihtiyacınız olduğu anda çok faydalı olmaktadır.
Dependency and Expiration Kavramları
Acemice ?Bağımlılık? ve ?Sona Erme? olarak Türkçe?ye çevirebileceğim bu iki kavram ASP.NET Cache mantığında önemli yere sahipler. Eğer herhangi bir bilgiyi cache?e ekledinizse aynı bilginin belli bazı şartlar altında cache?ten silinmesini isteyebilirsiniz. Bu birkaç şekilde olabilir;
File Dependency (Dosyaya Bağımlılık):
Örneğin;
Sizin cache içindeki herhangi bir bilgiyi, diskteki herhangi bir dosyanın değişmesi neticesinde geçersiz hale getirmenizi sağlar. Aşağıdaki örnek bir bilgiyi cache?e aktarırken File Dependency kavramının nasıl kullanıldığını göstermektedir.
CacheDependency cDependency = new CacheDependency(Server.MapPath(“books.xml”));
Cache.Insert(“CachedItem”, item, cDependency);
Key Dependency (Diğer Nesneye Bağımlılık): Cachelenmiş herhangi bir bilginizin hükümsüz hale gelmesi bazen başka bir cachelenmiş bilginin değişmesi sayesinde olabilir. Örneğin herhangi iki sayının toplamının cachelenmiş sonucu eğer toplanan sayılar değişirse değişmelidir.
// Yeni bir cache yarat
Cache[“key1”] = “Value1”;
// Key2?yi Key1?e bağımlı yap
String[] dependencyKey = new String[1];
dependencyKey[0] = “key1”;
CacheDependency dependency = new CacheDependency(null, dependencyKey);
Cache.Insert(“key2”, “Value 2”, dependency);
Time-Base Expiration (Zamana Bağlı Sonlanma):
Cache?lenmiş herhangi bir verinin belli bir zamanda sonlanmasını sağlar. Mutlak bir değer verilerek -absoulte expiration- yapılabileceği gibi (1 Kasım 2003 Saat: 18:00?de), cache?lenmiş bilgiye ulaşıldıktan belli bir zaman -sliding expiration- sonraya da yapılabilir.
// Absolute (Mutlak) Expiration
Cache.Insert(“CachedItem”, item, null, DateTime.Now.AddSeconds(5), Cache.NoSlidingExpiration);
// Sliding (Göreli) Expiration
Cache.Insert(“CachedItem”, item, null,
Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(5));
Herhangi bir cache objesinin süresini (ömrünü) çok kısa tutmak onun faydasızlaşmasına neden olabilir. Ancak tam tersi çok uzun tutmak da eski, bayat diyebileceğimiz (stale data) verilerin oluşmasına neden olmaktadır. Ayrıca sunucu kaynaklarına da ciddi bir yük getirmektedir. Eğer yukarıda anlattığımız mekanizmaları kullanmıyorsanız (Dependency, vs) cache sürelerinizi sayfalarınızdaki verilerinizin güncellenme aralıklarından daha kısa tutmanızda fayda vardır. Genellikle sayfalarınızda geçmiş tarihli bir veri görüyorsanız bu cache sürenizin uzun olduğu anlamına gelir.
Cachelenmiş bir veriye ulaşmanız için öncelikle aradığınız verinin cache?in içinde olup olmadığını kontrol etmelisiniz. Çünkü ASP.NET daha öncede anlattığımız gibi zaman ve bağımlılık esaslarına göre cache?leri geçersiz hale getirebileceği için, sizin -eğer cache?in içinde artık aradığınız veri yoksa- cache?i yaratmak ya da geri çağırmak için kod yazmanız gerekmektedir. Aşağıdaki basit örnek bunun nasıl yapılacağını göstermektedir.
string Data = (string)Cache[“MyItem”];
if (data == null)
{
data = GetData();
Cache.Insert(“MyItem”, data);
}
DoSomeThingWithData(data);
Öncelikle cache?deki verinizin geçerli olup olmadığını kontrol edin, bu sayede eski bilgilerle çalışmak gibi bir riski de azaltmış olursunuz.Ayrıca yukarıdaki metodu kullanırken şunu da lütfen aklınızdan çıkarmayın; Sistemimin mimarisi dahilinde cache?lenmiş veriyi onaylamak mı daha az maliyetli, yoksa bu veriyi yeniden üretmek – başka yerden elde etmek mi? Bu tür soruları sisteminizin tasarımını yaparken sormanız sizin uzun süre çok az değişiklik yaparak çok performanslı bir uygulamaya sahip olmanızı sağlar. Eğer zamana bağlı caching yapıyorsanız daha önce de dediğimiz gibi tanımlanmış zaman geldiğinde cache?deki bilgileriniz geçersiz hale gelecektir. Bunu, ?belli zaman aralıklarıyla cache?i güncelle? özelliğini kullanarak aşabilirsiniz.
Cache Geri Çağırma (Callbacks)
Cache?lemiş olduğunuz verinin cache?den silinmesi halinde otomatik olarak callback (geri çağırma) metodu çalıştırabilirsiniz. Bunu cache?lemiş olduğunuz verinin güncellenmiş olmasından emin olmak ya da en azından o anda orada olduğunu bilmek için yapabilirsiniz.. Aşağıdaki kod bu tür bir uygulama için basit olsa da kullanışlı bir örnektir;
CacheItemRemoveCallback onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
Cache.Insert(“CachedItem”, item, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriorty.Default, onRemove);
// Cache sonlanma durumuna gelince çalışacak olan fonksiyon
public void RemovedCallback(string key, object value, CachedItemRemovedReason r)
{
// Cache?deki verinin geçersiz hale gelip gelmediğini kontrol et, yeniden Cache?e ekle
if (r == CacheItemRemovedReason.expired)
{
// Yeniden Cache?e ekle
CacheItemRemovedCallback onRemove = null;
onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
Cache.Insert(key, value, null, Cache.NoAbsoluteExpiration, NoSlidingExpiration, CacheItemPriority.Default, onRemove);
}
}
Cache?lenmiş Verilere Öncelik Vermek
Bildiğiniz gibi ASP.NET sunucu hafızasını ASP?den daha fazla kullanan, ona daha çok ihtiyaç duyan bir mimariye sahip. Ancak aynı zamanda hafızayı çok daha optimize kullanması için de kendine has özellikleri var. Özellikle büyük uygulamalarda karşılaştığımız sorunlardan biri de kodu yazan kişilerin performansı arttırması için çok fazla Cache yöntemini kullanması sonucu hafıza kaynaklarının düşmesi. Bu durumda ASP.NET hafızayı güvenilir çalışma seviyelerine geri döndürmek için otomatik olarak cache?lenmiş olan verileri silmeye başlar. Bu işleme scavenging (Çöp karıştırmak, işe yarayan şeyleri bulmak) denmektedir. Bu işlem sırasında ASP.NET cache?deki her veriye bakar ve öncelik sırasına göre silmeye başlar. Bu noktada eğer sizin için çok önemli olan bir veriyi cache?te tutuyorsanız ve silinecekse bile en son silinmesi gerektiğine inanıyorsanız bunu priority özelliği ile ayarlayabilirsiniz. Bkz. Callback (Geri Çağırma) örneği.
Cache?leri Temizlemek
Direkt olarak ASP.NET?in içinde otomatik output cache temizleme, geçersizleştirme desteği bulunmamakta. Ancak bunu daha önce anlattığımız Dependency ve Expiration yöntemleri sayesinde düzenleyebilirsiniz. Örneğin aşağıdaki kod satırı çalıştırıldığı anda ASP.NET output cache bilgilerini siler;
Response.Cache.SetExpires(DateTime.Now)
Yukarıdaki kod output cache?ini temizlese de orijinal cache süresi bitmediği için sayfa bundan etkilenmez. Mesela aşağıdaki kodu kullanırsanız, cache bilgileri 10 saniye sonra sıfırlanır.
<%@ OutputCache Duration = "10" VaryByParam = "none" %>
Caching hakkındaki yazılarımız detaylı bir şekilde devam edecek. Gelecek yazılarımızda çok daha detaylı işleyeceğimiz caching kavramı sayesinde uygulamalarınızın performansının artacağına emin olabilirsiniz.
-
YazarYazılar
- Bu konuyu yanıtlamak için giriş yapmış olmalısınız.