Riakはキー値ストアであるため、データを取得するための最も効率的な方法はキーを使用することです。バケット内のすべてのキーを一覧表示または取得することは、最初に返されたキーのみを使用することになったとしても、Riakがシステム内のすべてのキー(バケットだけでなく)をスキャンするため、実行できる最も効率の悪い操作の1つです。通常、これを本番システムで使用しないことをお勧めします。
最後に挿入されたオブジェクトを取得する最も効率的な方法は、おそらくIDを別の既知のレコードの別のバケットに格納することです。ただし、これには、挿入ごとに2回の書き込みを実行し、読み取りごとに2回の読み取りを実行する必要がありますが、最も効率的な方法で実行します。メッセージを含むバケットにコミット後フック(現在JavaScript関数を使用してレコードを書き込むことはできないため、Erlangにある必要があります)を実装して、システムに更新を実行させることができます。これにより、最後の書き込みの必要性。
メッセージを含むバケットに大量のデータを書き込む場合は、複数の値を許可せず、最後の値が優先されるように、個別のバケットを調整することをお勧めします。このようにして、システム全体でこの単一のレコードが頻繁に更新されるために、多数の兄弟が作成されるリスクを減らすことができます。Riakはどのタイプの原子性もサポートせず、結果整合性のあるデータベースであるため、これにより常に最後に書き込まれたレコードの1つが得られますが、必ずしも最後に書き込まれるとは限りません(特に、データベースにメッセージを頻繁に書き込む場合)。
leveldbバックエンドを使用している場合は、1つ以上のセカンダリインデックスを作成し、これを使用してスキャンを最近のレコードのみに制限することもできます。これは、すべてのキーのスキャンよりも効率的です。次に、mapreduceを使用して最新のキーまたはランダムなキーを選択できますが、これは前述のアプローチよりもはるかに効率的ではありません。
挿入したキーの範囲を知っていて、どのキーを取得するかをクライアントでランダムに決定できない限り、Riakからバケット内のランダムレコードを取得する効率的な方法は考えられません。これを行う1つの方法は、UUIDを使用するのではなく、すべてのキーを順番に生成することですが、これは、高度な同時分散システムでは当然お勧めできません。