MVC 6’da Cache Tag Helper

Selamlar;

Önceki yazılarımda Tag Helper üzerine bolca konuşmuştuk. Bu yazıda da Tag Helper ile Cache yapısı üzerine konuşacağız.

İlk olarak aşağıda görüldüğü gibi Asp.Net 5.0 Web Site projesi yaratılır. Daha sonra Index.cshtml ve PrintTime adında Partial bir View oluşturulur.

WebSite

HomeController: Index Action’ında Time ve Text dönen bir Data model yaratılıp, Index view’a gönderilir. Ayrıca PrintTime adında partial view dönen action da yine aşağıdaki gibi tanımlanır.

Aşağıda görüldüğü gibi  Index.cshtml’e ilgili PrintTime Partial View ‘ı konulmuştur.

PrintTime.cshtml: O anki tarih ve saati saniyeye kadar basan bir partial viewdır.

Ekran Çıktısı: Aşağıda görüldüğü gibi sayfa her yenilendiğinde güncelleme zamanı değişmektedir.

Screen

Şimdi sıra geldi ilgili partial view’ı tag helper kullanarak Cachelemeye. İlgili content cachelenme sırasında MemoryCache’e atılır. Eğer içerik cachede bulunursa cachelenmiş içerik Razor’a gönderilir. Bulunmaz ise içerik memory cache’e alınır. Tamamen server side çalışan bir yapıdır. Örneğin aşağıda PrintTime partial view’ı 10 dakika boyunca Index.cshtml’e cacheden verileceği için zaman değeri 10 dakika boyunca ekrana hep aynı gelir. Yani cache’in timeout süresi 10 dakikadır.

Projede Taghelper’ın kullanılabilmesi için alttaki packet’in nugetden indirilmesi gerekir. Ayrıca gözden kaçan bir bug olduğunu düşündüğüm Memory Cache’in MVC 6 beta 4’de çalışabilmesi için aşağıdaki kodun Startup.cs’deki ConfigureServices() methodunun sonuna eklenmesi gerekmektedir.

services.AddSingleton<IMemoryCache, MemoryCache>();

tag

Index view’ın başına alttaki tanımlama yapıldıktan sonra ilgili Cache Tag Helper sayfa içinde kullanılabilir.

Farklı cachleme tipleri bulunmaktadır.

1-)Cache Expiry: Eğer cache için herhangi bir süre belirtilmez ise content uygulama çalıştığı sürece memory’de tutulur. Bu da tabiki istenmeyen bir durumdur. Bunun için kullanabileceğimiz 3 farklı sonlanma yöntemi bulunmaktadır.

  • expires-after: Burada belirtilen süre aşıldıktan sonra ilgili content tekrardan memory cache’e atılır. Örneğin bu süre aşağıda 6 sn dir. TimeSpan türünde bir değer bekler.

  • expires-on: Burada tam belirtilen sürede  ilgili cache’in süresi dolar. DateTime türünde bir değer bekler.

  • expires-sliding: Burada belirtilen süreye gelinmeden cache’in süresi dolar ve ilgili içerik belirtilen süreden önce memory cache’e alınır. Timespan türünde bir değer bekler.

2-)Vary-by / Complex Cache Keys : Cacheleme işleminin çeşitli durumlara göre koşul gösterilerek yapılması sağalanır.

  • vary-by-user: Burada login olmuş kullanıcıya göre cacheleme işleminin yapılması sağlanır. Cache key olarak login olmuş kişinin username’i kullanılır. Dönüş tipi olarak boolen beklemektedir.

  • vary-by-route: Burada url’de kullanılan parametre ve değeri cache için key olarak kullanılır. Örneğin aşağıda id parametresi ve değerler için cache oluşur. Yani id parametresinin sadece değeri değil aynı zamanda kendisininde değişmesi durumunda cache yenilenir. Virgül ile yanyana birden çok route cache amaçlı tanımlanabilir.

HomeController: Aşağıdaki gibi id parametresi için değiştirilir.

  • vary-by-query: Burada url’deki belirtilen herbir parametre değeri için ayrı ayrı cache oluşur. En populeri de budur. Örneğin http://localhost:25502/Home/Index?id=8 için ekrana basılan zaman ile http://localhost:25502/Home/Index?id=9 için ekrana basılan zaman değerleri farklıdır. Her iki parametre değeri için farklı cache oluşur. Virgül ile yanyana farklı queryler cache key amaçlı tanımlanabilir.

  • vary-by-cookie: Burada belirtilen cookie’nin değeri değiştiği zaman herbir değişen değer için farklı cache oluşur. Virgül ile farklı cookieler yanyana cache key amaçlı tanımlanabilir.

  • vary-by-header: Burada cache request çekilen header’daki değere bağlıdır. Örneğin aşağıda header’daki User-Agent’a göre cache farklılık göstermekte ve böylece ekrana basılan zaman bilgisi değişmektedir.

  • vary-by: Burada belirtilen string değere göre cache farklılık gösterir. Kısaca cache’in bağlı olduğu durum bir değişkene atanmıştır. Örneğin aşağıda cache ViewBagdeki bir Message bağlanmıştır.

3-)Complex Keys: Burada cache belirlenen birden çok vary-by durumu için değişkenlik gösterir. Yani cache için birden fazla sayıdaki vary-by parametresi ile composite key oluşturulur. Mesela aşağıda header bilgisi ve query bilgilerine bakılarak cache’in yenilenip yenilenmiyeceğine bakılınır.

Cache Priority: Cache’de tutulan content IMemoryCache’de sunucudaki memory kapasitesi ile sınırlıdır. Eğer işlemler sırasında out of memory durumu olur ise belirlenen cache priority’sine göre memory temizlenir. Örneğin aşağıda Low olarak tanımlanan memory en önce temizlenecek content’i barındırmaktadır. Öncelikler düşükten en yüksek öneme göre Low, Normal, High ve NeverRemove şeklinde tanımlanmaktadır.

CacheTagHelper IMemoryCach’i kullanmkatadır. Cache server’ın restart veya shutdown olması durumunda içindeki tüm content’i kaybeder. Ayrıca IIS App Pool’un restart’ı veya Azure üzerinde yapılacak bir scale işlemi memory cache’i resetler. Bu durumda CacheTagHelper bir sonraki request’de tekrardan ilgili content’i cache  memory’e atar. Azure üzerinde bu durum çok daha tehlikelidir. Çünkü website’ınızın yeni bir sunucuya ne zaman geçirileceğini hiçbir zaman bilemezsiniz. Yeni sunucuya geçiş işleminde cache yeniden resetlenir. MemoryCache bu durumlar nedeni ile çok da stabil ve uzun ömürlü değildir. Bu nedenle önemli datalar için tercih edilmemelidir. Bir önemli noktada multiple load balance işlemlerinde MemoryCache dağtık olarak çalışamaz. Her server’ın kendine özgü memory cache’i olmak zorundadır.

Sonuç olarak cache tag helper MVC 6 ile gelen kullanımı sonderece rahat olan bir helperdır. Cache işlemlerinin vaz geçilmez bir parçası olarak büyük bir performance sağlayan önümüzdeki dönemlerde bolca kullanılacak yapılardan biridir.

Yeni bir makalede görüşmek üzere hoşçakalın.

 

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. hasan dedi ki:

    peki hocam zamanı bitmeden cache i drop etmek istersem nasıl yapabilirim.
    istediğim partial i drop etmek istesem
    yada bir sayfadaki tüm partialların cache ini drop etmek istesem

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir