2012-03-22 22 views
53

RedisにLISTデータ型があるとします。どのようにすべてのエントリを削除しますか?私はこれを既に試してみました:Redisリストのすべてのエントリを削除します

LTRIM key 0 0 
LTRIM key -1 0 

これらはどちらも最初の要素のままです。これにより、すべての要素が残ります。

LTRIM key 0 -1 

リストを完全に空にするコマンドはありません。

+2

@DavidJames:「foo」のスペルの別の方法を考えてみましょう。私はRedisのドキュメントで使用されている規約に従っています:http://redis.io/commands/ –

+0

はい、赤字では、すべてのデータ構造がキーです。これは、例では「キー」が有用であるとは限りません。正反対だと思います。 'mylist'を使用すると、あなたの質問がより明確になります。たとえば、http://redis.io/commands/ltrim/は、「LTRIM mylist 1 -1」と書いています。あなたが引用したページはコマンド*の参考資料であり、良い例を作るための "規約"とはみなされるべきではありません。 –

答えて

94

キーを削除すると、すべての項目がクリアされます。リストを全く持たないのは、その中にアイテムを持たないことに似ています。存在しないキーにアクセスしようとすると、Redisは例外をスローしません。

DEL key 

ここにいくつかのコンソールログがあります。

 
redis> KEYS * 
(empty list or set) 
redis> LPUSH names John 
(integer) 1 
redis> LPUSH names Mary 
(integer) 2 
redis> LPUSH names Alice 
(integer) 3 
redis> LLEN names 
(integer) 3 
redis> LRANGE names 0 2 
1) "Alice" 
2) "Mary" 
3) "John" 
redis> DEL names 
(integer) 1 
redis> LLEN names 
(integer) 0 
redis> LRANGE names 0 2 
(empty list or set) 
+0

1つのアトミック操作でこれを行う方法はありますか? ( "LRANGE names 0 2"と "DEL names"の両方) – refaelos

+0

はい。 Redyトランザクション - http://redis.io/topics/transactionsを参照してください。 – Anurag

+1

Delを使用することの1つが、 '余分なオーバーヘッドを生成する可能性があります。 '、 時間複雑性:O(N)Nは削除されるキーの数です。削除するキーが文字列以外の値を保持する場合、このキーの個々の複雑さはO(M)です。ここで、Mはリスト、セット、ソート済みセットまたはハッシュの要素数です。文字列値を保持する単一のキーを削除するのはO(1)です。 [docs](http://redis.io/commands/del) –

11

あなたはリスト内のすべての値を削除することができ一覧は、複数の値を持っているだけ場合

LTRIM key -1 0 

例:

redis 127.0.0.1:6379> RPUSH mylist four 1 3 1 
(integer) 4 
redis 127.0.0.1:6379> KEYS * 
1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "test4" 
5) "firstList" 
6) "mylist" 
redis 127.0.0.1:6379> LTRIM mylist -1 0 
OK 
redis 127.0.0.1:6379> LRANGE mylist 0 -1 
(empty list or set) 
redis 127.0.0.1:6379> KEYS * 
1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "test4" 
5) "firstList" 

しかし場合リストには1つの値がありますyを使用する必要があります

DEL key 
-1

回答が間違っています。私が持っていると仮定して実際には正しいのahmedの例を使用して

redis 127.0.0.1:6379> KEYS * 
1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "test4" 
5) "firstList" 
6) "mylist" 

を使用してください。 は今、私がしなければ:

DEL 'test4' 

私はで終わる:そう、私は 'TEST4' リストからすべてのエントリを削除しませんでした

1) "newKey" 
2) "firstHash" 
3) "secondList" 
4) "firstList" 
5) "mylist"` 

、私 TEST4 自体を削除しました。同じことではありません。どういたしまして。私はリストキーがいくつかのデータから計算されたハッシュである小さなアプリケーションを持っていますが、それらのリストは時々クリアされますが、空のリストと存在しないリストのセマンティクスは非常に異なります。 だから、いいえ、私はDEL 'myhashes'にしたくない、私はすべてのエントリを削除するだけです。

ここでさまよう人よ、注意してください。

+0

下記のページを見ると、実際にはセマンティクスは同じです参照してください! [from](http://redis.io/topics/data-types#lists): 'LPUSHコマンドは、新しい要素を先頭に挿入し、RPUSHは末尾に新しい要素を挿入します。この操作の1つが空のキーに対して実行されると、新しいリストが作成されます。同様に、リスト操作によってリストが空になる場合、キー空間からキーが削除されます。これらは非常に便利なセマンティクスです。すべてのリストコマンドは、引数として存在しないキーを指定して呼び出された場合、空のリストで呼び出されたのとまったく同じように動作します。 ' – Dominic

+0

馬の口から:同様に、キーはリスト操作はリストを空にします。ですから、{[]、[]、[]} === {[]}ですか?私のためではありません。私たちは異なるトポロジカルな空間にいると思います:)。 – deimosaffair

+0

最初の質問は、リスト全体をredisで削除する方法でした。そのため、キーを削除するか、すべてのエントリを削除してキーを自動的に削除すると、同じ結果が得られます。だから私はあなたが{[]、[]、[]} === {[]}で何を意味するのか分かりません。 – Dominic

1

私の電話では回答がありますので、実際に回答をうまくフォーマットできません。

これは遅れている可能性がありますが、誰かがまだその機能を必要としている場合に備えて、ここに固執しています。

短い答え

LTRIMマイリスト0 - (N + 1) マイリストがキーであり、nマイリストの長さです。

長い答え

方法LTRIMの作品は、それは2つのインデックスを取り、それらの間の指標を含め落ちる要素を返す、ということです。

LTRIMリストのstartIndex endIndexの

我々は10個のエントリを含むキーマイリストとRedisのリストを持っていると仮定例:

LTRIMマイリスト0~5 は、インデックス5を介してインデックス0から始まる要素にリストをトリミングします。そして、その範囲外のものは捨てる。

幸いにも、redisリスト操作では、負のインデックス付けがサポートされているため、状況によっては非常に便利です。通常、リストの長さがわからないとき。

-1は、最後の要素、最後から2番目の要素などを指し、(-n)は最初の要素です。

範囲外のインデックスは有害ではありません。終了インデックスがリストの長さより大きい場合、redisはそれを最後のインデックスと等しく扱います。

これはltrim mylist 0、 - (n +1)リストをクリアする理由です。これは、(-n)がインデックス0と等価であるためです。1を追加すると、その範囲内の要素は最初の要素の前に残ることになります。

+0

あなたの洞察を共有してくれてありがとう。答えの拡張として、すべての項目が削除されることを保証するために、リストより十分大きなNの値を単に与えることができます。たとえば、 'ltrim mylist 0 -99999'となります。 –

関連する問題