6

MongoDB、CouchDB、Redis、Tokyo Cabinet、その他の NoSQL データベースの経験はすでにあります。最近、私は Riak に出くわしましたが、とても興味深いようです。それを始めるために、NoSQL World の「Hello World」という小さな Twitter クローンを作成することにしました。完全に機能するクローンを取得するには、ツイートを時系列に並べる必要があります。Riak のドキュメントを読んだ後、Map-Reduce がこの仕事に適したツールであることがわかりました。私の開発環境では非常にうまく機能しますが、何百もの並列クエリがある本番環境でのパフォーマンスはどうですか? データをソートするための他の、おそらくより高速な方法はありますか、またはデータを順序付けられた形式 (Cassandra など) で保存することは可能ですか?

この問題に対する別の解決策を見つけたと思います - 単純なリンクリストです。したがって、考えられる実装の 1 つは、すべてのユーザーが独自の「タイムライン バケット」を取得し、そこにツイート データ自体へのリンクが保存されることです (ツイートは「ツイート」バケットに個別に保存されます)。ご存じのとおり、このタイムライン バケットには、最新のタイムライン オブジェクトにリンクし、リストの開始点となる「first」という名前のキーが含まれている必要があります。タイムラインに新しいツイートを挿入するには、タイムライン バケットに新しいアイテムを挿入し、この新しいアイテムの「次へ」リンクを「最初の」アイテムに設定し、その後、新しいアイテムを「最初」にします。

つまり、リンクされたリストで行うようにアイテムを挿入します...

Twitter と同様に、個人のタイムラインには、ユーザーに表示される 20 個のツイートが保持されます。最新の 20 件のツイートを受け取るために必要なクエリは 2 つだけです。処理を高速化するために、最初のクエリは Riak のリンク ウォーキング機能を使用して、「next」でタグ付けされた最新の 20 個のオブジェクトを取得します。最後に、2 番目の最後のクエリは、最初のクエリによって計算されたキーを使用して、ツイート自体を受信します (map/reduce を使用)。

フォローを外したばかりのユーザーのツイートを削除するには、Riak 1.0 のセカンダリ インデックス機能を使用して、関連するタイムライン オブジェクト/ツイートを受け取ります。

4

2 に答える 2

2

Riakコアの一部を書き直すことなく、Riakに注文された形式でデータを保存することはできません。データは、大まかにバケット+キーの順序で保存されます。実際の順序は、Riakに使用しているバックエンドストレージメカニズムによって異なります。

Riak 1.0には、役立つ機能もいくつかあります。セカンダリインデックスのサポートとMapReduce操作の改善があります。特に、並行性の高いシナリオではパフォーマンスが大幅に向上します。

Alexander Sicularsは、Riakによるページネーションについての記事を書きました。それは問題の概要をかなりよく示しています。YammerはRiakも多用しており、2人のエンジニアがYammerでRiakに関するプレゼンテーションをまとめました。実装の詳細については詳しく説明しませんが、ソリューションがどのように設計されているかについては多くのことを学ぶことができます。

セカンダリインデックスクエリとMapReduceを組み合わせると、問題を非常に簡単に解決できます。

于 2011-10-01T13:09:40.703 に答える
0

Jeremiah が言うように、データをソートされた順序で保存することはできませんが、セカンダリ インデックスとマップ/リデュースを使用して、ソートされた結果を返すようにすることはできます。説明したように、問題は、並べ替えられた方法でクエリを効率的に制限できないことです。

以下は、範囲クエリを使用してすべてのキーをリストし、*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}])

モジュール内の関数をlistserlang で使用するか、ネイティブの JavaScript ソート関数を使用できます。order bylists:reverse/1は erlang で実現できます。

于 2012-10-09T09:17:51.153 に答える