4
$ cat mass_insert.txt 
*3
$3
SET
$4
key1
$6
value1
*3
$3
SET
$4
key2
$6
value2
$ cat mass_insert.txt | nc localhost 6379

如果您看到,我有用于在文件中批量插入的 redis 命令mass_insert.text,我cat将它发送到 netcat,并且这些命令可以很好地发送到 redis,但不会转储响应。问题是为什么?

一个简单的google.comHEAD 请求netcat就可以正常工作,即转储响应 -

$ printf "HEAD / HTTP/1.0\r\n\r\n" | nc google.com 80
HTTP/1.0 302 Found
Location: http://www.google.co.in/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=cac6fac8de9b5d0c:FF=0:TM=1365352115:LM=1365352115:S=CVuSzOK8mrsfFczI; expires=Tue, 07-Apr-2015 16:28:35 GMT; path=/; domain=.google.com
Set-Cookie: NID=67=K5KjAFxuDP5epZKDdvSf4oCe4FRP1AL8LG_9MEdsArn4Oz_UBG69H0KOMUiKLuVN-hH4NIUvHOLgmfh_82P5v6Nh-sGFrGXyCnQz0zD-Sj_QbzxQ6NIK0rahsxjvyTn7; expires=Mon, 07-Oct-2013 16:28:35 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Sun, 07 Apr 2013 16:28:35 GMT
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
4

1 回答 1

6

您可能需要检查以下几点。

首先,Redis 协议中的行分隔符是 \r\n(而不仅仅是 \n)。因此,您需要确保您的输入文件包含这些字符。

然后,netcat 在输入文件末尾关闭连接(因此它可能不会等待 Redis 回复)。不过,这可能取决于 netcat 的版本。在我的系统上:

$ od -c toto.txt
0000000   *   3  \n   $   3  \n   S   E   T  \n   $   4  \n   k   e   y
0000020   1  \n   $   6  \n   v   a   l   u   e   1  \n   *   3  \n   $
0000040   3  \n   S   E   T  \n   $   4  \n   k   e   y   2  \n   $   6
0000060  \n   v   a   l   u   e   2  \n

$ ( sed 's/$/\r/' < toto.txt ; sleep 1 ) | netcat localhost 6379
+OK
+OK

额外的一秒让 netcat 有机会阅读 Redis 回复。

请注意, --pipe 模式下的 redis-cli 比 netcat 更适合通过 Redis 协议执行大量注入。

于 2013-04-09T15:04:01.643 回答