En basit haliyle Redis, key-value şeklinde tasarlanmış bir NoSQL veritabanıdır. Memcache gibi verileri HDD yazmadan Ram üzerinde tutmaya yarayan bir platformdur. Memcaheden farklı olarak NoSql mantığıyla çalıştığı için serverin kapansa dahi verilerin kaybolmasına izin vermez.
Peki böylebir yapıya neden ihtiyaç duyarız ?
Cevabı basit aslında sql yapıları CPU kullanarak işlem yaptığı için bizim gibi big datalarla çalıştığınızda CPU ya ciddi bir 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, üstelik XML, JSON vb yapılara ihtiyaç duymadan scriptler arası haberleşmeyede fırsat veriyor.
Php, Python, Ruby, Java, C# gibi bir çok yazılım diline sorunsuzca çalışıyor
Günümüzde kullanılan çoğu programlama dillerinde benzer key-value yapılarını bellekte bilgi saklamak için kullanıyoruz. Örneğin Java da Map yapılarında, ya da C#’ta Dictionary yapılarında key-value şeklinde yapılara rastlamak mümkün. Zaten Redis in açılımına baktığımızda da “Remote Dictionary Service” olduğunu görüyoruz.
Peki Redis’i farklı kılan ne? Öncelikle redis çok hızlı. Sitesinde paylaşılan banchmark’lara göre saniyede 100 bin operasyonu yürütebiliyor. Bunu nasıl yapıyor derseniz, sizin çalıştırdığınız tüm operasyonları bellekte çalıştırıyor ve size bellekteki veriyi dönüyor. Tüm veriyi bellekte tuttuğundan bu derece seri çalışabiliyor.
Herşeyi bellekte tuttuğunu söyledik. Bu durumda insanın aklına hemen çok fazla bellek kullanabileceği geliyor. Fakat, redis tek bir iş yapmaya ve bu işi iyi yapmaya odaklanmış. 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 millyon adedi bellekte sadece 100 mb yer kaplıyor. Yok 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.
İnternette, redis ile ilgili araştırma yaparken en çok bu üçünün karşılaştırıldığını gördüm. Okuduğum farklı kaynaklardan çıkardığım sonuçlar aşağıdaki gibi. Çok detayına girmek istemiyorum. Memcached yine sadece bellekte çalışan başka bir key-valie yapısı. MongoDB ise döküman şeklinde veri saklamanıza olanak sağlayan başka bir NoSQL veritabanı.
Python ile kullanımından örnek ;
ilk olarak redis eklentisini çağırmanız gerekiyor
import
redis
redis 6379 portunu kullanır, bizde redisle 6379 portuna bağlanarak işlem yapacağız
Redis
rds
=
redis.StrictRedis(host
=
'localhost'
, port
=
6379
, db
=
0
)
redis key=>value mantığıyla çalışır yani hafızada tutmak istediğiniz veriye bir isim vererek hafızaya atarsınız ihtiyacınız olduğunda o isimle getirirsiniz
set
rds.
set
(
'anahtar'
,
'pythonla ilk redis denemesi'
)
anahtar keyine “pythonla ilk redis denemesi” verisini atadık şimdi bu veriyi geri nasıl alacağımıza bakalım
get
etir
=
rds.get(
'anahtar'
)
print
(getir)
yukarıdaki kodun çıktısı “pythonla ilk redis denemesi” olacaktır,
tamam işim bitti bu veriyi silmek istiyorum.
delete
rds.delete(
'anahtar'
)
redis te sildiğiniz veriler redis-server resetlenince geri geliyor bunun sebebi redisn DB olarak kullanılabilme özelliğinden kaynaklanıyor eğer budurumdan kurtulmak istiyorsanız DB özelliğini paypas etmeniz gerek bunun için redis-cli.exe yi açın ve
flushdb
flushdb
komutunu gönderin, tüm verileri sıfırlamak içinse
expire
rds.
set
(
'key'
=
>
'value'
)
rds.expire(
'key'
,
3
)
aynı ön adla hafızada tutulan verileri getirmekte mümkündür, mesela data_1, data_2, data_… anahtarlarıya verileri tanımladık hepsini bir anda çekmek ve işlemek gerekti o zaman
keys
rds.
set
(
'data_1'
=
>
'value 1'
)
rds.
set
(
'data_2'
=
>
'value 2'
)
rds.
set
(
'data_3'
=
>
'value 3'
)
getir
=
rds.keys(
'data_*'
)
for
gelen
in
getir:
print
(rds.get(gelen))
yukarıdaki kodun çıktısı aşağıdaki gibi olacaktır.
value 1 value 2 value 3