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。netcatcatに送信すると、コマンドは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

余分な 1 秒は、netcat が Redis の応答を読み取る機会を与えます。

--pipe モードの redis-cli は、Redis プロトコルを介して大量のインジェクションを実行するのに netcat よりもはるかに適していることに注意してください。

于 2013-04-09T15:04:01.643 に答える