13 Temmuz 2015 Pazartesi

Redis & Redis-rb


Redis: Veriyi key-value şekilde hafızada tutar. Açık kaynaktır. Redis geçici olan hiçbir şeyi veritabanında gereksiz yere yazmaz. Çeşitli veri yapıları kullanmaya izin verir. Yüksek performanslı cacheing mekanizmasına sahiptir. Veriyi RAM'de tutar ancak istenen aralıklarla veriyi diske kaydedebilir. Belirli periyotlarda aklında tuttuğu verileri bir dosyaya yazdığı için veri kaybı söz konusu değildir.

Memcached'den farklıdır. Memcached sadece veri girişi ve çıkışı yapar. Veriyi RAM'de tutar ancak veriyi dosyaya yazamaz.

Redis github üzerinde in-memory nosql veritabanıdır.
Kullandığı veri yapıları "string, hashes, lists, bitmaps vb."

Destekleyen diller; 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.

Redis-rb


Yukarda Redis'i tanımladıktan sonra şimdi de Ruby'de Redis işlemlerinden bahsetmek istiyorum.

Her zaman olduğu gibi öncelikli olarak Redis'i require etmemiz gerekir:

>> require "redis"

Redis sınıfı tarafından Redise bağlanmak istersek:

>> redis = Redis.new

Eğer bir naklen serverı veya farklı bir porta bağlanmaya ihtiyaç duyarsak:

>> redis = Redis.new(:host => "10.0.1.1", :port => 6380, :db => 15)

Ayrıca özel bağlantı ayarları olan bir URL'ye bağlanabiliriz:

>> redis = Redis.new(:url => "redis://:p4ssw0rd@10.0.1.1:6380/15")

Bir Unix sokette redis dinlemek için bağlanabiliriz:

>> redis = Redis.new(:path => "/tmp/redis.sock")

Bir password korumalı redis örneğine bağlantı için:

>> redis = Redis.new(:password => "kerem3434")

-Redis sınıfı aynı isimlendirilmiş metodları dışa aktarır. Verilen komutlarla çalışırlar.
-Redis websitesinde özel olarak hazırlanmış argumentler kullanılır. Bakmak için tıklayınız.

Bunlara örnek olaran SET ve GET komutlarına bi bakalım.

>> redis.set("mykey", "kerem hallac")
# => "OK"

>> redis.get("mykey")
# => "kerem hallac"

Sentinel Support


Performansı otomatik üstlenme işini Redis Sentinel ile yaparız. Sentinele bağlanma;


>> SENTINELS = [{:host => "127.0.0.1", :port => 26380},
{:host => "127.0.0.1", :port => 26381}]

>> redis = Redis.new(:url => "redis://mymaster", :sentinels => SENTINELS, :role => :master)

-Redis stringler isadece değer olarak depolar. Eğer bir nesne depolamak istersek,  JSON require edip kullanmamız gerekmektedir.

>> require "json"

>> redis.set "foo", [1, 2, 3].to_json
# => OK

>> JSON.parse(redis.get("foo"))
# => [1, 2, 3]

Pipelining


Çoklu komutları sıralı bir şekilde çalıştırdığımız zaman, fakat bağımlı olmadan, pipelined çağırılabilir. Bu istemci bir sonraki komutun gönderilmesinden  önce ilk komutun cevabı için beklemez. 
Bunun avantajı çoklu komutlar gönderildiğinde dönüş yüksek hızlı bir çalışmada sonuçlanır.

>> redis.pipelined do 
>>     redis.set "foo", "bar"
>>     redis.incr "baz"
>> end

# => ["OK", 1]

Bir atomik oluşumda numaralı komutları çalıştırabilmek için MULTI/EXEC kullanılır. Pipeline çalışmasına benzerdir. Cevaplar multi metodu tarafından döndürülülür.

>> redis.multi do 
>>    redis.set "foo", "bar"
>>    redis.incr "baz"
>> end

# => ["OK", 1]

Bir şey yolunda gitmiyorsa exception çevirmeliyiz.

>> begin 
   redis.ping 
>> rescue Exception => e 
   e.inspect
# => #<Redis::CannotConnectError: Timed out connecting to Redis on 10.0.1.1:6380>

   e.message
# => Timed out connecting to Redis on 10.0.1.1:6380
>> end

Daha fazla bilgi için ---->> https://github.com/keremh/redis-rb

Redis hakkında söylemek istediklerim bu kadar umarım isteyen kişilere faydalı olmuştur. Son olarak Redis'in efsane fotoğrafıyla yazımı sonlandırıyorum :) 


Hiç yorum yok:

Yorum Gönder