2012-11-02 93 views
15

我讀過redis.io提供的mass-insert,但它讓我很困惑。我試圖做一個文件,然後使用 「貓的data.txt | Redis的-CLI --pipe」 插入: 如何使用Redis批量插入?

SET Key0 Value0 
    SET Key1 Value1 
    SET Key2 Value3 

後來我有這樣的:

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' 

我也試過

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

後來我有這樣的:ERR協議錯誤:無效的多批量長度

這真的讓我感到困惑。任何人都可以給我一個簡單的例子?非常感謝你。

回答

7

這就是:

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 

你的問題很可能來自CR + LF分隔符。您可以使用hexdump都-C命令檢查了這一點:

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 

而且,你可能要檢查你的目標是最近Redis的實例,而不是前1-2版本(不支持「 unified protocol「)。

注意:上面的行與zsh正常工作。如果你使用bash,你需要報價前添加$引發ANSI-C報價:

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

我使用2.4.14版本。它支持協議。我得到了:$ echo -n'* 3 \ r \ n $ 3 \ r \ nset \ r \ n $ 3 \ r \ nkey \ n \ r $ 5 \ r \ nvalue \ r \ n'| ./src/redis-cli --pipe 傳輸的所有數據。等待最後一個答覆... ERR協議錯誤:無效multibulk長度 – wyp

+0

對於hexdump -C,我得到了「| * 3 \ r \ n $ 3 \ r \ nset \ |」,而不是| * 3 .. $ 3 ..設置.. $ 3 |。謝謝您的回答。 – wyp

+0

所以這意味着\ r \ n沒有正確解釋你的shell - 你使用bash或其他shell嗎?我用zsh來獲得這個輸出。 –

3

你可以這樣說:

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

我希望可以幫助你!

4

我能夠使用SET Key0 Value0表單工作。

請看看https://stackoverflow.com/a/30511742/2613942

的答覆是關於LPUSH命令。它也適用於SET

總之,雙引號中的參數

SET "mykey" "myval" 

變化從UNIX文件到windows與unix2dos格式:使用

unix2dos myfile.txt 

然後導入

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

這對我有用。