Redis: 機能リクエスト:lRank

作成日 2011年10月15日  ·  7コメント  ·  ソース: redis/redis

リスト内のメンバーのインデックスを決定するためのサポートを追加してください。

PS
redisリストに一意の番号が格納された配列があります。 そして、ソートされたセットを使用する理由はありません(メンバーがスコアが等しい場合のオーバーヘッド:()

Tnx。

最も参考になるコメント

また、リストをリバーシブルキューとして使用しています(具体的にはrq )。 これらのキューはかなり大きくなる可能性があり、最も一般的な操作はキューへの追加または削除です。 幸い、これらの操作はredisのO(1)ですが、キュー内のジョブの位置(より具体的には、その前のジョブのリスト)を見つける方法が必要です。

並べ替えられたセットが推奨される解決策であることは理解していますが、ここではそれがどのように合理的かわかりません。並べ替えられたセットの追加と削除はO(log(N))であり、これは問題ありません。リストにいくつかの順序を追加/削除します。このチェックを実行しようとするよりも頻繁に桁違いになります。

また、_すでに_提供されているコマンド( lrem )は、ここで必要なことを正確に実行しますが、インデックスを返すのではなく、キーを削除することも指摘しておきます。 そのため、複雑さの引数がどのように適用されるかわかりません( LSETLINDEXもO(N)です)

実際、必要な種類の作業をすでに実行しているが、それらの使用に関連する問題があるコマンドがいくつかあります。

結果の全長の代わりに変更された要素位置を返す場合はジャンク値を挿入するか、任意の増分値を持つLRANGEを返すことで、 LINSERTをハックとして使用できますが、 LRANGEはO(start +取得)、最悪の場合(リストの終わり)のO(N)は実際にはさらに複雑であるため、 LRANGEを使用してリスト全体を返すと、目的の値で停止するよりも複雑になり、リストクライアントで不要な検索が発生します。側にあり、他の複雑さをもたらします(大きなリスト=長いネットワーク転送時間+クライアントのメモリに収まらない可能性があります。本番環境のredisボックスは、多くの場合、特別に大きなメモリのインスタンスにあります)。

単純なスキャンではない場合でも、ここにredisのような解決策がありますか? luaスクリプトを使用できることはわかっていますが、私の一般的な経験則では、非常に小さいもの(具体的には、コマンドがアトミックに相互作用できる場合を除く)に対してredisでスクリプトを使用する必要がある場合は、より良い方法があります。 したがって、キューとして使用されるリストを操作する場合、最も一般的な操作をO(1)からO(log(N))に変えるための最善の解決策は_本当に_ですか? (さらに、このリストの維持についてはわかりません。削除するときにすべてのメンバーを1つずつデクリメントし、追加するときに前の最高値を取得する必要がありますか?それとも、それを避けて追加し続けることはできますが、整数サイズはどれくらいですか?ここに制限がありますか?)

全てのコメント7件

答えてください。redisビルドに近いこの機能を待つかどうか。 :)

こんにちは。このコマンドはO(N)コマンドであり、通常はデータレイアウトの設計にエラーがある場合にのみ必要と思われるため、実装されない可能性があります。

しかし、幸いなことに、2.6のスクリプトを使用すると、本当に必要な場合は、Luaコードをほとんど使用せずにスクリプトを実装できます。 ただし、このコンテキストで並べ替えられたセットを使用する理由は、使用するのに適切なデータ構造であるためです。 これについて考える:

  • LINDEXなどが必要な場合は、リストが十分に小さいことを望んでいます。そうでない場合、パフォーマンスの観点からは使用できません。
  • ただし、リストが小さい場合は、ソートされたセットを使用できます。2.4では、小さいときに特別にエンコードされるため、リストと比較して追加のメモリは使用されません(または追加のメモリはほとんど使用されません)。

結論? 本当に必要な場合は2.6スクリプトを使用しますが、実装を変更したい場合があります。

問題を解決します。 とにかく提出してくれてありがとう!

乾杯、
サルヴァトーレ

私のstackoverflowの質問をチェックしてください。それは私がしていることを説明し、うまくいけば私がこの機能を追加したかった理由を与えるでしょう

http://stackoverflow.com/questions/8899111/get-the-index-of-an-item-by-value-in-a-redis-list

私はリストをリバーシブルキューとして使用しているので、アイテムは常に場所を変更します。基本的にはルーレットが動き回り、いつでもアイテムのインデックスを知りたいです。

lindexもO(N)です-ここでは複雑さが要因になるとは思いません。 並べ替えられたセットのオーバーヘッドが同じであっても、ユースケースは異なります。並べ替えられたセットでは、事前にスコアを維持する必要がありますが、リストは維持しません。 プッシュ/ポップなどができます。

また、リストをリバーシブルキューとして使用しています(具体的にはrq )。 これらのキューはかなり大きくなる可能性があり、最も一般的な操作はキューへの追加または削除です。 幸い、これらの操作はredisのO(1)ですが、キュー内のジョブの位置(より具体的には、その前のジョブのリスト)を見つける方法が必要です。

並べ替えられたセットが推奨される解決策であることは理解していますが、ここではそれがどのように合理的かわかりません。並べ替えられたセットの追加と削除はO(log(N))であり、これは問題ありません。リストにいくつかの順序を追加/削除します。このチェックを実行しようとするよりも頻繁に桁違いになります。

また、_すでに_提供されているコマンド( lrem )は、ここで必要なことを正確に実行しますが、インデックスを返すのではなく、キーを削除することも指摘しておきます。 そのため、複雑さの引数がどのように適用されるかわかりません( LSETLINDEXもO(N)です)

実際、必要な種類の作業をすでに実行しているが、それらの使用に関連する問題があるコマンドがいくつかあります。

結果の全長の代わりに変更された要素位置を返す場合はジャンク値を挿入するか、任意の増分値を持つLRANGEを返すことで、 LINSERTをハックとして使用できますが、 LRANGEはO(start +取得)、最悪の場合(リストの終わり)のO(N)は実際にはさらに複雑であるため、 LRANGEを使用してリスト全体を返すと、目的の値で停止するよりも複雑になり、リストクライアントで不要な検索が発生します。側にあり、他の複雑さをもたらします(大きなリスト=長いネットワーク転送時間+クライアントのメモリに収まらない可能性があります。本番環境のredisボックスは、多くの場合、特別に大きなメモリのインスタンスにあります)。

単純なスキャンではない場合でも、ここにredisのような解決策がありますか? luaスクリプトを使用できることはわかっていますが、私の一般的な経験則では、非常に小さいもの(具体的には、コマンドがアトミックに相互作用できる場合を除く)に対してredisでスクリプトを使用する必要がある場合は、より良い方法があります。 したがって、キューとして使用されるリストを操作する場合、最も一般的な操作をO(1)からO(log(N))に変えるための最善の解決策は_本当に_ですか? (さらに、このリストの維持についてはわかりません。削除するときにすべてのメンバーを1つずつデクリメントし、追加するときに前の最高値を取得する必要がありますか?それとも、それを避けて追加し続けることはできますが、整数サイズはどれくらいですか?ここに制限がありますか?)

また、すでに提供されているコマンド(lrem)は、ここで必要なことを正確に実行しますが、インデックスを返すのではなく、キーを削除することも指摘しておきます。

それは良い点です。 http://redis.io/commands/lremのコメントにも議論があります

このページは役に立ちましたか?
0 / 5 - 0 評価