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> 키 * (빈 목록 또는 세트) 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 (빈 목록 또는 세트)
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"
그러나 목록에 하나의 값만있는 경우 다음을 사용해야합니다.
DEL key
DEL key
@Anurag의 답변에서 와 같이 이것을 선호하는 이유가 있습니까? 같은 효과가있는 것 같습니다.
LTRIM
반복적으로 사용하는 알고리즘을 상상할 수 있기 때문에 Upvoted 이며 두 번째 매개 변수가 첫 번째 매개 변수 아래로 떨어질 때 어떤 일이 발생하는지 아는 것이 좋습니다. 이 동작을 악용하면 코드를 더 우아하게 만드는 방법을 알 수 있습니다.
받아 들여지는 대답이 잘못되었습니다. 내가 가지고 있다고 가정
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.
이것은 늦은 응답 일 수 있지만 누군가가 여전히 해당 기능이 필요한 경우를 대비하여 여기에 고정하고 있습니다.
짧은 대답
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을 더하면 첫 번째 요소 앞에 있기 때문에 해당 범위 내에 요소가 남지 않습니다.
ltrim mylist 0 -99999
.