Redis, key-value şeklinde tasarlanmış bir open-source NoSQL çözümüdür. Key-value olarak veri tutmaya muhtemelen C# geliştiricisiyseniz Dictionary’den, Java geliştiricisiyseniz de Map’ten aşinasınızdır. Ancak redisi farklı kılan bazı özellikleri var. Örneğin, rediste key’e karşılık gelen valuelerin string olma gibi bir zorunluluğu yoktur. Redis Lists, hash ve sets gibi veri tiplerini destekler. Redis hakkındaki bir diğer önemli konu ise verileri memory’de tutuyor olmasıdır. Redis dataları öncelikli olarak kendi koştuğu makinanın RAM’inde tutar. Bunun dışında redis ile istenilirse RAM’de tutulan veriler disk’e de yazılabilir.
Neden böyle bir yapıya ihtiyaç duyarız ?
Aslında sql yapıları CPU kullanarak işlem yaptığı için bizim gibi big datalarla çalıştığınızda CPU ya yük bindiriyorsunuz, redis gibi yapılar bu yükü azaltmaya yardımcı olmakla beraber hız konusunda ciddi performans artışları sağlıyor.
Herşeyi bellekte tuttuğunu söyledik. Bu durumda insanın aklına hemen çok fazla bellek kullanabileceği geliyor. Redis, hiç bir veri barındırmazken bellekte sadece 1 mb yer kaplıyor. Eğer siz basit bir key-value eşlemesi, örneğin <String,String> şeklinde bir eşleme, tutmak isterseniz, bir milyon adedi bellekte sadece 100 mb yer kaplıyor. Ben bu kadar basit veriler tutmayacağım benim verilerim daha karmaşık derseniz, <Hash, Obj> şeklindeki verilerin (burada value alanındaki nesnemizin 5 kırılımı olduğunu varsayıyoruz) bir milyon adedi ise bellekte sadece 200mb yer kaplıyor.
Redis verileri Ramde tutmasıyla Memcache’e benzer bir yapı sunabilir. Ancak aralarında önemli farklar vardır. Memcached, veriyi bellekte tutar ama bu veriyi dosyaya yazmaz sadece bellekte tutar. Server kapandığı zaman memcached de tutulan datalar silinir ancak Redisde yukarıda da bahsettiğim gibi, istediğiniz takdirde verileri diske yazabilirsiniz. Memcachce ile sadece veri girişi ve çıkışı yapabilir, datayı set eder sonra get ile okursunuz ama Redis, veri yapıları kullandığı için bir çok fonksiyonu destekler.
Avantajları
- Senkron çalıştığı için son derece hızlıdır.
- Birçok veri türünü destekler.
- Veriyi hem RAM üzerine hem de ayarlandığınız konfigürasyona göre disk üzerine kaydedebilir.
- Disk üzerine kayıt yaptığı için restart sonrasında aynı verilerle çalışmaya devam eder.
- Sharding, Cluster, Sentinel, Replication gibi birçok enterprise özelliklere sahiptir
Dezavantajları
- Asenkron çalışmadığı için tek instance üzerinde, asenkron alternatiflerin eriştiği performansa erişemeyebilirsiniz.
- Veri boyutunuza göre RAM’e ihtiyacınız olur.
- Relational veritabanlarında olduğu gibi komplex sorguları desteklemez.
- Bir transaction hata alırsa geri dönüşü yoktur.
Kopyalama (Replication)
Redis, yalnızca master-slave kopyalamasını desteklemektedir. Herhangi bir master Redis sunucusu, kendinde bulunan veri güncellendiği anda master sunucuya bağlı olan N kadar slave sunucuda da güncelleme yapar. Bir slave, diğer slave’ler için master durumunda olabilir. Böylece bir çizge (graph) yapısı oluşturulabilmektedir. Ancak, kopyalama yaparken gerekli RAM alanı yüzünden replikasyonla ilgili bazı tartışmalar vardır.
Veri Kalıcılığı (Persistence)
Bilgisayar bilimlerinde “veri kalıcılığı”; verinin, oluşturulduğu işlemden sonra da tutulması özelliğidir. Böyle bir özellik olmasaydı, veri sadece RAM’de bulunabilirdi ve bilgisayarın kapanması gibi RAM’in güç kaybına uğradığı durumlarda kaybolurdu.
Redis normalde tüm veri setlerini RAM’de tutmaktadır. Kalıcılığı sağlamak için ise 2 yöntem kullanılmaktadır.
- “Snapshotting” adı verilen birinci yöntemde, belirli zamanlarla snapshot’lar alınır ve bunlar diskte saklanır.
- Diğer yöntem ise Append only modedur her bir redis commandi loglanır.
- Bir başka seçenek de master yerine slave üzerinden kalıcılığı sağlayarak master üzerindeki yükü hafifletmektir.
Pipelining
Diyelim ki cafede garson olarak çalışıyorsunuz ve kalabalık bir arkadaş grubu gelip masaya oturdu hep beraber sipariş verdiler 10 çay 5 kola 8 soda 3 pasta derken düğün menüsü çıktı, her bir müşterinin siparişi için tekrar tekrar mutfağa gitmeniz epey bir zaman ve performans kaybı olacağından tüm siparişleri büyük bir servis masasına koyup götürdükten sonra mutfağa tek gidişle tüm siparişleri almış ve masalara dağıtmış olursunuz işte Redis tam olarak bunu yapıyor Pipelining özelliği ile istediğiniz verilerin tamamını tek bir masaya(Pipe) koyup tek seferde size getirdiği için aynı işlem için defalarca getir götür yapmadan hızlıca işlemlerinizi gerçekleştiriyor aynı zamanda performans açısından da çok iyi bir avantaj sağlıyor.
Ama gelin görün ki Redis de diğer NoSQL veri tabanı sistemleri gibi karmaşık sorgulara cevap vermekten kaçınıyor yani relation dblerde bana pazar günü şu saatler arasında kola isteyen müşterilerimin bana ne kadar kazandırdığını getir bana derseniz buna cevap alamazsınız,
Bana pazar günü siparişlerini getir.
Bana şu saatler arasındaki siparişleri getir.
Bana kola olan siparişleri getir.
Bana kazancı getir.
şeklinde teker teker talepte bulunmak gerekiyor.
Peki Redis genel olarak nerelerde kullanılır ?
Redis’i konfigrasyonunuza göre birçok yerde kullanabilirsiniz. Benim en çok gördüğüm çalışma alanları;
- Sayaçlar
- Oturum (Session) verileri
- Önbellek (Cache) sistemi
- Analiz verileri
- Kuyruk işlemleri