Memory Cache Yöntemi, Artıları ve Eksileri 1

Merhabalar,

Bu yazıda Microsoft’un sunmuş olduğu cache, yani ön bellek mekanizmasını ele alacağım. Aslına bakarsanız bu uygulama elbette ram’de epey yer kaplayabiliyor. Ancak eksi yönünün bu olmasına rağmen artıları da yok değil. Bu yazıyı temel anlamda 2’ye bölerek ilerlemek istedim. Bu 1. makalede genel cache mekanizmasına bakacağız. Daha sonra hazırlayacağım 2. makalede ise detay bilgileri vermeye çalışacağım. Gelin şimdi birlikte bakalım.

MemoryCache Artıları:

  • Sabit kimi verileriniz için sürekli veri kaynağına (Database) gitmek zorunda kalmazsınız.
  • Verileriniz RAM’de tutulduğu için hiçbir SQL/NoSQL connector’ün veremediği okuma hızı avantajına sahip olursunuz.

MemoryCache Eksileri:

  • Tutulacak verinin boyutuna göre sunucu belleğinda (RAM) yer ayrılır ve bu bilgiler bu alanda time out olana veya temizlenene kadar (Clear) tutulur. Bu da RAM’de sürekli bir yer işgali olarak karşımıza çıkar.
  • Bilgiler anlık canlı değildir, en son cache’leme (önbellekleme) ne zaman yapıldı ise o ana ait veriler yer alır. Dolayısı ile buradaki bilgileri EndUser görüyor ise, siz değiştirmiş olsanız bile belleği yeni verilerle tazeleyene kadar EndUser (Son kullanıcı) cache’deki eski verileri görmeye devam edecektir.
  • Belleklemenin zaman alabilmesi. Tabii ki bu tuttuğunuz verinin boyutuna göre değişir. Ancak eğer bulk (toplu) olarak bir veri tutuyorsanız ilk ön bellekleme anı biraz uzun sürebilir.
  • Eğer Microsoft MemoryCache kullanıyor iseniz sadece dikey genişleme mümkündür, yatay genişleyebilir bir yapınız yoktur. Bunu sağlayabilmek için Redis gibi bir cache sistemine ihtiyacınız olacaktır.

Evet göründüğü gibi artıları rakamsal olarak eksilerinden az. Ancak artıları şöyle bir ele alacak olursanız kesinlikle vazgeçilebilir artılar olmadığını da görebilirsiniz.

Peki biz genel olarak nerede cache mekanizmasını kullanma gereği duyarız? Elbette realtime online görünmesi zorunlu olmayan yerler. Örneğin en başta multi language (Çoklu dil) bir platform inşa ediyorsak burada Resources’lar için cache mekanizması son derece önemlilik arzedebilir.

Evet bu kadar artı ve eksilerini inceledikten sonra gelin şimdi de basit bir class oluşturup buradan yola çıkarak 1-2 örnekle de sınıfımızı kullanalım ve işlemimizi tamamlayalım.

Öncelikle sistemimizde memoryCache sınıfı “System.Runtime.Caching” sınıfından türediği için referansımızı ekliyor ve using’imizi yazıyoruz.


using System.Runtime.Caching;

Daha sonra aşağıdaki gibi bir sınıf oluşturarak işlemimize başlayabiliriz.


public class CacheService
{

protected ObjectCache Cache
{
get
{
return MemoryCache.Default;
}
}

public virtual T Get<T>(string key)
{
return (T)Cache[key];
}

public virtual void Set(string key, object data, int cacheTime)
{
if (data == null)
return;

var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
Cache.Add(new CacheItem(key, data), policy);
}

}

İlk konumuz şu ki; Eğer bir veriyi cache’de tutmak istiyor isek, ona benzersiz (unique) bir string değer (Örn. “KULLANICI-DIL-BILGILERI”) vermeliyiz. Ki daha sonra yine bu string değer (value) ile bu datayı RAM’den kolayca çekebiliriz.

Ayrıca burada Yer alan cacheTime sayısını vererek memory’nin default olarak ne zaman clear olacağını ve tüm önbelleği boşaltacağını da ayarlamış oluyoruz.

İstersek aşağıdaki “TimeSpan.FromMinutes()” kısmını “FromHours, FromDays” gibi astronomik değerlerle de değiştirebiliriz. Ancak şunu unutmayın ki, burada belirttiğiniz süre boyunca sisteminiz hiç kullanılmasa bile RAM işgaliniz devam edecektir.


policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);

Aslında temel iki metodumuzla istediğimiz nesneyi ram’e atmış bulunuyoruz.

Şimdi bir örnek yaparak Set ve Get işlemlerini hızlıca inceleyelim.


public void DilleriEkle()
{
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
keyValuePairs.Add("name", "Adı");
keyValuePairs.Add("surname", "Soyadı");
keyValuePairs.Add("phone", "Telefon Numarası");
keyValuePairs.Add("fax", "Faks Numarası");

Set("TUM-DIL-VERILERI", keyValuePairs, 60);
}

İşte bu örneğimizde basit bir Dictionary nesnesi oluşturup manuel verdiğimiz dil değerlerini içerisinde tutmasını istedik ve sonrasında Unique (Benzersiz) adı “TUM-DIL-VERILERI” olan bir cache alanı açarak burada Dictionary<> tipindeki değişkenimizi tutmasını istedik.

Şimdi gelelim buradaki değerleri geri çağırmaya;


public void DilleriGetir()
{
var result = Get<Dictionary<string, string>>("TUM-DIL-VERILERI");
}

İşte burada da tipinin Dictionary<string, string> olduğunu bildiğim “TUM-DIL-VERILERI” unique kodlu bellekteki verileri “result” değişkenine çekmek üzere talep gönderiyorum.

Artık bellekteki tüm verilerim result değişkenimin içerisinde mevcut. İstediğim gibi çekebilirim.

 

Bir önemli not: Linq her ne kadar yeri geldiğinde hayat kurtarsa bile, unutmayın ki performans açısından .net içerisindeki en kötü koşullardan bir tanesidir. Bu nedenle mümkün olduğunca memoryCache ile tutacağınız verilerinizde farklı cache isimleri ile satırlarınızı ayrı ayrı cache’lemeye çalışın. Zira bir cache string’i ile tutacağınız binlerce kayıtı her seferinde toplu olarak tek isimle geri çağırıp, içerisinde linq ile dönmek sisteminizi hızlandırayım derken performans kaybetmenize de yol açabilir.

Umarım işinize yarar bir makale olmuştur.

İkinci makalede görüşmek üzere 🙂

Share this Story

Related Posts

2
Kimler Neler Demiş?

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
edomurcukRecep Kahraman Recent comment authors
  Subscribe  
En Yeniler Eskiler Beğenilenler
Bildir
Recep Kahraman
Ziyaretçi
Recep Kahraman

Hocam ellerinize sağlık işe yarar bir makale olmuş. 2. aşamasını da dört gözle bekliyoruz…

Search