Distributed Cache ile .Net Core Web API Response Caching
Herkese merhaba,
Son zamanlarda üzerinde oldukça uğraş verdiğim ve her noktasını özenle hazırladığım bir API projesi mevcut. Bu projeyi yakın zamanda bir makale serisi halinde sizlerle paylaşmayı düşünüyorum. Şimdilik projede cache mekanizması için kullandığım DistributedCache ile OkObjectResult sonuçları nasıl cache’leyebiliriz ona bakalım. Projemize başlamadan önce bilgisayarımızda Redis kurulu olmalıdır.
Öncelikle nedir bu Distributed Cache?
Distributed cache sisteminden 1–2 cümleyle önemli noktalarını bahsetmek bu makale için yeterli olacaktır. Distributed cache’in avantajlarından birisi, birden fazla sunucunun aynı verileri kullanabiliyor olması. Ayrıca sunuculardan herhangi biri down olursa önbellek verilerine zarar gelmemesi de diğer önemli özelliği diyebilirim. Yeni sunucu eklemek ya da farklı işlemlerde önbellek verileriniz sıkıntısız bir şekilde ulaşılabilir olmaya devam edecektir. Daha detaylı bilgi için aşağıdaki makaleden faydalanabilirsiniz.
Peki Redis?
Redis en kısa tabir ile; verileri bellekte tutan, açık kaynak bir NoSQL veri tabanıdır. Verileri bellekte tutmanın yanı sıra isteğe bağlı olarak verileri belirlenmiş zaman araklıklarıyla diske yazabilme imkanını da geliştiricilere sunmakta. Facebook, Twitter, Pinterest, Instagram gibi birçok büyük firma canlı ortamda cache mekanizması olarak Redis’i tercih etmektedir. Daha detaylı bilgi için aşağıdaki linke tıklayarak makaleyi okuyabilirsiniz.
Yeterince konuştuk şimdi işin en zevkli kısmı olan kod yazma bölümüne geçelim. Öncelikle boş bir API projesi açıp adına RedisNetApi diyelim.
dotnet new webapi -o RedisNetApi
API projemizi açtığımıza göre geriye tek bir ana ihtiyacımız kalıyor. Redis. Buradan Windows için Redis sürümünü indirebilirsiniz. Ayrıca buradaki Github reposunda kurulum için gerekli yönergeleri okuyup uygulayabilirsiniz.
Ben okumam bana sen anlat diyenler için kısaca kurulumu özetleyeyim. İndirdiğiniz redis-latest adlı zip dosyasını Winrar ya da başka bir arşiv uygulaması ile klasöre çıkarın. Ardından çıkardığınız klasörü kaybolmayacak bir lokasyona taşıyın. Klasörün içine girdiğinizde redis-server.exe isminde bir uygulama olduğunu göreceksiniz. Buna çift tıklayın veeeee bu kadar Redis sunucumuz artık kullanıma hazır :)
Eğer “ Creating Server TCP listening socket *:6379: bind: No error” hatasını alırsanız. Komut satırını açın redis-cli yazdıktan sonra shutdown komutunu çalıştırın ve ardından exit diyerek kapatın. Sorununuz çözülecektir. Her şey düzgün gittiyse aşağıdaki ekran görüntüsünü görmeniz gerekiyor.
İlk iş olarak projemize StackExchange.Redis ve Microsoft.Extensions.Caching.StackExchangeRedis. paketlerini yükleyelim. Ardından Startup.cs sınıfına giderek ConfigureServices metotuna aşağıdaki kodu ekleyelim.
services.AddStackExchangeRedisCache(option =>
{
option.Configuration = “localhost:6379”;
}
Güzel, artık devam edebiliriz. Asp.Net Core projelerinde Distributed cache özelliğini kullanabilmek için built-in olarak gelen ve Microsoft.Extensions.Caching namespace’i altında bulunan IDistributedCache içerisinde yer alan, cache CRUD işlemlerimizi yapmamıza olanak tanıyan metotlar mevcut. Bu paketi ayrıca nuget üzerinden de projenize ekleyebilirsiniz.
Son olarak bir factory interface’i ve sınıfı yaratalım. Burada gelen objeyi IDistributedCache metotlarına uygun hale getirerek cache’leme işlemimizi kodlayalım. Projenin ana dizinine Caching adında bir klasör açarak içerisine IResponseCacheFactory adında bir interface ve ResponseCacheFactory adında bir sınıf ekledim.
Artık tüm hazırlıklarımızı yaptık. Asıl aksiyonun olduğu bölüme geçiş yapabiliriz :)
Projenin ana dizinine Attributes isminde bir klasör oluşturup içerisine CachedAttribute isminde bir sınıf oluşturdum.Buradaki kodların her birinin üstüne yorum satırlarıyla ne işe yaradıklarını ve neden kullanıldığımızı belirtecek yorum satırlarını ekledim.
Yeni bir .Net Core Web API projesi açtığınızda varsayılan gelen controller içerisindeki metotda kodumuzun düzgün çalışabilmesi için gerekli düzenlemeleri yaparak Cached attribute’unu metotun üstüne tanımladım.
Projeyi debug ettiğinizde ilk istek sonrasında diğer tüm cevapları cache’lenmiş veriyi kullanarak gönderdiğini göreceksiniz.Projenin tüm kodlarına buradaki Github reposundan ulaşabilirsiniz.
Çok fazla makale yazmadığımdan dolayı gereksiz bilgi verip makaleyi uzatmış ve yazım hatası yapmış olabilirim. Kusura bakmayın :) Aslında yaptığımız işlem toplamda 3–5 adımdan ibaret. Bu makaleyi daha fazla uzatmadan bitiriyorum. Herhangi bir sorunuz ya da aklınıza takılan bir kod olursa, “orası öyle mi yazılır ya?” dediğiniz yerler olursa Twitter üzerinden iletişime geçebilirsiniz :) İyi kodlamalar.