2012-11-02 33 views
15

Tôi đã đọc mass-insert được cung cấp tại redis.io, nhưng nó thực sự làm tôi bối rối. Tôi cố gắng để tạo ra một tập tin sau đó sử dụng "mèo data.txt | redis-cli --pipe" để chèn: Cách sử dụng tính năng chèn khối lượng Redis?

SET Key0 Value0 
    SET Key1 Value1 
    SET Key2 Value3 

Sau đó, tôi nhận điều này:

All data transferred. Waiting for the last reply... 
    ERR wrong number of arguments for 'set' command 
    ERR unknown command '$4' 
    ERR wrong number of arguments for 'echo' command 
    ERR unknown command '$20' 

Tôi cũng đã thử

*3<cr><lf> 
    $3<cr><lf> 
    SET<cr><lf> 
    $3<cr><lf> 
    key<cr><lf> 
    $5<cr><lf> 
    value<cr><lf> 

Sau đó, tôi nhận được lỗi này: Lỗi giao thức ERR: chiều dài hàng loạt đa không hợp lệ

Nó thực sự làm tôi bối rối. Bất cứ ai có thể cho tôi một ví dụ đơn giản? Cảm ơn nhiều.

Trả lời

7

Ở đây là:

echo -n '*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | ./redis-cli --pipe 
All data transferred. Waiting for the last reply... 
Last reply received from server. 
errors: 0, replies: 1 

Vấn đề của bạn có lẽ xuất phát từ cr + lf tách. Bạn có thể sử dụng lệnh hexdump -C để kiểm tra thời điểm này:

echo -n '*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | hexdump -C 
00000000 2a 33 0d 0a 24 33 0d 0a 73 65 74 0d 0a 24 33 0d |*3..$3..set..$3.| 
00000010 0a 6b 65 79 0a 0d 24 35 0d 0a 76 61 6c 75 65 0d |.key..$5..value.| 
00000020 0a            |.| 
00000021 

Ngoài ra, bạn có thể muốn kiểm tra mục tiêu của bạn là một ví dụ Redis gần đây và không phải là một phiên bản pre-1-2 (mà không hỗ trợ " unified protocol ").

Lưu ý: các dòng trên hoạt động tốt với zsh. Nếu bạn sử dụng bash, bạn cần phải thêm một $ trước khi báo giá để kích hoạt ANSI-C trích dẫn:

echo -n $'*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | hexdump -C 
+0

Tôi sử dụng phiên bản 2.4.14. Nó hỗ trợ giao thức.Và tôi nhận được điều này: $ echo -n '* 3 \ r \ n $ 3 \ r \ nđặt \ r \ n $ 3 \ r \ nkey \ n \ r $ 5 \ r \ ngiá trị \ r \ n' | ./src/redis-cli --pipe Tất cả dữ liệu được truyền. Đang chờ trả lời cuối cùng ... Lỗi giao thức ERR: chiều dài nhiều byte không hợp lệ – wyp

+0

Đối với hexdump -C, tôi nhận được "| * 3 \ r \ n $ 3 \ r \ nset \ |", không phải | * 3 .. $ 3 .. đặt .. $ 3. |. Cảm ơn bạn vì câu trả lời. – wyp

+0

Vì vậy, nó có nghĩa là \ r \ n không được trình bày đúng bởi trình bao của bạn - bạn có sử dụng bash hoặc trình bao khác không? Tôi sử dụng zsh để có được kết quả này. –

3

Bạn có thể làm điều đó như thế này:

echo -e "$(cat data.txt)" | redis-cli --pipe 

Tôi hy vọng rằng sẽ giúp bạn!

4

Tôi có thể làm việc với biểu mẫu SET Key0 Value0.

hãy có một cái nhìn tại https://stackoverflow.com/a/30511742/2613942

Câu trả lời là về lệnh LPUSH. Nó cũng hoạt động tốt với SET.

Để tóm tắt, kích đúp trích dẫn các thông số

SET "mykey" "myval" 

Thay đổi định dạng của các tập tin từ unix để cửa sổ với unix2dos:

unix2dos myfile.txt 

Sau đó, nhập khẩu sử dụng

cat myfile.txt | src/redis-cli --pipe

Điều đó làm việc cho tôi.

Các vấn đề liên quan