Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como usar o redis 'DUMP' e 'RESTORE' (offline)?


Os comandos dump/restore não são realmente projetados para serem usados ​​na linha de comando, porque o formato de serialização é binário (é o mesmo usado para dumps RDB). Isso o torna inconveniente porque o shell tende a interpretar esses caracteres (mesmo quando o formato "imprimível" é usado).

Aqui está o formato "imprimível":
$ 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."

O formato "imprimível" não pode ser usado como entrada para a opção -x que realmente espera os dados reais. Este é um comportamento enganoso do redis-cli.

No entanto, existe uma maneira fácil de obter o formato bruto:
$ 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                                             |..|

Agora, não é possível canalizar diretamente o resultado de um dump --raw em uma restauração -x, porque o último caractere está errado. Compare a saída do dump --raw e imprimível. Você notará que a opção --raw adiciona um \n extra no final. A opção raw não é 100% raw;-)

Esse caractere extra precisa ser removido antes que os dados possam ser processados ​​pela opção -x. Finalmente, o comando correto (em um sistema GNU/Linux) para canalizar a saída de um dump em uma restauração é:
$ redis-cli --raw dump test | head -c-1 | redis-cli -x restore test1 0
OK

Isso não é bonito. Espero que a maioria das pessoas confie em um script perl/python/ruby em vez do shell para fazer essas tarefas.