Redis Nedir ? Nasıl Kullanılır ?

Merhaba arkadaşlar bugün zaman çok ağır geçiyor o zaman bize çok hızlı ve performansı yüksek bir konu lazım deyip Redise sarıldım, Redis için başlıca konulara değinip ardından temel kod satırı veri ekleme çekme silme işlemlerine bakacağız.

Peki kim bu Redis ? nerelerde yaşar, ne içer, geçimini nasıl sağlar, en çok neyden hoşlanırlar, üremeleri nasıl gerçekleşir sorularımıza cevaplar arayalım.

Redis NoSQL veri tabanlarından inmemory olarak çalışan (key-value) bir veri tabanı sistemidir deyip kısaca kim olduğu hakkında küçük bi ipucu verelim peki sadece inmemory mi çalışır diye sorarsanız o zaman hayır cevabını alırsınız çünkü Redis aynı zamanda verilerinizi diskte saklamanıza da olanak sağlar böylelikle istediğiniz zaman verilerinize diskten ulaşabilir veri kaybı yaşamadan işlemlerinizi gerçekleştirebilirsiniz. Redis STRING, HASH, SET, SORTED SET ve LIST gibi veri türlerini destekler.

C, C#, C++, Clojure, Common Lisp, D, Dart, emacs lisp, Erlang, Fancy, Go, Haskell, haXe, Io, Java, Lua, Node.js, Objective-C, Perl, PHP, Pure Data, Python, Ruby, Scala, Scheme, Smalltalk, Tcl. Gibi yazılım dilleri de Redisi destekleyince gittikçe Redis tadına doyulmaz bir hal almaya başladı. Redis resmi olarak Linux ortamında çalışan bir veri tabanı olsa da windows ortamlarda community olarak versiyonu biraz geriden gelse de çalıştırılıyor. Aynı zamanda Azure desteği de bulunmaktadır.

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.
  • Son derece aktif bir kullanıcı kitlesine sahiptir.
  • 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.
  • Komplex sorgular için sorgu yapacaksanız, Redis yapısını düzgün kurgulamalısınız.
  • Bir transaction hata alırsa geri dönüşü yoktur.

 

Veri Modelleri

Redis’in diğer NoSQL bilgi bankalarından en önemli farklarından birisi, yalnızca String’ler ile sınırlı olmamasıdır. String’lere ek olarak Redis, aşağıdaki veri tiplerini de desteklemektedir:

  • Listeler (List)
  • Setler (Sets)
  • Sıralı Setler (Sorted Sets)
  • Komut Çizelgeleri (Hash Tables)
  • Atomik İşlemler (Atomic Transactions)

Redis tek birim olarak maksimum 512 MB veriyi saklayabilmektedir.

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.

Redis aynı zamanda yayınla/abone ol (publish / subscribe) özelliğini de tam olarak desteklemektedir. Bu sayede bir slave’in istemcisi bir kanala abone olup, master’a yayınlanan tüm mesajları alabilir.

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öntemde ise RAM’de tutulan veri setleri diskte de tutulur. İstenirse bu iki yöntem de devre dışı bırakılabilir. Bir başka seçenek de master yerine slave üzerinden kalıcılığı sağlayarak master üzerindeki yükü hafifletmektir.

Güvenlik

Redis, güvenli istemcilerin güvenli ortamlarda Redis’e erişimi üzerinde tasarlanmıştır. Bu, Redis durumunun (instance) internete direkt olarak açılmasının veya bir başka deyişle güvenilmeyen istemcilerin direkt olarak Redis TCP portuna veya UNIX soketine erişmesinin iyi bir fikir olmayacağı anlamına gelmektedir.

Redis, erişim kontrolü (Access Control) protokolünü implemente etmezken, küçük bir kimlik doğrulama katmanı sağlamaktadır. Kimlik doğrulama katmanı aktif hale getirildiğinde Redis, kimlik doğrulamasından geçemeyen hiçbir istemciyi kabul etmez. İstemci “AUTH” komutunun arkasından sunduğu şifre ile kimlik doğrulama yapar. Şifre, sistem yöneticisi tarafından belirlenir ve “Redis.conf” dosyasında açık metin olarak tutulur. Şifrenin kaba kuvvet (brute force) saldırılarına karşı dayanabilecek kadar uzun ve karmaşık olması gerekmektedir. Bu koruma yöntemi, güvenlik duvarı gibi önlemler çökecek olursa, istemcilerin direkt olarak erişmesine mani olmak için kullanılır. Yani, birinci dereceden bir güvenlik önlemi değildir.

Redis, veri şifrelemesini desteklememektedir. Bu yüzden, sadece güvenli istemcilerin veya güvenilen tarafların Redis’e erişimini sağlamak için, SSL gibi ek güvenlik katmanları implemente edilmelidir.

Redis’te bazı spesifik komutlar devre dışı bırakılabilir veya bu komutların isimleri tahmin edilemeyecek şekilde değiştirilebilir.

Genel olarak denilebilir ki Redis, maksimum güvenlik için değil, maksimum performans ve basitlik üzerine tasarlanmıştır.

Evet Redis çok hızlı peki neden bu kadar hızlı diye sorarsanız o zaman bunu bir örnekle cevaplamak sanırım daha açıklayıcı olur. Bu durumda size Pipelining özelliğinden bahsedeceğiz;

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.

Redis Kurulumu ve Kullanımı

Kurulum için yapmanız gereken tek ey ” https://github.com/MSOpenTech/redis/releases ” adresinden kurulum dosyasını indirmek, ardından ilk olarak redis-server.exe programını çalıştırıp Redis serverı aktif hale getireceksiniz bu işlemi yaptıktan sonra aynı klasör içindeki redis-cli.exe eklentisini çalıştırdığınız zaman da artık Redis veri tabanı sistemini kullanabilir veri tabanlarınızı oluşturabilirsiniz, redisin default veri tabanı oluşturma sayısı 16 adettir siz bunu bazı değişikliklerle arttırabilirsiniz fakat ben yeterli olacağını düşünüyorum.

İnsert, Select, Update, Delete ve Temel işlemleri

Kullanımı çok basit demiştik demediysek de şimdi demiş olalım insert işlemi için SET komutunu kullanmanız yeterli “SET keyadi değer” şeklinde yazıp enter dediğiniz zaman SET komutundan sonra ilk kelimeniz key ikinci kelimeniz ise bu keye atadığınız value olacaktır

INSERT(SET-MSET) ve SELECT(GET-MGET)

set

yukerda da gördüğünüz üzere onay aldığınız zaman verinizin eklendiğini anlarsınız.

Eklediğimiz verileri görmek için ise GET komutunu kullanmak yeterli olur “GET anahtaradi” o anahtarımızın içindeki veriyi bize döndürecektir.

get

Peki her seferinde tek anahtar tek değer girmek istemiyorsanız sürekl SET yazmaktan bıktım diyorsanız o zaman yardımınıza MSET(Multiset) komutu yetişecektir. o zaman sırasıyla ilk kelime key ikincisi value olarak varsayıp arada boşluklarla veri girişinizi yapabilirsiniz örneğin;

mset

Böylece tek MSET komutu ile dört key ve bu keylerin value girişlerini yapmış olduk

set dedikten sonra verileri görmek için get kullandığımıza göre MSET için de MGET kullanmamız mantıklı olmaz mıydı sizce ? o zaman bakalım Redis programcıları bizden çok mu daha komplex düşünmüş;

mget

Evet bizi yormamayı tercih etmişler. Görüldüğü üzere MGET komutundan sonra görmek istediğimiz key isimlerrini yazmamız yeterli oluyor.

UPDATE(SET)

Hadiii amaa yanlış veri girdik ben bir de Update işlemi ile mi uğraşıcam yaa nasıl yazılıyor ki bu Update işlemi dediğinizi duyar gibi değilim ama muhtemelen düşünmüşsünüzdür. O zaman biraz daha kurcalayalım da bozalım tüm veri tabanını bakalım nerde tutturucaz derken aslında işlemin çok basit olduğunu öğrenmek çok utandırırdı bizi çünkü Update işlemi için hangi anahtarın içindeki değeri değiştirmek istiyorsak yine SET komutu ile anahtarımızın adını ve yeni değerimizi yazmamız yeterli olacaktır ve evet bu kadar basit.

update.JPG

Şekilde gösterdiğine göre artık içimiz rahatlamış olmalı kolaylıkla Update işlemlerimizi yapalım artık o zaman.

RENAME

Her veri tabanı sisteminde olduğu için Redis modayı bozmamak adına olmalı ki ihtiyacımız olur diye hani biz hep fikir değiştiren anlık tercihler yapan insanlar olduğumuz için Anahtarımızın adını değiştirmek istediğimiz zaman kullanım için RENAME komutunu bize sunmuş bunun için RENAME yazdıktan sonra adını değiştirmek istediğimiz anahtarımızı ve ardından vermek istediğimiz yeni anahtar adını yazmamız yeterli olacaktır.

rename

DELETE(DEL)

Delete işlemi de gayet basit bir şekilde sadece DEL komutunun ardından silmek istediğimiz anahtar adını yazarak yapabileceğimiz bir işlem; aşağıda işlem yapılmış ve arama sonucunda dönen (nil) ifadesi SQL de olan null gibi böyle bir anahtarın olmadığını belirtiyor.

del

LİSTE(LPUSH-RPUSH)

O zaman liste tanımlamak istediğimizde ne yapmamız gerekiyor diye bir bakalım çünkü benim canım tek bir anahtara birden fazla değer girmek istedi yok öyle bir anahtar bir değer deyip yan gelip yatmak işveren olmanın gerekliliğini yerine getirip az besleyip çok yüklenelim bunun için iki  komutumuz var biri LPUSH bu komut ile ekleyeceğiniz veri listenin ilk verisi olur yani baştan ekler RPUSH ise listenize sondan ekleme yapar veriniz listenin sonuna eklenir. Listemizdeki verileri listelemek için de LRANGE komutunu kullanmak yeterli olacaktır tabi bir liste olduğu için listemizin başlangıç değeri ve bitiş değerini belirtip bu sıradaki verileri görmek istiyorum diye de belirtelim ki anahtar dedik köle değil. Örnek;

liste

LPOP-RPOP

Dediler ki bir yerde PUSH varsa POP da olur o zaman deneyelim dedik baktık ve gerçekten varmış o zaman yapalım ve ne işe yarıyor görelim diye de atladık hemen, öğrendik ama iki adet verimizi de kaybettik çünkü LPOP yazdığımız zaman listemizin en başındaki elemanı RPOP yazdığımız zaman da listemizin en sonundaki elemanı çıkarıyor neyse ki PUSH ile veri eklemeyi biliyoruz. Örneğin;

pop

LSET

Normal Update işlemimizi yapmıştık peki listeye bir Update işlemini nasıl yaparız diye sorarsak cevap aşağıda duruyor. LSET komutu ile hangi anahtardaki kaçıncı indexi hangi değerle değiştirmek istediğimizi belirtmemiz yeterli oluyor.

lset