Bu makaleyi okumadan önce Asp.Net Kategorisindeki diğer makalelerimi okumanızı tavsiye ederim.
Caching (önbellekleme) sayesinde elde etmesi uzun sürecek verilere çok daha hızlı bir şekilde ulaşabiliriz.
Hemen yeni bir Asp.Net Core 1.0 MVC 6 projesi oluşturalım ve InMemory Caching ekleyelim.
Öncelikle örnek projeyi oluşturmak istediğimiz dizine Command Prompt (Windows) veya Terminal (MacOS, Linux) içerisinden gidiyoruz ve aşağıdaki kodları çalıştırıyoruz;
yo aspnet // Empty Application seçeneğini seçiyoruz // Projeye inmemorycaching ismini veriyoruz
cd inmemorycaching code .</pre>
Visual Studio Code açıldıktan sonra project.json dosyasını açıyor ve içindeki dependencies kısmına aşağıdaki satırı ekliyoruz;
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final"
Böylece Empty Application tipindeki AspNet Core uygulamamıza MVC 6 paketini kullanacağımızı söylemiş olduk. Fakat paket henüz projemizin olduğu dizine indirilmedi. Bunun için Command Prompt (Windows) veya Terminal (MacOS, Linux) içerisinde aşağıdaki kodu çalıştırıyoruz;
dnu restore
Artık Startup.cs dosyasını açabilir ve projemizde Mvc kullanmaya başlayabiliriz. Öncelikle ConfigureServices() methodu içerisinde uygulamamıza Mvc‘yi tanıtıyoruz;
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); }
Bu noktada Configure() methodu içerisinde Mvc‘yi kullanabilir, yapılandırabiliriz;
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}" ); });
AspNet Core 1.0 üzerinde geliştirdiğimiz projemizde artık MVC 6 yapılandırıldı.
İlk action methodumuzu yazmak için projenin olduğu dizinde Controllers dizini oluşturalım. Bunun için aşağıdaki komutları Command Prompt (Windows) veya Terminal (MacOS, Linux) içerisinde çalıştırabiliriz;
mkdir Controllers
Visual Studio Code editörüne dönerek Controllers dizininde HomeController.cs dosyasını oluşturuyoruz ve içerisine Index() methodunu aşağıdaki gibi yazıyoruz;
using Microsoft.AspNet.Mvc; namespace inmemorycaching.Controllers { public class HomeController : Controller { public string Index() { return ""; } } }
Bu noktaya kadar http://localhost:5000 adresine girdiğimizde boş bir sayfa ile karşılaşacağımız uygulamayı hazırladık.
project.json dosyasını açalım ve dependencies kısmına aşağıdaki paketi ekleyelim;
"Microsoft.Extensions.Caching.Memory": "1.0.0-rc1-final"
Command Prompt (Windows) veya Terminal (MacOS, Linux) içerisinde aşağıdaki kodu çalıştıralım;
dnu restore
Artık projemizde caching (önbellekleme) yapabiliriz. Öncelikle Startup.cs dosyasını tekrar açalım ve ConfigureServices() methodunun içini aşağıdaki gibi değiştirelim;
services.AddCaching().AddMvc();
Şimdi HomeController.cs dosyasını açıp aşağıdaki şekilde güncelleyebiliriz;
public class HomeController : Controller { private IMemoryCache cache; public HomeController(IMemoryCache _cache) { cache = _cache; } public string Index() { var start = DateTime.Now; IEnumerable<int> rakamlar; if(!cache.TryGetValue("Rakamlar", out rakamlar)) { rakamlar = Enumerable.Range(1, 10000); cache.Set("Rakamlar", rakamlar); } return $"10.000 öğeli listenin elde edilme süresi : {(DateTime.Now - start).TotalMilliseconds} ms."; } }
Öncelikle HomeController sınıfı içinde IMemoryCache tipinde cache değişkenini tanımladık.
using kısmına Microsoft.Extensions.Caching.Memory namespace’ini eklemeyi unutmamalıyız.
HomeController sınıfının constructor‘ında IMemoryCache tipinde bir parametre aldık ve cache değişkeninde sakladık.
Index() action methodunda içerisinde 10.000 adet rakam saklayacağımız değişkenimizi tanımlıyoruz.
cache değişkeninin TryGetValue() methodu aracılığı ile liste değişkenini cache‘teki liste ile doldurmaya çalışıyoruz.
Eğer dolduramazsak, cache‘e 10.000 rakamlı değişkeni ekliyoruz.
Index() action method’unun başında ve sonunda aldığımız iki zaman değişkeni aracılığı ile arada geçen zamanı hesaplıyoruz ve ekranda gösteriyoruz.
http://localhost:5000 adresine ilk ziyaretimizde 10.000 elemanlı diziye yaklaşık 6 saniye içerisinde ulaşabildiğimizi görüyoruz.
Takip eden ziyaretlerimizde ise 0 milisaniye içerisinde aynı diziye ulaşabiliyoruz;
IMemoryCache interface‘inde tanımlı olan Set() methodu ile cache‘e eklediğimiz nesnenin belli bir süre sonra otomatik olarak cache‘ten silinmesini istiyorsak, MemoryCacheEntryOptions sınıfından yeni bir instance çıkartıp, SetAbsoluteExpiration() methoduna istediğimiz süreyi TimeSpan tipinde vermeliyiz;
cache.Set("Rakamlar", rakamlar, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(30)));
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484