2012-03-22 13 views
53

Supponiamo di avere un tipo di dati LIST in Redis. Come si eliminano tutte le sue voci? Ho già provato questo:Elimina tutte le voci in un elenco Redis

LTRIM key 0 0 
LTRIM key -1 0 

Entrambi lasciano il primo elemento. Ciò lascerà tutti gli elementi:

LTRIM key 0 -1 

Non vedo un comando separato per svuotare completamente un elenco.

+2

@DavidJames: consideralo un altro modo di pronunciare "foo". Sto seguendo la convenzione utilizzata nella documentazione di Redis: http://redis.io/commands/ –

+0

Sì, in redis, tutte le strutture dati sono chiavi. Ciò non significa che "chiave" sia utile in un esempio. Al contrario, penso. L'uso di 'mylist' renderebbe più chiara la tua domanda. Ad esempio, http://redis.io/commands/ltrim/ scrive: 'LTRIM mylist 1 -1'. La pagina che citi è un comando * riferimento * e non dovrebbe essere considerata una "convenzione" per fare buoni esempi. –

risposta

94

Eliminare la chiave e questo cancellerà tutte le voci. Non avere affatto l'elenco è simile a non avere alcun elemento in esso. Redis non genererà alcuna eccezione quando si tenta di accedere a una chiave inesistente.

DEL key 

Ecco alcuni registri della console.

 
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

C'è un modo per farlo in una operazione atomica? (sia "LRANGE names 0 2" che "DEL names") – refaelos

+0

Sì. Vedi transazioni Redis - http://redis.io/topics/transactions – Anurag

+1

Una cosa, usando Del 'può creare un sovraccarico aggiuntivo, Complessità del tempo: O (N) dove N è il numero di chiavi che verranno rimosse. Quando una chiave da rimuovere contiene un valore diverso da una stringa, la complessità individuale per questa chiave è O (M) dove M è il numero di elementi nell'elenco, set, set ordinato o hash. La rimozione di una singola chiave che contiene un valore di stringa è O (1). Il [docs] (http://redis.io/commands/del) –

11

È possibile rimuovere tutti i valori nella lista solo se Listha più di un valore

LTRIM key -1 0 

Esempio:

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" 

Ma se la lista ha un valore onl y, è necessario utilizzare

DEL key 
-1

la risposta accettata è errata. supponiamo di avere

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

per utilizzare l'esempio di ahmed, che in realtà è corretto. ora, se lo faccio:

DEL 'test4' 

io alla fine con:

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

così, io non ha rimosso tutte le voci dalla lista 'test4', i rimosso test4 stesso. non è la stessa cosa Affatto. Ho una piccola app in cui le chiavi della lista sono hash calcolate da più dati (beh, non sono tutti?), quelle liste a volte vengono cancellate, ma la semantica di una lista vuota e una lista inesistente sono molto diverse. quindi, no, non voglio DEL 'myhashes', voglio solo rimuovere tutte le voci.

Attenzione, oh voi che vaga qui.

+0

Se si guarda la pagina citata qui sotto vedi che in effetti la semantica è la stessa! Preso [da] (http://redis.io/topics/data-types#lists): "Il comando LPUSH inserisce un nuovo elemento sulla testa, mentre RPUSH inserisce un nuovo elemento sulla coda. Un nuovo elenco viene creato quando una di queste operazioni viene eseguita su una chiave vuota. Allo stesso modo, la chiave viene rimossa dallo spazio chiave se un'operazione di elenco svuota l'elenco. Queste semantiche sono molto utili dato che tutti i comandi della lista si comporteranno esattamente come se fossero stati chiamati con una lista vuota se chiamati con una chiave non esistente come argomento. " – Dominic

+0

dalla bocca dei cavalli:" Allo stesso modo la chiave viene rimossa dallo spazio della chiave se un'operazione di lista svuoterà la lista. " quindi, è {[], [], []} === {[]}? non per me. Immagino che siamo in diversi spazi topologici .... :) – deimosaffair

+0

Bene, la domanda iniziale era come eliminare un'intera Lista in redis. quindi se si elimina la chiave o si eliminano tutte le voci e si ha la chiave rimossa automaticamente da redis si ottiene lo stesso risultato. Quindi non sono sicuro di cosa intendi con {[], [], []} === {[]}. – Dominic

1

Rispondendo al mio telefono non è possibile formattare correttamente la risposta.

Questa potrebbe essere una risposta tardiva, ma la applico qui solo nel caso in cui qualcuno abbia ancora bisogno di quella funzionalità.

Risposta breve

ltrim mylist 0 - (n + 1) dove mylist è la chiave e n è la lunghezza della myList.

Risposta lunga

modo in cui funziona è che LTRIM, ci vogliono due indici e restituire gli elementi che rientrano tra loro comprensivo degli indici.

lista Ltrim startIndex endIndex

Esempio supponendo che abbiamo una lista redis con mylist chiave contenente 10 voci:

ltrim mylist 0 5 taglierà la lista di elementi a partire dall'indice 0 a all'indice 5. E scarta quelli che non rientrano in questo raggio.

Fortunatamente le operazioni di lista redis supportano l'indicizzazione negativa che si rivela estremamente utile in alcune situazioni. In genere quando non si conosce la lunghezza della lista.

-1 si riferisce all'ultimo elemento, - 2 penultimo elemento, ecc. E (-n) è il primo elemento.

Gli indici fuori intervallo non sono dannosi. Se l'indice finale è maggiore della lunghezza dell'elenco, redis lo considera uguale all'ultimo indice.

Ecco perché ltrim mylist 0, - (n +1) cancella l'elenco. Lo fa perché (-n) è equivalente all'indice 0. L'aggiunta di 1 ad esso non lascia alcun elemento all'interno di quell'intervallo poiché ciò sarà prima del primo elemento.

+0

Grazie per aver condiviso i tuoi approfondimenti. Come estensione della tua risposta, potresti semplicemente fornire un valore N che è sufficientemente più grande della lista per garantire che tutti gli elementi siano cancellati. Ad esempio 'ltrim mylist 0 -99999'. –

Problemi correlati