“Redis or Die, Remember? “Ortaya Karışık Yazılım Serisi — 1
Bu yazılım serisi nasıl başladı, nasıl devam edecek ve asıl önemlisi kime hitap edeceği hakkında kısa bir giriş sonrasında konuya giriş yapacağım.
Günümüzde bilgiye ulaşmak kolay bir şey olmasına karşın getirdiği anormal dezavantajlar sayesinde benim gibi yazılımcıların bir kısmı arafa düştü.
Sebebi ise basit “uzmanlaşma sorunsalı”. Şirketler en iyi,en maliyetsiz, en optimize ürünü yapabilmek için bir çok metodoloji ve teknoloji kullanması kadar doğal bir şey yok ama kıt kaynaklar (para, vergi, şirket dokusunun bozulmasını istememesi v.b) gibi sebeplerden dolayı “bir kişi — çok iş” yöntemini izliyorlar buda aslında yazılım geliştiricinin her şeyden biraz biraz biliyorum ama derinlemesine bildiğimi düşünmüyorum durumuna sokuyor (en azından ben). Özellikle bu sabah gördüğüm bir tweet sonrasında bu yazı dizisini başlatma en azından benim gibi yazılımcılara yardımcı olabilecek bir kaynak oluşturma adımını atmak istedim.

Yani bu yazı serisi tam olarak yazılıma yeni giriş yapmış taze mezunlardan ziyade yazılım dünyasında 3+ senedir bulunup (evet maalesef yine tecrübeli ilanı) sağa sola savrulan Army of the Dead üyesi kardeşlerim için! Yine de taze mezun arkadaşlar benim gibi hatalar zincirlerinde boğuşmaması adına yazıdan ders çıkartabilir.
Hızlı giriş — Redis Nedir?
Redis, açık kaynak (BSD lisanslı) kodlu bellek içi veri yapısı depolama aracıdır (in-memory data structure store). Veritabanı, cache mekanizması veya message broker olarak kullanılabilir. Dağıtık bir mimarı olarak kullanabiliyoruz yani master-slave mevzusu burada geçer. Desteklediği veri yapıları; strings, hashes, lists, sets, sorted sets, range queries, bitmaps, hyperloglogs, geospatial indexes ve streams.

Redis Avantajları neler?
- Redis çok hızlıdır ve saniyede yaklaşık 110000 SET, saniyede yaklaşık 81000 GET gerçekleştirebilir.
- İşlemler atomiktir — Tüm Redis işlemleri atomiktir, bu da iki istemcinin aynı anda erişmesi durumunda Redis sunucusunun güncelleştirilmiş değeri almasını sağlar.
- Zengin veri türlerini destekler — Redis, geliştiricilerin list, set, sorted set, ve hashes gibi zaten bildiği veri türlerinin çoğunu destekler.
Daha çok ayrıntılı bilgi almak isteyenler için: https://aws.amazon.com/tr/redis/
Artık başlama zamanı!

Yazının başında dediğim gibi bu biraz daha orta seviye bir yazı olduğu için bodoslamasına girişeceğim yani kurulum vs göstermek gibi bir kaygı gütmeyecek bu yazı.
Oluşturduğum basit bir docker-compose.yml var bunu python da sık sık kullandığım redis kütüphanesi ile direk kullanabilirsiniz.
pip3 install redis
Test amaçlı ilk önce bağlanmaya çalışıyoruz
import redis
r = redis.Redis(password="123sifre")
True döndüğü anda bağlandığımızı görüyoruz.
r.mset({"adi": "necati",
"soyadi": "ateş"})
Redis key-value kafasıyla çalışan bir sistem olduğu için key ve ona ait bir value olarak gitmemiz gerekiyor.
r.get("soyadi")output : b'ate\xc5\x9f'
Python’un byte türü olduğuna dikkat edin, str değil. Düzgün bir çıktı için aşağıdaki yapıda çağırmanız gerekebilir.
r.get("soyadi").decode("utf-8")

Şimdi açıklama kısmı fark ettiğiniz üzere yukarıdaki python kodlarında .get ve .mset kullandık bu aslında Redis API’sinde MSET ve GET’e karşılık gelmektedir.
HMSET : Anahtarları grup halinde oluşturmamızı sağlamaktadır. (HMSET hashkey key value)
HMGET : Grup içindeki anahtar değerine ulaşmamızı sağlamaktadır. (HMGET hashkey key)
HGETALL : Gruplar içerisindeki anahtar ve değerlere ulaşmamızı sağlamaktadır. (HGETALL hashkey)
HDEL : Girilen hashkey’e göre grup silmemizi sağlamaktadır. (HDEL hashkey key)
Diğer bir kullanım yolu ise SET. Aslında yukarıdaki basit örneğe bakıldığı zaman akıllara gelebilecek ilk soru liste içerisinde bir sürü verim var o zaman ne yapacağım? Aslında bu tamamen sizin elinizdeki duruma bağlı ama aşağıdaki şekilde kullanılabilir.
import redis
r = redis.Redis(password="123sifre")
data = {
"necatiates@gmail.com": {
"name": "necati ates",
"request_limit": 10,
"age": 45
},
"hakantasiyan@gmail.com": {
"name": "hakan tasiyan",
"request_limit": 10,
"age": 47
},
"aysekeci@gmail.com": {
"name": "ayse keci",
"request_limit": 10,
"age": 65
}
}
with r.pipeline() as pipe:
for item_id, data in data.items():
pipe.hmset(item_id, data)
pipe.execute()
r.bgsave()
Eğer hakantasiyan@gmail bilgilerini görmek istersek;
r.hgetall("hakantasiyan@gmail.com")
Mesela her sorgu sonrasında sorgu hakkından -5 azalmasını istiyoruz
r.hincrby("hakantasiyan@gmail.com", "request_limit", -5)
Eğer tüm keys ler bulmak istersek
r.key()
# Diyelim ki burada bir sürü key var ve biz spesifik bir key arıyoruzr.keys(pattern='hakan*') # gibi yapılabilir.
Bir kaç küçük değişiklik ile ;
def find_keys(pattern="*"):
return r.keys(pattern=pattern)
print(find_keys(pattern="hakan*"))## veyaprint(find_keys(pattern="*akan*"))
Birinci part için son düzlük:
- r.delete(key) ile istedigimiz keyleri silebiliriz
- hmget ile istediğimiz fieldları elde edebiliriz.
item = r.hmget("aysekeci@gmail.com",keys=["name",
"age" ,
"request_limit"])
Özetle neler hatırladık?
- HMSET = This command overwrites any specified fields already existing in the hash. If
key
does not exist, a new key holding a hash is created. - HINCRBY = Increments the number stored at
field
in the hash stored atkey
byincrement
. Ifkey
does not exist, a new key holding a hash is created. Iffield
does not exist the value is set to0
before the operation is performed. - HMSET = Sets the specified fields to their respective values in the hash stored at
key
. This command overwrites any specified fields already existing in the hash. Ifkey
does not exist, a new key holding a hash is created. - HSET = Sets
field
in the hash stored atkey
tovalue
. Ifkey
does not exist, a new key holding a hash is created. Iffield
already exists in the hash, it is overwritten. - HGET = Returns the value associated with
field
in the hash stored atkey
. - HMGET = Returns the values associated with the specified
fields
in the hash stored atkey
. - HDEL = Removes the specified fields from the hash stored at
key
. Specified fields that do not exist within this hash are ignored. Ifkey
does not exist, it is treated as an empty hash and this command returns0
.
Yazının ilk bölümü burada bitiyor daha değinmediğim bir çok kısım olmak ile diğer yazılarda bu değinmediğim kısımlara değinmeyi özellikle PubSub olayında kullanılabilecek örnek yapmayı planlıyorum. Ortaya Karışık Yazılım Serisi’ne kendinizi yakın hissediyorsanız paylaşarak destek olabilirsiniz yaptığım hata ve öneriler için Twitter üzerinden ulaşabilirsiniz.

“Redis or Die, Remember? “Ortaya Karışık Yazılım Serisi — 2