RedisにLISTデータ型があるとします。すべてのエントリをどのように削除しますか?私はすでにこれを試しました:
LTRIM key 0 0
LTRIM key -1 0
それらの両方が最初の要素を残します。これにより、すべての要素が残ります。
LTRIM key 0 -1
リストを完全に空にする別のコマンドが表示されません。
RedisにLISTデータ型があるとします。すべてのエントリをどのように削除しますか?私はすでにこれを試しました:
LTRIM key 0 0
LTRIM key -1 0
それらの両方が最初の要素を残します。これにより、すべての要素が残ります。
LTRIM key 0 -1
リストを完全に空にする別のコマンドが表示されません。
mylist
すると、質問がより明確になります。たとえば、redis.io / commands / ltrimは次のように書き込みますLTRIM mylist 1 -1
。あなたが引用するページはコマンドリファレンスであり、良い例を作るための「慣習」と見なされるべきではありません。
回答:
キーを削除すると、すべてのアイテムがクリアされます。リストがまったくないことは、リストにアイテムがないことと似ています。存在しないキーにアクセスしようとしても、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 (空のリストまたはセット)
may create extra overhead
、時間計算量:O(N)ここで、Nは削除されるキーの数です。削除するキーが文字列以外の値を保持している場合、このキーの個々の複雑さはO(M)です。ここで、Mはリスト、セット、ソートされたセット、またはハッシュ内の要素の数です。文字列値を保持する単一のキーを削除するのはO(1)です。ドキュメント
リストに複数の値がある場合にのみ、リスト 内のすべての値を削除できます
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 key
@Anuragの回答のように、これを好む理由はありますか?同じ効果があるようです。
LTRIM
繰り返し使用するアルゴリズムを想像できるので賛成です。2番目のパラメーターが最初のパラメーターを下回ったときに何が起こるかを知っておくとよいでしょう。この動作を利用することで、一部のコードがよりエレガントになることがわかります。
受け入れられた答えは間違っています。私が持っていると思います
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.
私はこれを試しました、そしてそれは私のために働きます。リスト名のmyListを変更して実行するだけです
redis-cli KEYS "myList:*" | xargs redis-cli DEL
keys
しますが、データベース内のすべてのキーを解析する必要がある非常に重い操作です。この場合、またはほとんどの場合、これはまったく不要です
これは応答が遅い可能性がありますが、誰かがまだその機能を必要としている場合に備えて、ここに貼り付けています。
簡潔な答え
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を追加すると、最初の要素の前になるため、その範囲内の要素は残りません。
ltrim mylist 0 -99999
。