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

Kemalcan Bora
5 min readDec 29, 2020

--

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ü.

LOTR: Army of the Dead

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 mimarileri

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")
utf-8 problems

Ş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)
Basit bir genel bakış

Eğer tüm keys ler bulmak istersek

r.key()
# Diyelim ki burada bir sürü key var ve biz spesifik bir key arıyoruz
r.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 at key by increment. If key does not exist, a new key holding a hash is created. If field does not exist the value is set to 0 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. If key does not exist, a new key holding a hash is created.
  • HSET = Sets field in the hash stored at key to value. If key does not exist, a new key holding a hash is created. If field already exists in the hash, it is overwritten.
  • HGET = Returns the value associated with field in the hash stored at key.
  • HMGET = Returns the values associated with the specified fields in the hash stored at key.
  • HDEL = Removes the specified fields from the hash stored at key. Specified fields that do not exist within this hash are ignored. If key does not exist, it is treated as an empty hash and this command returns 0.

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

Referanslar

--

--

No responses yet