.Net 6.0 ve Redis ile Cache Yönetimi

Merhaba, bu gönderide .net 6.0 ve redis ile cache yönetiminin nasıl yapılacağını örnek bir proje yaparak inceleyeceğiz ve redisle ilgili genel bilgilere bakacağız. Projenin linkine en aşağıdan ulaşabilirsiniz.

Redis Nedir?

Anahtar – Değer (Key-value) şeklindeki verileri sunucunun belleğinde (ram) tutan no-sql veritabanıdır.

Kullanım Alanları

Session Yönetimi, Pub/Sub, Önbellek (Cache) yönetimi, Rabbitmq benzeri kuyruk yönetimi (Rabbitmq için gönderi)

Adımlar
Redis Kurulumu

Redis ilk başlarda sadece linux üzerinde çalışsa da daha sonra ihtiyaçlar doğrultusunda windows sürümüne de çıktı. Şu link üzerinde redisi indirebilirsiniz İndirdikten sonra 64bit klasörü içerisindeki redis-server.exe‘yi çift tıklayıp redisi çalıştırın. Redis artık kullanılabilir durumda redis-cli.exe ile redisi test edebiliriz.

Redis Client

Rediste string, list, hashes gibi bazı tipler var. Üstteki örnek string içindi. list ve hash içinde ayrıca yazalım.

ilk satırda yazdığımız hmset komutu (hash multiset) json gibi string objelerini mapleyerek atama işlemi yapıyor. user:1 ise keyimiz oluyor

InMemoryCache

Bu yöntem ile veriler sadece host edilen web sunucunun belleğinde tutulur ve verilerinize sadece host ettiğiniz uygulama erişebilir ayrıca sunucunuz kapandığında ya da yeniden başladığında veriler silinir. Uygulamanın tek sunucuda olduğu durumlar için ideal bir çözümdür.

Distributed Caching

Birden çok uygulamanın erişebileceği bir yöntemdir. Redis gibi bir veritabanında veriler saklanır sunucu kapandığında veriler silinmez. Verilere kolayca erişmeden dolayı bakımı kolay olur. Session gibi ortak cacheler tutulabilir. Çok sunuculu uygulamalar için idela çözümdür.

docs.microsoft.com’dan alınmıştır
.Net Entagrasyonu

.Net 6.0 Web api projesi açara redisin kullanımına bakacağız.

Redis ile ilgili nugette birçok paket var StackExchange.Redis en çok tercih edilen paketlerden aşağıdaki komut ile paketi yükleyelim

Install-Package StackExchange.Redis

appsettings.json dosyasına redisin bağlantı bilgilerini ekleyelim.

Default port 6379 olduğu için belirtmeye gerek yok.

Program.cs aşağıdaki eklemeleri yapalım

Services klasörü oluşturalım ve ICacheService Ekleyelim

GetOrAdd fonksiyonu ile cache’den veri çektiğimizde veri null ise aynı zamanda set işlemini de yapıyoruz böylece kod tekrarı yapmıyoruz.

RedisCacheService adından bir class oluşturup ICacheService’den miras alalım.

Bu servisde en çok kullanacağımız GetorAdd() fonksiyonu ana işlemlerimizi nerdeyse tek işlemde yapıyor.
Ayrıca 1 gün olarak da expire süresi de belirledik bu süre bitince key silinecek.

Cache değerini serilize ederken JsonSerializer.SerializeToUtf8Bytes kullanırsanız türkçe karekterler unicode olarak kaydedilir Serialize() de ise türkçe karakterleri parse edip kaydeder.

ICacheService’in bağımlılığını ekleyelim

CacheController ekliyip bir endpoint üzerinden redise veri atıp çekelim

CacheRequestModel.cs

Swagger ya da postman üzerinden testi gerçekleştirebiliriz. ayrıca yukarıda belirttiğim linkten redis-cli.exe yi de açıp verileri inceleyebiliriz.

Redis Post (body)
Postman Redis Get
Redis-Cli.exe

Şimdi de GetOrAdd fonksiyonumuzu kullanalım. Örneğin bir kategorilerimiz olsun category/getall çağırdığımız zaman önce cache’den almayı deneyecek eğer yoksa sorgumuz çalışacak cache’e ekleyecek ve sorgu dönecek.

Category işlemlerimizi yapacak ICategoryService oluşturalım

CategoryService.cs

GetOrAdd fonksiyonunda iki parametre var ilki keyin ismi (string) diğeri de bir delegate (Func<T>)

CategoryModel.cs

CategoryController ile de endpointimizi oluşturalım

Testimizi yapalım.

Data Consistency (Veri Tutarlılığı)

Verilerde tutarlılığı sağlamak için cache’de tutulan veri değiştiğinde ya direkt güncellemeliyiz ya da keyi silmeliyiz örneğin kategorilere bir ekleme yaptığımız zaman cache’deki veriyi güncellemezsek bir veri tutarsızlığı ortaya çıkar.

Proje linki : github.com/okankrdg/RedisSample

Bu gönderinin sonuna geldik Hoşçakalın 🙂

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Turkish