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> 키 *
(빈 목록 또는 세트)
redis> LPUSH 이름 John
(정수) 1
redis> LPUSH 이름 Mary
(정수) 2
redis> LPUSH 이름 Alice
(정수) 3
redis> LLEN 이름
(정수) 3
redis> LRANGE 이름 0 2
1) "앨리스"
2) "메리"
3) "존"
redis> DEL 이름
(정수) 1
redis> LLEN 이름
(정수) 0
redis> LRANGE 이름 0 2
(빈 목록 또는 세트)

하나의 원자 작업으로이를 수행 할 수있는 방법이 있습니까? ( "LRANGE names 0 2"및 "DEL names"모두)
refaelos

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"

그러나 목록에 하나의 값만있는 경우 다음을 사용해야합니다.

DEL key 

수락 된 답변의 주석에서 언급 한 것처럼 : DEL 키는 목록의 ttl도 제거합니다
patrick

4

LTRIM을 사용하십시오 . ... Aaaand 마법 여기가 사용하는 것입니다 start 보다 크다 end .

LTRIM key 99 0

그리고 ... 붐! 전체 요소 목록이 있습니다. 그냥 * 똥 * 바로 눈앞에 !! 잔여 물이 남아 있지 않으며 질문이 전혀 없습니다.

참고 : 이렇게하면 여기에 설명 된대로 키가 "제거됨"( 삭제됨 과 같이) 됩니다.

... 시작이 목록의 끝보다 크거나 시작> 끝이면 결과는 빈 목록이됩니다 (키가 제거됨).


DEL key@Anurag의 답변에서 와 같이 이것을 선호하는 이유가 있습니까? 같은 효과가있는 것 같습니다.
Paul A Jungwirth

솔직히 아니, 벤치 마크를 조사 할 시간이 없었고, 위의 방법을 발견했을 때 문서를 읽고 있었기 때문에 그것을 언급하는 것이 좋을 것이라고 생각했습니다.
Mohd Abdul Mujib

1
괜찮 감사! LTRIM반복적으로 사용하는 알고리즘을 상상할 수 있기 때문에 Upvoted 이며 두 번째 매개 변수가 첫 번째 매개 변수 아래로 떨어질 때 어떤 일이 발생하는지 아는 것이 좋습니다. 이 동작을 악용하면 코드를 더 우아하게 만드는 방법을 알 수 있습니다.
Paul A Jungwirth

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'를 삭제하고 싶지 않습니다. 모든 항목을 제거하고 싶습니다.

오, 여기서 방황하는 너희는 조심하라.


아래 인용 된 페이지를 보면 실제로 의미가 동일하다는 것을 알 수 있습니다! 촬영 에서 :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

처음 질문은 redis에서 전체 목록을 삭제하는 방법이었습니다. 따라서 키를 삭제하거나 모든 항목을 삭제하고 redis에서 키를 자동으로 제거하면 동일한 결과가 나타납니다. 따라서 {[], [], []} === {[]}의 의미를 잘 모르겠습니다.
Dominic

목록에서 마지막 요소를 제거하는 것은 키를 삭제하는 것과 같습니다. LIST 심지어 같은도 (RPOPLPUSH 테스트)로이 링크 bennadel.com/blog/...
Kanagavelu Sugumar

0

나는 이것을 시도했고 그것은 나를 위해 작동합니다. 목록 이름으로 myList 를 변경 하고 실행하십시오. redis-cli KEYS "myList:*" | xargs redis-cli DEL


1
이 작업 keys은 작동하지만 데이터베이스의 모든 단일 키를 구문 분석하는 매우 무거운 작업입니다.이 경우에는 필요하지
않으며

0

이것은 늦은 응답 일 수 있지만 누군가가 여전히 해당 기능이 필요한 경우를 대비하여 여기에 고정하고 있습니다.

짧은 대답

ltrim mylist 0-(n + 1) 여기서 mylist는 key이고 n은 mylist의 길이입니다.

긴 대답

ltrim이 작동하는 방식은 두 개의 인덱스를 취하고 인덱스를 포함하여 그 사이에있는 요소를 반환한다는 것입니다.

Ltrim 목록 startIndex endIndex

10 개의 항목이 포함 된 mylist 키가있는 redis 목록이 있다고 가정하는 예 :

ltrim mylist 0 5는 인덱스 0부터 인덱스 5까지의 요소로 목록을 트리밍하고 해당 범위를 벗어나는 요소는 버립니다.

다행히 redis 목록 작업은 일부 상황에서 매우 유용한 것으로 입증 된 네거티브 인덱싱을 지원합니다. 일반적으로 목록의 길이를 모를 때.

-1은 마지막 요소, -2는 두 번째 요소 등을 나타냅니다. 그리고 (-n)은 첫 번째 요소입니다.

범위를 벗어난 인덱스는 유해하지 않습니다. 끝 인덱스가 목록의 길이보다 크면 redis는이를 마지막 인덱스와 동일하게 처리합니다.

이것이 ltrim mylist 0,-(n +1) 목록을 지우는 이유입니다. (-n)은 인덱스 0과 동일하기 때문입니다. 여기에 1을 더하면 첫 번째 요소 앞에 있기 때문에 해당 범위 내에 요소가 남지 ​​않습니다.


통찰력을 공유해 주셔서 감사합니다. 답변의 확장으로 모든 항목이 삭제되도록 목록보다 충분히 큰 N 값을 제공 할 수 있습니다. 예를 들면 ltrim mylist 0 -99999.
Dave Johnson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.