2015-10-01 7 views
10

Abbiamo una lista di centinaia di migliaia di chiavi Redis contenenti tutti i tipi di caratteri speciali e vorremmo eliminarli in blocco. Ci sono alcuni grandi risposte a un problema simile su questa questione: How to atomically delete keys matching a pattern using RedisCome eliminare in blocco centinaia di migliaia di chiavi con caratteri speciali in Redis

TUTTAVIA, non riesco a trovare una risposta per il caso in cui:

  1. abbiamo un gran numero di chiavi (centinaia di migliaia)
  2. i tasti hanno tutte le maniere di caratteri speciali come virgolette ("), backslash(), tutti i tipi di caratteri Unicode strani, ecc
  3. Stiamo utilizzando le finestre Redis-CLI client
  4. Bonus: Idealmente saremmo in grado di emettere questo comando come par t di una transazione MULTI/EXEC così possiamo anche cancellare un SET atomicamente insieme ai tasti.

Mi piacerebbe se solo potessimo fare qualcosa di simile al di sotto, ma hanno maneggia chiavi con tutti i caratteri speciali che danno problemi Redis:

redis-cli SMEMBERS "myGiganticListOfKeys" | xargs --delim='\n' redis-cli DEL

Purtroppo questo solo dà il seguito errore:

"C:/Program Files (x86)/Git/bin/xargs.exe": redis-cli: Bad file number

penso che questo sarebbe altrimenti funzionare se non avessimo i caratteri speciali nei tasti.

Grazie mille in anticipo.

+0

Non sono intimo con il fork di Windows, ma se redis-cli supporta l'opzione --pipe, puoi preparare un file di testo con tutti i comandi 'DEL ' e collegarlo direttamente. –

+0

@RyanVincent In realtà abbiamo l'elenco esatto delle chiavi che vogliamo eliminare - sono in un set. Il problema sta prendendo quel set (ad esempio SMEMBERS "myKeyName") e cancellandoli tutti quando c'è un numero grande e le chiavi hanno caratteri speciali. – jakejgordon

+0

Grazie per l'idea @ ItamarHaber, ma anche se questo ha funzionato - cosa che indovino non è come dubito che sia diverso dall'avere la lista di chiavi disponibile da SMEMBERS mykeyName - non sarebbe terribilmente pratico come stiamo provando a scrivere uno script PowerShell riutilizzabile per eliminare tutte le chiavi che si trovano in un set specificato. Creare un file temporaneo come parte di questo processo e quindi ripulirlo non sarebbe l'ideale. Grazie comunque. – jakejgordon

risposta

1

Si dovrebbe provare a creare un'applicazione utilizzando un client più robusto. Vedere client list. redis-cli è un'utilità di riga di comando molto semplice pensata solo per hackerare/giocare con Redis.

Sono d'accordo con te sul fatto che il migliore sarà riprogettare il tuo negozio di chiavi/valore.

Considerare l'utilizzo di un meccanismo di codifica se è necessario invalidare più chiavi: utilizzare un hash per raggruppare le chiavi per tag quando vengono aggiunte le chiavi e quindi invalidare l'intero tag rimuovendo tutte le chiavi dell'hash.

+0

Questo è davvero ciò che dovremo fare. Grazie. – jakejgordon

0

Ecco come ho risolto, questo funziona per milioni di record senza sottolineare i redis.

WARNING: PLEASE DO NOT TRY THIS AT HOME UNATTENDED AND MAKE SURE TO WEAR 
ALL SAFETY EQUIPMENT NECESSARY FOR THE TASK. 

Punto 1. Dump tutti i tasti necessari da Redis a un file, consente di chiamare questo file YES_WE_CAN.sh

redis-cli KEYS "StartsWith*" > YES_WE_CAN.sh 

Fase 2: Aprire il YES_WE_CAN.sh file con vi o vim e premere il carattere :, quindi digitare quanto segue per sostituire il carattere speciale ':

:%s/'/'"'"'/g 

Questo sostituirà tutti i caratteri ' con sequenza di escape '"'"'. (Fidati di me, funziona, continua!)

Fase 3: Anteponi ogni stringa redis-cli DEL (non dimenticare lo spazio alla fine):

:%s/^/redis-cli DEL /g 

Fase 4: accoda alla fine di ogni riga il carattere ':

:%s/$/'/g 

Fase 5: Salvare il file e qu utilizzando :wq

Passo 6: Modificare il file YES_WE_CAN.sh alla modalità eseguibile:

chmod +x YES_WE_CAN.sh 

Passo 7: Eseguire il file:

./YES_WE_CAN.sh 

gustare un caffè mentre lo script elimina i milioni di chiavi che hai richiesto.