このようなことが可能かどうか疑問に思いました。私は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"
助けてくれてありがとう!
Redisリストはリンクリストを使用して実装されており、リンクリストはそのような使用には適していません(つまり、ランダムアクセスと効率的なインデックス作成)。
「a」(両端を含む)まですべての要素をどこかに保存してから、を使用してリストから削除しLTRIM
、必要な順序で(つまりRPOP
、最後の要素を入力しLPUSH
てから)もう一度プッシュする必要があります。Redisはこれをすぐにサポートするため、埋め込みLuaスクリプトを使用してこれを行うことができます。
ただし、各単語をリストに1回だけ表示する場合は、並べ替えセットを使用してこれを効率的に行うことができます。特定の要素のスコアを他のすべての要素よりも大きいものに更新する必要があります(ZADD
)。次に、ZRANGEBYSCORE
を実行して、並べ替えられたセットを取得します。
ただし、ソートされたセットを使用することにはトレードオフがあります。ほとんどの場合、要素の挿入/削除は、リストから値をプッシュ/ポップする(つまり、一定時間で発生する)よりも遅くなります(つまり、対数時間で発生します)。それはすべてあなたの問題に依存します、あなたは異なるアプローチを比較検討し(Redisドキュメントは各操作の時間計算量を提供します)そしてあなたの問題に合うものを選ぶべきです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加