Introduzione
Redis è un datastore open-source di tipo chiave-valore in memoria. Un datastore chiave-valore è un tipo di database NoSQL in cui le chiavi fungono da identificatori unici per i loro valori associati. Ogni istanza di Redis include un certo numero di database, ognuno dei quali può contenere molte chiavi diverse di vari tipi di dati.
In questa guida, imparerai come selezionare un database, spostare chiavi tra database e gestire ed eliminare chiavi.
Come Usare Questa Guida
Questa guida è scritta come un promemoria con esempi autocontenuti. Ti incoraggiamo a saltare a qualsiasi sezione rilevante per il compito che stai cercando di completare.
I comandi mostrati in questa guida sono stati testati su un server Ubuntu 22.04 con Redis versione 6.0.16. Per configurare un ambiente simile, puoi seguire Passo 1 della nostra guida su Come Installare e Sicurizzare Redis su Ubuntu 22.04. Dimostreremo come si comportano questi comandi eseguendoli con redis-cli
, l’interfaccia a riga di comando di Redis. Nota che se stai utilizzando un’interfaccia Redis diversa, ad esempio Redli, l’output esatto di alcuni comandi potrebbe essere diverso.
In alternativa, puoi fornire un’istanza di database Redis gestita per testare questi comandi, ma a seconda del livello di controllo consentito dal tuo provider di database, alcuni comandi in questa guida potrebbero non funzionare come descritto. Per fornire un Database Gestito DigitalOcean, segui la nostra documentazione sul prodotto Managed Databases. Quindi, devi o installare Redli o configurare un tunnel TLS per connetterti al Database Gestito tramite TLS.
Gestione dei Database
Fuori dalla scatola, un’istanza di Redis supporta 16 database logici. Questi database sono effettivamente isolati l’uno dall’altro e quando esegui un comando in un database, non influisce sui dati memorizzati negli altri database della tua istanza di Redis.
I database Redis sono numerati da 0
a 15
e, per impostazione predefinita, ti connetti al database 0
quando ti colleghi alla tua istanza di Redis. Tuttavia, puoi cambiare il database che stai usando con il comando select
dopo la connessione:
- select 15
Se hai selezionato un database diverso da 0
, ciò sarà riflesso nel prompt di redis-cli
:
-
Per scambiare tutti i dati detenuti in un database con i dati detenuti in un altro, usa il comando swapdb
. Nell’esempio seguente verranno scambiati i dati detenuti nel database 6
con quelli nel database 8
, e tutti i client connessi a uno qualsiasi dei database saranno in grado di implementare immediatamente le modifiche:
- swapdb 6 8
swapdb
restituirà OK
se lo scambio avrà successo.
Se vuoi spostare una chiave su un’altra istanza di Redis, puoi eseguire migrate
. Questo comando assicura che la chiave esista nell’istanza di destinazione prima di cancellarla dall’istanza di origine. Quando esegui migrate
, il comando deve includere gli elementi seguenti in questo ordine:
- L’hostname o l’indirizzo IP del database di destinazione
- Il numero di porta del database di destinazione
- Il nome della chiave che vuoi migrare
- Il numero del database in cui vuoi memorizzare la chiave nell’istanza di destinazione
- A timeout, in milliseconds, which defines the maximum amount of idle communication time between the two machines. Note that this isn’t a time limit for the operation, but means that the operation should always make some level of progress within the defined length of time
Per illustrare, ecco un esempio:
- migrate 203.0.113.0 6379 key_1 7 8000
Inoltre, migrate
consente le seguenti opzioni che puoi aggiungere dopo l’argomento timeout:
COPY
: Specifica che la chiave non deve essere eliminata dall’istanza di origineREPLACE
: Specifica che se la chiave esiste già sulla destinazione, l’operazionemigrate
dovrebbe eliminarla e sostituirlaKEYS
: Invece di fornire una chiave specifica da migrare, puoi inserire una stringa vuota (""
) e quindi utilizzare la sintassi del comandokeys
per migrare qualsiasi chiave che corrisponde a un modello. Per ulteriori informazioni su come funziona il comandokeys
, leggi il nostro tutorial su Come Risolvere i Problemi in Redis.
Gestione delle Chiavi
Esistono diversi comandi Redis utili per gestire le chiavi indipendentemente dal tipo di dati che contengono. Alcuni di questi comandi sono esaminati nella sezione seguente.
rename
rinominerà la chiave specificata. Se avviene con successo, restituirà OK
:
- rename old_key new_key
Puoi utilizzare randomkey
per restituire una chiave casuale dal database attualmente selezionato:
- randomkey
Output"any_key"
Usa type
per determinare che tipo di dati contiene la chiave fornita. L’output di questo comando può essere string
, list
, hash
, set
, zset
o stream
:
- type key_1
Output"string"
Se la chiave specificata non esiste, type
restituirà invece none
.
Puoi spostare una singola chiave in un’altra base dati nella tua istanza di Redis con il comando move
. move
prende il nome di una chiave e la base dati in cui desideri spostare la chiave come argomenti. Ad esempio, per spostare la chiave key_1
nella base dati 8
, eseguiresti il seguente:
- move key_1 8
move
restituirà OK
se lo spostamento della chiave è stato eseguito con successo.
Eliminazione delle Chiavi
Per eliminare una o più chiavi di qualsiasi tipo di dato, usa il comando del
seguito da una o più chiavi che desideri eliminare:
- del key_1 key_2
Se questo comando elimina con successo la/e chiave/i, restituirà (integer) 1
. Altrimenti, restituirà (integer) 0
.
Il comando unlink
svolge una funzione simile a del
, con la differenza che del
blocca il client mentre il server recupera la memoria occupata dalla chiave. Se la chiave da eliminare è associata a un oggetto di piccole dimensioni, il tempo impiegato da del
per recuperare la memoria è molto breve e il tempo di blocco potrebbe non essere nemmeno notato.
Tuttavia, può diventare scomodo se ad esempio la chiave che stai eliminando è associata a molti oggetti, come un hash con migliaia o milioni di campi. L’eliminazione di una tale chiave può richiedere un tempo notevolmente lungo e sarai bloccato nel fare altre operazioni finché non verrà completamente rimossa dalla memoria del server.
unlink
, invece, determina prima il costo di deallocazione della memoria occupata dalla chiave. Se è piccolo, allora unlink
funziona allo stesso modo di del
eliminando immediatamente la chiave e bloccando anche il client. Tuttavia, se il costo di deallocazione della memoria per una chiave è elevato, unlink
eliminerà la chiave in modo asincrono creando un altro thread e recuperando gradualmente la memoria in background senza bloccare il client:
- unlink key_1
Poiché viene eseguito in background, è generalmente consigliato utilizzare unlink
per rimuovere le chiavi dal server al fine di ridurre gli errori nei client, anche se del
sarà sufficiente in molti casi.
Avviso: I seguenti due comandi sono considerati pericolosi. I comandi flushdb
e flushall
cancelleranno in modo irreversibile tutte le chiavi in un singolo database e tutte le chiavi in ogni database sul server Redis, rispettivamente. È consigliato eseguire questi comandi solo se sei assolutamente certo di voler eliminare tutte le chiavi nel tuo database o server.
Potrebbe essere nel tuo interesse rinominare questi comandi con qualcosa che ha una minore probabilità di essere eseguito accidentalmente.
Per eliminare tutte le chiavi nel database selezionato, utilizza il comando flushdb
:
- flushdb
Per eliminare tutte le chiavi in ogni database su un server Redis (compreso il database attualmente selezionato), esegui flushall
:
- flushall
Sia flushdb
che flushall
accettano l’opzione async
, che consente di eliminare tutte le chiavi su un singolo database o su ogni database nel cluster in modo asincrono. Ciò consente loro di funzionare in modo simile al comando unlink
, creando un nuovo thread per liberare progressivamente la memoria in background.
Backup del tuo Database
Per creare un backup del database attualmente selezionato, puoi utilizzare il comando save
:
- save
Questo esporterà uno snapshot dell’attuale set di dati come file .rdb
, che è un file di dump del database che conserva i dati in un formato di serializzazione interno e compresso.
save
viene eseguito in modo sincrono e bloccherà ogni altro client connesso al database. Pertanto, il documento del comando save
consiglia che questo comando dovrebbe essere quasi mai eseguito in un ambiente di produzione. Invece, suggerisce di utilizzare il comando bgsave
. Questo comando dice a Redis di biforcarsi: il processo genitore continuerà a servire i client mentre il processo figlio salva il database prima di uscire:
- bgsave
Nota che se i client aggiungono o modificano dati mentre l’operazione bgsave
è in corso, queste modifiche non verranno catturate nello snapshot.
Puoi anche modificare il file di configurazione di Redis per far salvare automaticamente uno snapshot (noto come snapshotting o modalità RDB) dopo un certo periodo se un numero minimo di modifiche è stato apportato al database. Questo è noto come punto di salvataggio. Le seguenti impostazioni del punto di salvataggio sono abilitate per impostazione predefinita nel file redis.conf
:
. . .
save 900 1
save 300 10
save 60 10000
. . .
dbfilename "nextfile.rdb"
. . .
Con queste impostazioni, Redis esporterà uno snapshot del database nel file definito dal parametro dbfilename
ogni 900 secondi se viene cambiata almeno una chiave, ogni 300 secondi se vengono cambiate almeno 10 chiavi e ogni 60 secondi se vengono cambiate almeno 10000 chiavi.
Puoi utilizzare il comando shutdown
per eseguire il backup dei tuoi dati Redis e quindi chiudere la connessione. Questo comando bloccherà ogni client connesso al database e successivamente eseguirà un’operazione save
se è configurato almeno un punto di salvataggio, il che significa che esporterà il database nel suo stato attuale in un file .rdb
impedendo ai client di apportare modifiche.
Inoltre, il comando shutdown
scaricherà le modifiche nel file append-only di Redis prima di uscire se la modalità append-only è abilitata. La modalità file append-only (AOF) comporta la creazione di un registro di ogni operazione di scrittura sul server in un file con estensione .aof
dopo ogni snapshot. Le modalità AOF e RDB possono essere abilitate sullo stesso server e l’utilizzo di entrambi i metodi di persistenza è un modo efficace per eseguire il backup dei dati.
In breve, il comando shutdown
è essenzialmente un comando save
bloccante che scarica anche tutte le modifiche recenti nel file append-only e chiude la connessione all’istanza di Redis:
Avviso: Il comando shutdown
è considerato pericoloso. Bloccando i client del server Redis, è possibile rendere i dati non disponibili agli utenti e alle applicazioni che ne dipendono. Si consiglia di eseguire questo comando solo se si sta testando il comportamento di Redis o se si è assolutamente certi di voler bloccare tutti i client del server Redis.
In effetti, potrebbe essere nel vostro interesse rinominare questo comando con un nome con una probabilità inferiore di essere eseguito accidentalmente.
- shutdown
Se non avete configurato nessun punto di salvataggio ma volete comunque che Redis esegua un’operazione di save
, aggiungete l’opzione save
al comando shutdown
:
- shutdown save
Se hai configurato almeno un punto di salvataggio ma vuoi spegnere il server Redis senza eseguire un salvataggio, puoi aggiungere l’argomento nosave
al comando:
- shutdown nosave
Nota che il file di tipo append-only può diventare molto lungo nel tempo, ma puoi configurare Redis per riscrivere il file in base a certe variabili modificando il file redis.conf
. Puoi anche istruire Redis a riscrivere il file di tipo append-only eseguendo il comando bgrewriteaof
:
- bgrewriteaof
bgrewriteaof
creerà il set più breve di comandi necessari per riportare il database al suo stato attuale. Come suggerisce il nome di questo comando, verrà eseguito in background. Tuttavia, se un altro comando di persistenza è già in esecuzione in background, quel comando deve terminare prima che Redis esegua bgrewriteaof
.
Conclusioni
Questo manuale dettaglia una serie di comandi utilizzati per gestire database e chiavi. Se ci sono altri comandi, argomenti o procedure correlati di cui desideri sapere di più in questo manuale, per favore chiedi o fai suggerimenti nei commenti.
Per ulteriori informazioni sui comandi Redis, consulta la nostra serie di tutorial su Come Gestire un Database Redis.
Source:
https://www.digitalocean.com/community/cheatsheets/how-to-manage-redis-databases-and-keys