无法在redis中执行批量插入
我正在centos 6上工作。我想从拥有1000多万条记录的mySQL表中大规模插入redis缓存。我已经阅读了redis协议及其格式。我能够将表数据复制到文本文件中的redis协议格式。但当我尝试执行pipe命令时,就会出现错误无法在redis中执行批量插入,redis,Redis,我正在centos 6上工作。我想从拥有1000多万条记录的mySQL表中大规模插入redis缓存。我已经阅读了redis协议及其格式。我能够将表数据复制到文本文件中的redis协议格式。但当我尝试执行pipe命令时,就会出现错误 Error reading from the server: Connection reset by peer 或 我正在使用以下命令: cat insert.txt | redis-cli --pipe insert.txt包含以下格式的数据: *3 $3 SE
Error reading from the server: Connection reset by peer
或
我正在使用以下命令:
cat insert.txt | redis-cli --pipe
insert.txt包含以下格式的数据:
*3
$3
SET
$2
K1
$2
V1
如果可能,请告诉我此文本文件中多个命令的格式,如上例所示,此文件仅包含一个set命令。如果您能给我一个文本文件的例子,其中至少有两个命令,我将不胜感激
我也尝试过这种格式的文件数据
"*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n"
它给出了以下错误:
ERR unknown command '*3 $3 SET $3 key $5 value '
是的,因此使用
CRLF
行分隔符发送数据非常重要--不是字符串\r\n
,而是这些字符。这意味着没有常规的unix行结尾,它只是LF
或\n
插入这些符号的方式取决于所使用的编辑器,但处理现有符号的最简单方法是将每个符号放在自己的行上:
*3
$3
SET
$2
K1
$2
V2
并使用sed
:
cat insert.txt | sed 's/$/\r/g' | redis-cli --pipe
我们应该做到这一点
然后,为了一次性发送多个命令(管道),只需将其添加到文件末尾,如下所示:
*3
$3
SET
$2
K1
$2
V2
*3
$3
SET
$2
K2
$2
V3
“\r\n”表示您需要cr和lf字符-您使用了它们吗?谢谢linus..我使用了这个技巧。输出是..所有数据都传输了。等待最后的答复。。。ERR unknown command“2”ERR unknown command“$4”ERR“echo”command ERR unknown command”$öa%~ĀĀĀĀL«7g»30秒无应答:退出。错误:6,回复:7,但我在使用get命令时得到了这些键的值。您能告诉我这里发生了什么吗?我的意思是它显示错误,但工作正常。看起来您发送的数据无效。也就是说,您的一些数据缺少参数或以某种方式关闭。也许在一个数字前缺少一个美元符号(未知的命令“2”),然后所有东西都被抛出。奇怪字符串的最后一个错误似乎与此有关:
一旦没有更多的数据可从stdin读取,它将从stdin发送一个带有随机20字节字符串的特殊ECHO命令。
*3
$3
SET
$2
K1
$2
V2
*3
$3
SET
$2
K2
$2
V3