Các lệnh kết xuất / khôi phục không thực sự được thiết kế để sử dụng từ dòng lệnh, bởi vì định dạng tuần tự hóa là nhị phân (nó giống như một định dạng được sử dụng cho kết xuất RDB). Nó gây bất tiện vì shell có xu hướng diễn giải các ký tự đó (ngay cả khi định dạng "có thể in" được sử dụng).
Đây là định dạng "có thể in":
$ 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."
Định dạng "có thể in" không thể được sử dụng làm đầu vào cho tùy chọn -x thực sự mong đợi dữ liệu thực tế. Đây là một hành vi gây hiểu lầm của redis-cli.
Tuy nhiên, có một cách dễ dàng để lấy định dạng thô:
$ 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 |..|
Bây giờ, không thể truyền trực tiếp kết quả của kết xuất --raw trong khôi phục -x, vì ký tự cuối cùng bị sai. So sánh đầu ra của kết xuất --raw và in được. Bạn sẽ nhận thấy tùy chọn --raw thêm một \ n bổ sung ở cuối. Tùy chọn thô không phải là 100% thô;-)
Ký tự thừa này cần được xóa trước khi dữ liệu có thể được xử lý bằng tùy chọn -x. Cuối cùng, lệnh chính xác (trên hệ thống GNU / Linux) để chuyển đầu ra của kết xuất trong khôi phục là:
$ redis-cli --raw dump test | head -c-1 | redis-cli -x restore test1 0
OK
Điều này không đẹp. Tôi hy vọng hầu hết mọi người sẽ dựa vào tập lệnh perl / python / ruby hơn là shell để thực hiện các tác vụ như vậy.