Redis; Süper Hızlı Bir Veritabanı ve CSharp

Yazılım dünyasında Nosql veritabanları artık yaygın bir şekilde kullanılmaya başlandı. MongoDB, Cassandra, Couchdb ve ravendb vs. Redis bu veritabanları arasında özellikle olağanüstü performansı sayesinde öne çıkmaktadır.

Redis temel olarak bir key-value store’dır. Key değerine ek olarak başka veri yapılarını da desteklemektedir: hash, list, set, sortedset. Redis, in-memory yani ram üzerinde çalışan bir veri tabanıdır. Performanslı çalışmasının ana nedenlerinden birisi de budur. Belli aralıklarla diske verileri kaydetmektedir. Veri kaydetme aralığı ile ilgili farklı senaryoları da desteklemektedir. MongoDb ile karşılaştırmak gerekirse, MongoDb verileri disk’e yazar, sql bazlı diğer veritabanları gibi (mysql, oracle vs).

Bu yüzden Redis cache veritabanı olarak kullanılabilir. Bazı firmalar, Redis’i tamamen veritabanı amacıyla da kullanmaktadır. Ram’da veya sistemde bir çökme olması durumunda, veri kaybı meydana gelebilir. Birkaç saniye aralıklarla diske yazdığı için arada bir yerde, çökme meydana gelirse, veri kaybı oluşacaktır.

Kurulum

Redis server, windows’ta resmi olarak desteklenmiyor. Fakat, windows ortamında stabil çalışan bir sürümü var ve linuxtaki performansına yakın bir performans sağlamaktadır. Microsoft Open Tech grubu, bu sürümünün geliştirmesini yapıyor. https://github.com/MSOpenTech/redis/releases linkinden msi uzantılı dosyayı indirip kurabilirsiniz. Bu şekilde windows servisi olarak kurmuş oluruz.

Doğru çalışıp çalışmadığını görmek için, komut satırı penceresinden redis-cli.exe’i (redis command line interface) çalıştıralım. Path içerisine eklenmemişse, C:\Program Files\Redis dizinine cd ile gidip, redis-cli komutunu çalıştıralım. ping komutunu girince, pong karşılığını almış olmamız gerekiyor. Bu şekilde karşılık alıyorsak her şey yolunda, servis düzgün bir şekilde çalışıyor demektir.

rediscli

redis-cli üzerinden redis komutlarını çalıştırabiliriz. Örneğin, basitçe set-get komutlarını çalıştıralım:

admin key’ine mehmet değerini atadım.

komutu ile key değerini okumuş olurum.

rediscligetset

Bu şekilde veritabanı üzerinde sorgulamalarımızı yapabiliriz. Bir başka yöntemde, Redis desktop manager uygulamasını kullanmak.

redisdesktopmanager

Örnek Uygulama

Şimdide basit bir client uygulaması yazacağım. Visual Studio 2015 community edition ile geliştirmemi yapacağım. Basit tutmak için yeni bir console uygulaması oluşturuyorum.

C#’te veritabanında işlem yapmak için bir kaç tane client kütüphanesi var. Benim kullanacağım kütüphane, StackExchange.Redis.

Package Manager Console üzerinden aşağıdaki komutu çalıştıralım:

Programda ekstra olarak json serializer kullanacağımız için, newtonsoft.json’u da kuralım:

Kodumuzu yazalım:

F5 deyip çalıştırınca, bize admin’in değerini dönecektir. Değer set etmek için ise benzer şekilde, db.StringSet metodunu kullanabiliriz.

Akla şöyle bir soruda gelebilir. Basit veri yapılarını kaydedebiliyoruz. Fakat c# nesnelerimizi nasıl kaydedebiliriz? Bunu yapmanın en basit yöntemi, serialize edip kaydetmek. Daha performanslı yöntemleri de olabilir, fakat json’a serialize edip o şekilde kaydetmek en kolay olanı.

Person isimli bir sınıfımız olduğunu düşünelim.

Key olarak, “person:1” değerini set ediyoruz. Bu şekilde yapılması bir convention. Id’si bir olan person’u kaydetmiş oluyoruz. F5 deyip çalıştırıp, Redis Desktop Manager’dan bakalım:

redisdmperson

İlgili objeyi tekrar okumak içinse aşağıdaki kodu yazabiliriz:

 

1 düşünce - “Redis; Süper Hızlı Bir Veritabanı ve CSharp”

  1. Redis çok hızlı olmasına karşın, json seriliaze ve deseriliaze işlemleri veri tabanından daha ağır kalıyor. Şöyle ki, big data vs. çalışıyorsanız seriliaze işlemi sırasında outofmemory exception ını almanız kaçınılmaz. Keza deseriliaze işlemi sırasında da aynı durum yaşanıyor. Yani büyük bir liste koyamıyorsunuz. Diyelim bir şekilde koydunuz, sunucunuzun ram i yüksek vs. O zamanda şöyle bir probleminiz oluyor ; Deseriliaze işlemi 2 – 2.5 saniyeyi bulabiliyor. Bu çok büyük bir zaman kaybı. Şöyle düşünün, Liste olarak hızlı olsun diye Redis ile veri tutuyorsunuz, ancak arama yapmak istediğinizde önce tüm listeyi çekip sonra arama yapmanız gerekiyor. Id verip 1 ini çekmek istediğinizde de 2 saniye bekliyorsunuz, tüm listeyi çekince de. Bu tabi saf getirme süresi. Gelen veri üzerinde son kullanıcıya göstermeden önce ayrı bir ViewModel e dönüştürmek filan isterseniz, süre 3 – 4 saniyeyi bulabiliyor. Redis harika bir çözüm olsa da, doğrudan obje ve liste tutmadığı için, seriliaze deseriliaze işlemlerine muhtaç olduğu için, big datalarda pek işe yaradığını söyleyemeyiz.

Yorum Gönder

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

Scroll to Top