2011-09-29 34 views
6

私はすでにのMongoDB、CouchDBは、Redisの、東京内閣や他のNoSQLデータベースで経験しました。最近、私はRiakを見つけたので、とても興味深いです。それを始めるにあたって、私はNoSQL Worldに「hello world」という小さなツイッター・クローンを書くことにしました。完全に機能するクローンを得るためには、つぶやきを時間順に並べる必要があります。 Riakのドキュメントを読んだ後、私はMap-Reduceがこの仕事のための適切なツールであることを発見しました。私の開発環境ではうまくいきますが、何百もの並列クエリを使用して、プロダクションのパフォーマンスはどうですか?データをソートするための方法が他にも高速かもしれませんか?それとも、カサンドラのような順序付けられた形式でデータを保存することは可能ですか?Riakでデータを並べ替え/並べ替える方法は?

更新: 私はこの問題の別の解決策を見つけたと思います。単純なリンクリストです。したがって、可能な実装の1つは、すべてのユーザーが自分の「タイムラインバケット」を取得することです。そこでは、ツイートデータへのリンク自体が格納されます(ツイートはツイートバケットに別々に格納されます)。ご存じのとおり、このタイムラインバケットには、「first」という名前のキーが含まれている必要があります。このキーは、最新のタイムラインオブジェクトにリンクし、リストの開始点です。 、タイムラインに新しいつぶやきを挿入するだけでタイムラインバケツに新しい項目を挿入し、「最初の」-itemにこの新しい項目の「次」-linkを設定するには、その後、「最初」に新しいアイテムを作ります。要するに

:あなたはリンクリストに行うよう...ツイッターと同様に

を項目を挿入し、個人のタイムラインだけでユーザーに表示される20件のつぶやきを保持しています。最後の20個のつぶやきを受け取るには、2つのクエリしか必要ありません。高速化のために、最初のクエリはRiakのリンク・ウォーキング機能を使用して、「next」というタグが付いた最新の20個のオブジェクトを取得します。最後に、2番目と最後のクエリは、最初のクエリで計算されたキーを使用して、つぶやき自体を受け取ります(map/reduceを使用)。あなただけのフォローを解除したユーザーのツイートを削除するには

、私は、関連するタイムラインオブジェクト/つぶやきを受け取るためにRiakに1.0の二次インデックス機能を使用します。

+0

セカンダリインデックスでRiak 1.4のソートとページネーションが利用可能です:http://basho.com/basho-announces-availability-of-riak-1-4/ – nacmartin

答えて

2

Riakにコアの部分を再書き込みするために頼ることなくRiakにで注文フォームにデータを格納することは不可能です。データは大まかにバケツ+キー順に格納されます。実際の順序は、Riakで使用しているバックエンドストレージメカニズムによって異なります。

Riakに1.0は、あまりにも、あなたを助けるかもしれないいくつかの機能を備えています。セカンダリインデックスのサポートとMap Reduceオペレーションの改善があります。特に、高度な同時シナリオではパフォーマンスが大幅に向上します。

アレクサンダーSicularsはPagination with Riakについての記事を書きました。それは問題をかなりうまく説明します。 Yammerはまた、Riakを大量に使用し、その2人のエンジニアがRiak at Yammerについてのプレゼンテーションをまとめました。実装の詳細はほとんど含まれていませんが、ソリューションの設計方法については多くのことを学ぶことができます。

2次索引問合せとMap Reduceを組み合わせることで、問題を非常に簡単に解決できます。

0

Jeremiahによれば、データをソート順に格納することはできませんが、セカンダリインデックスとマップ/リダクションを使用してソート結果を返すことができます。この問題は、説明したように、ソートされた方法でクエリを効率的に制限できないという問題があります。ここで

は、すべてのキーを一覧表示するには、範囲クエリを使用して、あなたがErlangでlistsモジュール内の関数を使用するか、または使用することができます* :: *のriak_kv_mapreduceに機能内蔵の

{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}]) 

を使用してそれらをソートする例です。ネイティブのjavascriptソート機能。注文はエルランのlists:reverse/1によって達成することができます。

関連する問題