Redis ile Python Üzerinde Hızlı Veri Saklama/Çekme

Redis; sunucunuzun belleğini kullanabilen, buna veri çiftleri kayıt ederek veri tabanı, önbellek(cache) ya da nasıl isterseniz öyle kullanmanızı sağlayan ve daha sonra belleğin avantajı ile bunu çok hızlı olarak okumanızı sağlayan açık kaynak kodlu çoğunlukla C dili ile yazılmış bir araçtır.  Aşağıdaki linkte çok güzel hazırlanmış bir interaktif dersi mevcut, İngilizce sorununuz yok ise mutlaka bakmanız gerekir, sorununuz var ise çözmenin zamanı gelmiş demektir.

http://try.redis.io/

Yukarıdaki linkte olduğu gibi Redis komut satırından da kullanılabilir tabi ama ben projelerime dahil edebilmek için Python ile kullanacağım. Temel kullanım aynı olacağı için kullandığınız (client dedikleri) dilin pek önemi yok. Client listesine şuradan göz atabilirsiniz, kendi favori diliniz ile de deneyiniz.

İlk işimiz Redis’i indirip kurmak oluyor. Şu adresten indirip açabiliriz ya da aşağıdaki komutları uygulayabiliriz.

Windows üzerinde bir destek yok o yüzden Linux bir işletim sistemi üzerinde denemeniz ya da çalışmanız gerekli.

Şu anki sürüm 4.0.1 daha günceli olabilir kontrol etmenizde fayda var.

$ wget http://download.redis.io/releases/redis-4.0.1.tar.gz
$ tar xzf redis-4.0.1.tar.gz
$ cd redis-4.0.1
$ make
$ make test # derlemenin sorunsuz olduğuna bakmakta fayda var

Birkaç dakika içinde derleme işlemi src klasörüne yapılıyor. Redis sunucusunu başlatmak için şu yolu çalıştırıyoruz.

$ src/redis-server

Sunucumuz başladıktan sonra Redis içinde bulunan komut satırı arayüzü ile denemelerimizi yapabilir ya da kurulumun doğruluğunu kontrol edebiliriz.

$ src/redis-cli

Bir sonraki Python üzerinde kullanabilmemiz için gerekli paketi yüklemek, tavsiye edilen redis-py paketini kuracağız. Aşağıdaki komut ile kurulumu yapıp Python yazmaya geçebiliriz. (Redis-Py Docs)

sudo pip install redis

Spyder üzerinde adım adım işleyerek deneyeceğim, size de tavsiye ederim. Önce redis paketini ekleyip bir bağlantı oluşturuyoruz. Burada kullandığımız port parametresi src/redis-server komutunu kullandığımız zaman ekrana basılmıştı oradan kontrol edilebilir. db parametresi ise redis üzerinde çalışan pek çok database var ve hangisini kullanmak istediğimizin index’ini vermemiz gerekiyor.

import redis

r = redis.StrictRedis(host='localhost', port=6379, db=0)

# adet anahtar kelimesi ile bir değer kayıt ediyoruz
r.set('adet', 1)

# bu değeri geri çağırıyoruz
adet = r.get('adet')
print("ilk değer", adet)

# incr metodu ile değerimizi arttırıyoruz.
# eğer daha önceden adet anahtar kelimesinde bir
# değer yok ise sıfır olarak alınır değeri
r.incr('adet', 2)
adet = r.get('adet')
print("ikinci değer", adet)


Burada Redis’in bizim için çözdüğü bir sorundan bahsedeyim. Kullandığımız incr metodu ile değerimizi arttırdık fakat çok yoğun bir web sitesinde bunu kullandığımızı düşünün istekler o kadar sık olacak ki okunan değer ile incr motıdu arasında adet değeri başka bir client tarafından değiştirilmiş olabilir. Büyük bir sorun bu pek çok veri kaybına yol açacaktır. Fakat Redis hataya izin vermeyip çözecektir.

Birden fazla değer oluşturmak/güncellemek istediğimizde performanslı olması açısından pipeline denilen metodu kullanmamız gerekli. Bu şekilde redis tabanında bir transaction oluşacak ve komutların hepsi ya da hiçbiri yine atomic olarak çalışacak.

# pipe nesnesi oluşturuyoruz
pipe = r.pipeline()

# pipe üzerinde işlemleri sıraya sokuyoruz
pipe.set('isim', 'erdi')
pipe.incr('giris')

# suramızı işleme alıyoruz
print pipe.execute()

# Panele [True, 1] basacaktır

Burada execute komutu bize iş sıramıza göre bir dizi değer dönecektir. Set için True, incr için yeni değer döndürdü.

 

Bir Cevap Yazın