Redis, geliştiriciler tarafından en çok kullanılan ve bilinen NoSQL veritabanlarından birisidir. Redis, açık kaynaktır ve kaynak kodlarına GitHub üzerinden erişilebilmektedir. C dili ile yazıldığı için yüksek performanslı sonuçlar vermektedir. Linux ve türevi işletim sistemleri tarafından desteklenmekte fakat Windows tarafı için resmi bir destek olmasa da community tarafından desteklenmektedir.
Redis günümüz sistemlerinde en çok kullanılan anahtar-değer veritabanıdır ve genellikle caching, session yönetimi, pub/sub, message broker amacıyla kullanılmaktadır.
Redis’in Avantajları
Yüksek Performans
Redis, verileri disklerde (HDD veya SSD) tutan veri tabanlarının akside bellek (RAM) üzerinde tutar bu sayede disklere erişim ihtiyacını ortadan kaldırarak gecikmeleri, I/O bağlantılarını önler ve daha az CPU kullanan basit algoritmalar ile verilere erişir.
In-Memory Veri Yapıları
Redis verileri bellek üzerinde <key,value> çifti olarak tutmaktadır, burada herbir anahtara denk gelen değerler farklı veri yapılarında tutulabilmektedir. Bu veri yapıları; String, List, Hash, Set, Sorted Set, Bitmaps, HyperLogLogs, Geospatial Indexes
Redis kullanılarak neredeyse her türlü veri bellekte saklanabilir.
Replication
Redis, master-slave mimarisini kullanır, master genel olarak yazma işlemlerini yapar ve slave dediğimiz yapılar da master’in birer kopyasıdır, master güncellendikçe ona bağlı bütün slave’ler de güncellenir. Burada master’da oluşacak herhangi bir çökmede, hatada direkt bir slave master olarak seçilir ve sistem çalışmaya devam eder.
Persistance (Veri Kalıcılığı)
Redis’te verilerin RAM üzerinde saklandığından bahsettik, olası bir elektrik kesintisi, sunucu kapanması gibi durumlarda veriler silinecektir. Redis bize iki yöntem sunmaktadır verinin kalıcılığını sağlamak için. Bunlar; point-in-time Snapshots ve Append Only File (AOF).
Snapshots yönteminde belirli zaman aralıkları ile RAM üzerindeki verinin kaydı, kopyası diske kayıt edilir bu sayede olası bir elektrik kesintisi gibi durumlarda disk üzerinden verilere tekrar geri dönülebilir.
Append Only File yönteminde ise her değişikliği dosyanın sonuna yazarak oluşan veri değişikliklerinin kaydını tutar.
Çoklu Dil Desteği
Redis birçok dil tarafından desteklenmektedir, bunlar; Java, Python, PHP, C, C ++, C #, JavaScript, Node.js, Ruby, R, Go gibi dillerdir ve bunların yanı sıra daha fazla da dil bulunmaktadır.
Redis’in Bazı Kullanım Senaryoları
Caching (Önbellek) Mekanizması
Sıkça kullanılan verilerimizi sürekli veritabanına ya da diğer kaynaklara gidip çağırmak yerine ön belleğe almak performans açısından olumlu bir katkı sağlayacaktır. Dağıtık mimaride çalışabilen Redis, dağıtık cache(distributed caching) yönetimi için birçok uygulamada kullanılmaktadır.
Session Yönetimi
Uygulamalarımızı kullanırken kullanıcılara ya da diğer yapılara ait verilerimizi sayfalar arasında taşımak için session’dan sıkça yararlanmaktayız fakat uygulamamız büyüdükçe bu verilerin tutulması artan bellek alanına neden olmaktadır. Redis; sosyal medya, e-ticaret uygulamaları, oyun gibi alanlarda session bilgilerinin tutulmasında da rol almaktadır.
Pub/Sub
Redis, pub/sub işlevini destekleyen komutlara da sahiptir ve Redis’in broadcast yayını yapmasına olanak sağlar. Bu, mesajı tek bir istemcinin bir kanala bağlı diğer birçok istemciye yayınlamasına olanak tanır.
Queues (Kuyruklar)
Redis, gerçekleşmesi zaman alacak işleri bir kuyruk yapısına alınmasını ve daha sonradan işlenmesini destekler.
Birçok Veri Türü
Redis, birçok farklı veri türünü sunabilen bir NoSQL veritabanı çözümüdür ayrıca bu veri türlerinden en iyi şekilde yararlanmak için ihtiyacınız olan komutları da sağlar. Aşağıda Redis’e ait bazı veri türlerini ve bu türlere ait temel terminal komutlarını görebilirsiniz.
Strings
Verilerin string formatı olarak tutulduğu veri yapısıdır. <key,value> çiftinde değer kısmı maksimum 512 MB yer tutar.
String veri ekleme komutu:SET <key> <value>
127.0.0.1:6379> SET firstName Yusuf OK
Anahtar değeri ile string veriyi alma komutu:GET <key>
127.0.0.1:6379> GET firstName "Yusuf"
Değerin sonuna string ekleme komutumuz:APPEND <key> <text>
127.0.0.1:6379> APPEND firstName " Yilmaz" (integer) 12 127.0.0.1:6379> GET firstName "Yusuf Yilmaz"
Bütün anahtar değerlerini çağırma komutu:KEYS *
127.0.0.1:6379> KEYS * 1) "firstName"
Anahtar değeri ile veri silme komutu:DEL <key>
127.0.0.1:6379> DEL firstName (integer) 1
Bütün verileri silme komutu:FLUSHALL
127.0.0.1:6379> FLUSHALL OK
Yukarıdaki komutlarda her ne kadar string işlemleri yapsak da sayılsa bir değeri string gibi tutup üzerinde matematiksel işlemler de gerçekleştirebiliriz.
Sayısal değeri bir artırma komutu:INCR <key>
127.0.0.1:6379> SET age 22 OK 127.0.0.1:6379> INCR age (integer) 23
Yukarıdaki INCR komutu ile değer bir artırıldı. Bunun yanı sıra DECR
, DECRBY
, INCRBY
gibi komutlar ile de artırım ya da azaltım işlemleri yapılabilmektedir.
Oluşturulacak değere yaşam süresi ekleme komutu:SETEX <key> <expire_time> <value>
127.0.0.1:6379> SETEX lastName 20 Yilmaz OK 127.0.0.1:6379> TTL lastName (integer) 19
TTL
komutu verilen anahtar değerin süresinin bitmesine kaç saniye kaldığını söyler, verilen expire_time
değeri saniye cinsindendir.
Lists
Burada veriler bağlı liste biçiminde tutulurlar. Bu listede, liste başını ifade etmek için L, liste sonunu ifade etmek için de R kullanılır.
Listenin başına eleman ekleme komutu:LPUSH <key> <value>
127.0.0.1:6379> LPUSH postList "Dependency Injection ve Ninject" (integer) 1
Listenin sonuna eleman ekleme komutu:RPUSH <key> <value>
127.0.0.1:6379> RPUSH postList "Aspect Oriented Programming" (integer) 2
Listenin eleman sayısını öğrenme komutu:LLEN <key>
127.0.0.1:6379> LLEN postList (integer) 2
Listenin başından eleman silme komutu:LPOP <key>
127.0.0.1:6379> LPOP postList "Dependency Injection ve Ninject"
Listenin sonundan eleman silme komutu:RPOP <key>
127.0.0.1:6379> RPOP postList "Aspect Oriented Programming"
Listede belirli aralıktaki verileri alma komutu:LRANGE <key> <start_index> <stop_index>
127.0.0.1:6379> LRANGE postList 0 2 1) "Fluent Validation" 2) "Dependency Injection ve Ninject" 3) "Aspect Oriented Programming"
Liste üzerindeki eleman sayısını bilmediğimiz durumlarda start_index
değerine 0 stop_index
değerine -1 verirsek bütün verileri elde edebiliriz.
Sets
Set veri tipi, verileri sırasız (rastgele sırada eklenilen) ve unique (benzersiz) olarak tutan veri tipidir. Aynı veriden birden fazla bulunmamaktadır.
Set’e eleman ekleme komutu:SADD <key> <value>
127.0.0.1:6379> SADD friends Halit (integer) 1
Set içerisinden eleman silme komutu:SREM <key> <value>
127.0.0.1:6379> SREM friends Halit (integer) 1
Set içerisindeki bütün elemanları getirme komutu:SMEMBERS <key>
127.0.0.1:6379> SMEMBERS friends 1) "Arafat" 2) "Halit"
Sorted Sets
Sorted Set veri yapısı, Set veri yapısının benzerdir. Verileri unique (benzersiz) olarak tutmakla beraber score
dediğimiz değere göre sıralama işlemi yapmaktadır.
Sorted Set’e eleman ekleme komutu:ZADD <key> <score> <value>
127.0.0.1:6379> ZADD teams 100 "Besiktas" (integer) 1
Sorted Set içerisinden eleman silme komutu:ZREM <key> <value>
127.0.0.1:6379> ZREM teams Besiktas (integer) 1
Sorted Set içerisindeki belirli aralıktaki verileri alma komutu:ZRANGE <key> <start_index> <stop_index>
127.0.0.1:6379> ZRANGE teams 0 1 1) "Fenerbahce" 2) "Galatasaray"
Sorted Set üzerindeki eleman sayısını bilmediğimiz durumlarda start_index
değerine 0 stop_index
değerine -1 verirsek bütün verileri elde edebiliriz. Komutun sonuna WITHSCORES
yazılarak score değerleri ile birlikte veriler elde edilmiş olur.
Hashes
Hash veri tipi, bir key’e karşılık birden fazla field (alan tutmaya) yarayan veri tipidir.
Hash’e eleman ekleme komutu:HSET <key> <field> <value>
127.0.0.1:6379> HSET person firstName Yusuf (integer) 1
Hash içerisinden belirli alanı getirme komutu:HGET <key> <field>
127.0.0.1:6379> HGET person firstName "Yusuf"
Hash içerisinden belirli alanı silme komutu:HDEL <key> <field>
127.0.0.1:6379> HDEL person firstName (integer) 1
Hash içerisindeki bütün alanı getirme komutu:HGETALL <key>
127.0.0.1:6379> HGETALL person 1) "firstName" 2) "Yusuf" 3) "lastName" 4) "Yilmaz" 5) "age" 6) "22"
Bu yazının sonuna geldik. Buraya kadar temel olarak Redis’in ne olduğunu, kullanım alanlarını, veri yapılarını ve bu veri yapılarına ait temel cli komutlarını gördük.