How to use Redis mass insertion?

2019-01-26 04:45发布

I've read mass-insert provided at redis.io, but it really confused me. I tried to make a file then use "cat data.txt | redis-cli --pipe" to insert:

    SET Key0 Value0
    SET Key1 Value1
    SET Key2 Value3

Then I got this:

    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'

I also tried

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

Then I got this: ERR Protocol error: invalid multi bulk length

It really make me confused. Can anyone give me a simple example? Thank you very much.

标签: redis
3条回答
爷的心禁止访问
2楼-- · 2019-01-26 05:23

I was able to work with the SET Key0 Value0 form.

Please have a look at https://stackoverflow.com/a/30511742/2613942

The reply is about the LPUSH command. It also works fine with SET.

To summarize, double-quote the parameters

SET "mykey" "myval"

Change the format of the file from unix to windows with unix2dos:

unix2dos myfile.txt

Then import using

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

That worked for me.

查看更多
欢心
3楼-- · 2019-01-26 05:27

Here it is:

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

Your problem probably comes from the cr+lf separators. You can use the hexdump -C command to check this point:

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

Also, you may want to check your target is a recent Redis instance and not a pre-1-2 version (which does not support the "unified protocol").

Note: the above lines works fine with zsh. If you use bash, you need to add a $ before the quote to trigger ANSI-C quoting:

echo -n $'*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvalue\r\n' | hexdump -C
查看更多
beautiful°
4楼-- · 2019-01-26 05:28

You can do it like this:

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

I hope that helps you!

查看更多
登录 后发表回答