Redis
 sql >> Database >  >> NoSQL >> Redis

Come usare redis' `DUMP` e `RESTORE` (offline)?

I comandi dump/restore non sono realmente progettati per essere utilizzati dalla riga di comando, poiché il formato di serializzazione è binario (è lo stesso utilizzato per i dump RDB). Lo rende scomodo perché la shell tende a interpretare quei caratteri (anche quando viene utilizzato il formato "stampabile").

Ecco il formato "stampabile":

$ redis-cli lpush test 1 2 3 4 5
(integer) 5
$ redis-cli dump test
"\n\x15\x15\x00\x00\x00\x12\x00\x00\x00\x05\x00\x00\xf6\x02\xf5\x02\xf4\x02\xf3\x02\xf2\xff\x06\x00\x1c\x8a\xda\x0e}\xcb\xe1."

Il formato "stampabile" non può essere utilizzato come input per l'opzione -x che si aspetta davvero i dati effettivi. Questo è un comportamento fuorviante di redis-cli.

Tuttavia, esiste un modo semplice per ottenere il formato non elaborato:

$ redis-cli --raw dump test | hexdump -C
00000000  0a 15 15 00 00 00 12 00  00 00 05 00 00 f6 02 f5  |................|
00000010  02 f4 02 f3 02 f2 ff 06  00 1c 8a da 0e 7d cb e1  |.............}..|
00000020  2e 0a                                             |..|

Ora, non è possibile reindirizzare direttamente il risultato di un dump --raw in un ripristino -x, perché l'ultimo carattere è sbagliato. Confronta l'output del dump --raw e printable. Noterai che l'opzione --raw aggiunge un \n extra alla fine. L'opzione grezza non è grezza al 100%;-)

Questo carattere aggiuntivo deve essere rimosso prima che i dati possano essere elaborati dall'opzione -x. Infine, il comando corretto (su un sistema GNU/Linux) per reindirizzare l'output di un dump in un ripristino è:

$ redis-cli --raw dump test | head -c-1 | redis-cli -x restore test1 0
OK

Questo non è carino. Mi aspetto che la maggior parte delle persone faccia affidamento su uno script perl/python/ruby piuttosto che sulla shell per svolgere tali attività.