1

このようなことが可能かどうか疑問に思っていました。私はredisリストを扱っていますが、次のようにアイテムをリストの途中からリストの一番上に移動できるかどうか疑問に思っていました:

LPUSH mylist "This"
LPUSH mylist "is"
LPUSH mylist "a"
LPUSH mylist "Test"

Somehow Move "a" to top

LRANGE mylist
    1. "a"
    2. "This"
    3. "Is"
    4."Test"

助けてくれてありがとう!

4

2 に答える 2

4

Redis リストはLinked listを使用して実装されており、Linked List はそのような使用 (つまり、ランダム アクセスと効率的なインデックス作成) には適していません。

「a」(包括的)までのすべての要素をどこかに保存してから、それらを使用してリストから削除しLTRIM、必要な順序で再度プッシュする必要があります(つまりRPOP、最後の要素をLPUSHing して ing した後)。Redisすぐに使用できるため、組み込みの Lua スクリプトを使用してこれを行うことができます。

ただし、各単語をリストに 1 回だけ表示する場合は、 Sorted Setを使用して効率的に行うことができます。特定の要素のスコアを、他のすべての要素よりも大きな値に更新する必要があります ( ZADD)。次に、ZRANGEBYSCORE並べ替えられたセットを取得するために a を実行します。

ただし、ソートされたセットの使用にはトレードオフがあり、ほとんどの場合、要素の挿入/削除は、リストからの値のプッシュ/ポップ (つまり、一定時間で発生) よりも遅くなります (つまり、対数時間で発生します)。それはすべて問題によって異なります。さまざまなアプローチを比較検討し (Redis のドキュメントでは、各操作の時間の複雑さを説明しています)、問題に合ったものを選択する必要があります。

于 2013-10-04T08:26:35.983 に答える
0

リスト内の項目を前後に移動する lua スクリプトを作成しました。

https://github.com/stereosteve/redis-moveby

readme に示されているように、ソートされたセットの方が適切なオプションである可能性があります。私はこれを本番環境で使用していないため、注意して使用してください。

于 2014-02-03T16:48:53.837 に答える