2011-09-29 33 views
6

MongoDB, CouchDB, Redis, Tokyo Kabini ve diğer NoSQL Veritabanları ile zaten deneyimledim. Geçenlerde Riak'a tökezledim ve bana çok ilginç geldi. Başlamak için, NoSQL Dünyasında "merhaba dünya" küçük bir twitter klon yazmaya karar verdim. Tamamen çalışan bir klon elde etmek için tweetleri kronolojik olarak sipariş etmek gerekir. Riak belgelerini okuduktan sonra, Map-Reduce'un bu iş için doğru araç olduğunu keşfettim. Gelişim ortamımda oldukça iyi çalışıyor, ancak yüzlerce paralel sorgulama ile üretimdeki performans nasıl? Verileri sıralamak için başka, belki daha hızlı yöntemler var mı, yoksa verileri düzenli bir biçimde (Cassandra gibi) depolamak mümkün mü?Riak'taki verileri nasıl sıralayabilirim?

Güncelleştirme: Bu sorunun başka bir çözümünü buldum - basit bir bağlantı listesi. Olası bir uygulama, her kullanıcının kendi "zaman çizelgesi kepçesini" almasıdır. Burada tweet verilerinin kendilerine ait linkler saklanır (tweets "tweets" kovalarında ayrı olarak depolanır). Bildiğiniz gibi, bu zaman çizelgesi dizisi, en son zaman çizelgesi nesnesine bağlanan ve listenin başlangıç ​​noktası olan "ilk" adında bir anahtar içermelidir. Zaman çizelgesine yeni bir tweet eklemek için, zaman çizelgesi grubundaki yeni bir öğeyi eklemeniz yeterlidir, bu yeni öğenin "sonraki" - bağlantısını "ilk" -ememine ayarlayın, daha sonra yeni öğeyi "ilk" yapın. Kısacası

: Bir bağlantılı listesinde yapacağı gibi ... twitter gibi

bir eleman sokar, kişisel zaman çizelgesi sadece kullanıcıya gösterilen 20 tweet tutar. Son 20 tweet'i almak için sadece 2 sorgu gerekiyor. İşleri hızlandırmak için ilk sorgu, "sonraki" ile etiketlenmiş en son 20 nesneyi almak için Riak'ın bağlantı kurma yeteneğini kullanır. Son olarak, ikinci ve son sorgu tweets kendisini almak için ilk sorgu tarafından hesaplanan tuşları kullanır (kullanarak harita/azaltma).

Takip etmediğiniz kullanıcıların tweet'lerini kaldırmak için, ilgili zaman çizelgesi nesnelerini/tweet'leri almak için Riak 1.0'ın ikincil dizin yeteneğini kullanırdım.

+0

Riak 1.4 sıralama ve sayfalandırma İkincil Endeksler ile mevcut olduğundan: http://basho.com/basho-announces-availability-of-riak-1-4/ – nacmartin

cevap

2

RIAK iç bölümlerini yeniden yazarak başvurmadan RIAK içinde sıralı bir biçimde veri depolamak için mümkün değildir. Veri kabaca + anahtar siparişinde kabaca saklanır. Asıl sipariş, Riak için kullandığınız arka uç depolama mekanizmasına bağlıdır.

RIAK 1.0 de size yardımcı olabilecek bazı özelliklere sahiptir. Sekonder endeksler için destek ve Map Reduce işlemlerinde iyileştirmeler var - özellikle de yüksek eşzamanlı senaryolarda çok daha iyi performans gösteriyorlar.

Alexander Siculars, Pagination with Riak hakkında bir makale yazdı. Sorunu oldukça iyi çiziyor. Yammer ayrıca Riak'ı da yoğun olarak kullanıyor ve mühendislerinden ikisi de Riak at Yammer ile ilgili bir sunum yaptı. Çok fazla uygulama detayına girmez, ancak çözümlerini nasıl tasarladıkları hakkında çok şey öğrenebilirsiniz.

ikincil indeks sorguları birleştiren ve Harita azaltın mümkün oldukça kolay bir şekilde sorunu çözmek mümkün kılar.

0

Jeremiah, verilerin sıralı sırada depolanmasının mümkün olmadığına göre, ikincil dizinler ve harita/küçültme kullanarak sıralı sonuçlar döndürmesini sağlayabilirsiniz. Sorun, açıklandığı gibi, sorguyu sıralı bir şekilde etkili bir şekilde sınırlayamıyor olmanızdır.İşte

tüm anahtarları listelemek için aralık sorgu kullanarak ve ardından * riak_kv_mapreduce * :: içinde yerleşik işlev kullanarak bunları tasnif örneğidir

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087), 
riakc_pb_socket:mapred(Pid            
    , {index, colonel_riak:bucket(context), <<"$key">>, <<0>>, <<255>>}  
    , [{reduce, {modfun, riak_kv_mapreduce, reduce_sort}, none, true}]) 

Sen erlang içinde lists modülde fonksiyonlarını kullanabilir veya kullanabilirsiniz yerel javascript sıralama işlevi. Sipariş, erlang içinde lists:reverse/1 tarafından yapılabilir.

İlgili konular