Redisリストのすべてのエントリを削除します


82

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

LTRIM key 0 0
LTRIM key -1 0

それらの両方が最初の要素を残します。これにより、すべての要素が残ります。

LTRIM key 0 -1

リストを完全に空にする別のコマンドが表示されません。


2
@DavidJames:「foo」の別のスペルと考えてください。私はRedis自身のドキュメントで使用されている規則に従っています:redis.io/commands
Paul A Jungwirth

はい、redisでは、すべてのデータ構造がキーです。これは、例で「キー」が役立つという意味ではありません。まったく逆だと思います。を使用mylistすると、質問がより明確になります。たとえば、redis.io / commands / ltrimは次のように書き込みますLTRIM mylist 1 -1。あなたが引用するページはコマンドリファレンスであり、良い例を作るための「慣習」と見なされるべきではありません。
David J.

回答:


151

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

DEL key

これがいくつかのコンソールログです。

redis> KEYS *
(空のリストまたはセット)
redis> LPUSHがジョンに名前を付ける
(整数)1
redis> LPUSHがメアリーに名前を付ける
(整数)2
redis> LPUSHがアリスに名前を付ける
(整数)3
redis> LLEN名
(整数)3
redis> LRANGE名02
1)「アリス」
2)「メアリー」
3)「ジョン」
redis> DEL名
(整数)1
redis> LLEN名
(整数)0
redis> LRANGE名02
(空のリストまたはセット)

1回のアトミック操作でそれを行う方法はありますか?(「
LRANGEnames02

1
Delを使用するとmay create extra overhead、時間計算量:O(N)ここで、Nは削除されるキーの数です。削除するキーが文字列以外の値を保持している場合、このキーの個々の複雑さはO(M)です。ここで、Mはリスト、セット、ソートされたセット、またはハッシュ内の要素の数です。文字列値を保持する単一のキーを削除するのはO(1)です。ドキュメント
ChewOnThis_Trident

2
この方法は、キーのttl削除するため、危険です
埼玉

17

リストに複数の値がある場合のみリスト 内のすべての値を削除できます

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つしかない場合は、を使用する必要があります

DEL key 

受け入れられた回答のコメントで述べられているように:DELキーはリストのttlも削除します
patrick

4

LTRIMを使用するだけです。...ああ、ここでの魔法は、start より大きい を使用することですend

LTRIM key 99 0

そして...ブーム!要素の全リストがあります。目の前で*プーフ*!残留物は残っておらず、質問もまったくありません。

注:これにより、ここで説明するように、キーが「削除」されます(削除された場合のように)。

... startがリストの終わりよりも大きい場合、またはstart> endの場合、結果は空のリストになります(これによりキーが削除されます)。


DEL key@Anuragの回答のように、これを好む理由はありますか?同じ効果があるようです。
Paul AJungwirth18年

率直に言って、ベンチマークを調べる時間がなかったので、上記の方法を発見したときにドキュメントを読んでいただけでした。
Mohd Abdul Mujib 2018

1
さて、ありがとう!LTRIM繰り返し使用するアルゴリズムを想像できるので賛成です。2番目のパラメーターが最初のパラメーターを下回ったときに何が起こるかを知っておくとよいでしょう。この動作を利用することで、一部のコードがよりエレガントになることがわかります。
Paul AJungwirth18年

0

受け入れられた答えは間違っています。私が持っていると思います

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

実際に正しいahmedの例を使用します。今、私がそうするなら:

DEL 'test4'

私は最終的に:

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

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

気をつけて、ここをさまよう者よ。


以下に引用されているページを見ると、実際にはセマンティクスが同じであることがわかります。撮影からThe LPUSH command inserts a new element on the head, while RPUSH inserts a new element on the tail. A new list is created when one of this operations is performed against an empty key. Similarly the key is removed from the key space if a list operation will empty the list. These are very handy semantics since all the list commands will behave exactly like they were called with an empty list if called with a non-existing key as argument.
ドミニク

馬の口から:「同様に、リスト操作でリストが空になると、キーはキースペースから削除されます。」つまり、{[]、[]、[]} === {[]}ですか?私のためではありません。私たちはさまざまな位相空間にいると思います...:)
deimosaffair 2014年

最初の質問は、Redisでリスト全体を削除する方法でした。したがって、キーを削除するか、すべてのエントリを削除して、redisによってキーが自動的に削除された場合、同じ結果が得られます。したがって、{[]、[]、[]} === {[]}の意味がわかりません。
ドミニク

リストから最後の要素を削除することは、キーを削除することと同じです。このリンクでも同じリストのためにも(RPOPLPUSHでテスト) bennadel.com/blog/...
Kanagavelu Sugumar

0

私はこれを試しました、そしてそれは私のために働きます。リスト名のmyListを変更して実行するだけです redis-cli KEYS "myList:*" | xargs redis-cli DEL


1
これは機能keysしますが、データベース内のすべてのキーを解析する必要がある非常に重い操作です。この場合、またはほとんどの場合、これはまったく不要です
Adalcar 2018年

0

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

簡潔な答え

ltrim mylist 0-(n + 1)ここで、mylistはキーで、nはmylistの長さです。

長い答え

ltrimが機能する方法は、2つのインデックスを取り、それらの間にある要素(インデックスを含む)を返すことです。

LtrimリストstartIndexendIndex

10個のエントリを含むキーmylistを持つredisリストがあると仮定した例:

ltrim mylist 0 5は、リストをインデックス0からインデックス5までの要素にトリミングし、その範囲外の要素を破棄します。

幸い、redisリスト操作はネガティブインデックスをサポートしており、状況によっては非常に便利です。通常、リストの長さがわからない場合。

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

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

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


あなたの洞察を共有してくれてありがとう。あなたの答えの拡張として、あなたはすべてのアイテムが削除されることを保証するためにリストより十分に大きいNの値を単に与えることができます。たとえばltrim mylist 0 -99999
デイブジョンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.