1

UUIDをキーとして使用し、jsonメッセージを値として使用して、メッセージのリストを格納するためにriakバケットを使用しています。これは正常に機能しています。

私が必要としているのは、少なくとも次の2つのシナリオのいずれかで、キーを知らなくてもバケットから単一のメッセージを取得する効率的な方法です。

  1. 最後に挿入されたオブジェクトを取得します(これは私の好みのアプローチです)。
  2. バケットからランダムなオブジェクトを取得します(最初の選択肢が不可能な場合)。

それを達成するための効率的な方法はありますか?

代替案の1つは、バケット内のキーを取得してから最初のキーを取得することです。ただし、これはriakを2回呼び出すことを意味します。1つはすべてのキーを取得するため(1つを除くすべてを破棄するため)、もう1つはオブジェクトを取得するためです。あまり効率的ではないようです。

4

3 に答える 3

2

Riakはキー値ストアであるため、データを取得するための最も効率的な方法はキーを使用することです。バケット内のすべてのキーを一覧表示または取得することは、最初に返されたキーのみを使用することになったとしても、Riakがシステム内のすべてのキー(バケットだけでなく)をスキャンするため、実行できる最も効率の悪い操作の1つです。通常、これを本番システムで使用しないことをお勧めします。

最後に挿入されたオブジェクトを取得する最も効率的な方法は、おそらくIDを別の既知のレコードの別のバケットに格納することです。ただし、これには、挿入ごとに2回の書き込みを実行し、読み取りごとに2回の読み取りを実行する必要がありますが、最も効率的な方法で実行します。メッセージを含むバケットにコミット後フック(現在JavaScript関数を使用してレコードを書き込むことはできないため、Erlangにある必要があります)を実装して、システムに更新を実行させることができます。これにより、最後の書き込みの必要性。

メッセージを含むバケットに大量のデータを書き込む場合は、複数の値を許可せず、最後の値が優先されるように、個別のバケットを調整することをお勧めします。このようにして、システム全体でこの単一のレコードが頻繁に更新されるために、多数の兄弟が作成されるリスクを減らすことができます。Riakはどのタイプの原子性もサポートせず、結果整合性のあるデータベースであるため、これにより常に最後に書き込まれたレコードの1つが得られますが、必ずしも最後に書き込まれるとは限りません(特に、データベースにメッセージを頻繁に書き込む場合)。

leveldbバックエンドを使用している場合は、1つ以上のセカンダリインデックスを作成し、これを使用してスキャンを最近のレコードのみに制限することもできます。これは、すべてのキーのスキャンよりも効率的です。次に、mapreduceを使用して最新のキーまたはランダムなキーを選択できますが、これは前述のアプローチよりもはるかに効率的ではありません。

挿入したキーの範囲を知っていて、どのキーを取得するかをクライアントでランダムに決定できない限り、Riakからバケット内のランダムレコードを取得する効率的な方法は考えられません。これを行う1つの方法は、UUIDを使用するのではなく、すべてのキーを順番に生成することですが、これは、高度な同時分散システムでは当然お勧めできません。

于 2012-11-11T08:47:13.790 に答える
0

最初のタスクは非常に簡単に実装できます。

  • 最後に挿入されたキーを事前定義されたキー/バケットの場所に書き込むコミット後フックを追加します
  • その事前定義されたキー/バケットからキーを取得し、それらを使用してgetクエリを発行します

それはまだ2つの操作ですが、どちらも高速です。さらに、フックに追加のオーバーヘッドがありますが、重すぎるものもありません。

2番目のシナリオも簡単ですが、実際に使用するには非効率的です。

  • すべてのキーを取得します(非常にコストのかかる操作)
  • ランダムに選ぶ
  • 問題を取得します
于 2012-11-15T20:13:40.607 に答える
0

私は同じシナリオを思いついた。私のシナリオでは、ユーザーを保存する必要があります。そのために、自動インクリメントIDが必要でした。つまり、「Christian Dahlqvist」で説明したように、最後に挿入されたキーを別のバケットに配置しました。新しいレコードを挿入するたびに、最後に挿入されたキーをそのキーバケットからフェッチします。ここでは、そのバケットに「LastKey」というキーを持つ値が1つだけあります。これは、常に認識されています。そして、フェッチされたキーに基づいてキーをインクリメントし、キーバケットを再度更新しました。したがって、常にキーバケットには最新のキーが含まれています。

于 2014-03-21T12:12:41.233 に答える