【问题标题】:How to use Redis mass insertion?如何使用 Redis 批量插入?
【发布时间】:2012-10-23 02:50:47
【问题描述】:

我已经阅读了 redis.io 提供的mass-insert,但这真的让我很困惑。我尝试制作一个文件,然后使用“cat data.txt | redis-cli --pipe”插入:

    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 协议错误:无效的多批量长度

这真的让我很困惑。谁能给我一个简单的例子?非常感谢。

【问题讨论】:

    标签: redis


    【解决方案1】:

    这里是:

    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
    

    【讨论】:

    • 我用的是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 协议错误:无效的多批量长度
    • 对于 hexdump -C,我得到了“|*3\r\n$3\r\nset\|”,而不是 |*3..$3..set..$3.|。谢谢你的回答。
    • 所以这意味着您的 shell 没有正确解释 \r\n - 您使用 bash 还是其他 shell?我使用 zsh 来获得这个输出。
    • 我使用的是 Macbook。这是 bash。
    • 不,您只需要找到如何使用 OSX shell 生成正确的字符序列(即 cr+lf = 0d0a in hex)
    【解决方案2】:

    你可以这样做:

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

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      我能够使用SET Key0 Value0 表单。

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

      回复是关于LPUSH 命令。它也适用于SET

      总结,双引号参数

      SET "mykey" "myval"
      

      使用unix2dos将文件格式从unix更改为windows:

      unix2dos myfile.txt
      

      然后使用

      导入

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

      这对我有用。

      【讨论】:

        猜你喜欢
        • 2013-09-23
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 2015-09-12
        相关资源
        最近更新 更多