phpからは、phpredisライブラリを使ってRedisに接続していたが、アプリサーバからコマンドラインで大量投入したくなったので、手順を残す。
redis-cliを使えるようにするために、redis-toolsライブラリをインストール
apt-get install -y redis-tools
これで、redis-cliコマンドが使えるようになった。
以下のコマンドで接続できるようになった
redis-cli -h [ホスト名]
例: redis-cli -h redis
大量データ登録コマンド
大量データ登録は、以下のように、redisコマンドをファイルに書き出した後、
pipeオプションをつけて実行すると、最速で登録ができる。
echo zadd sample 1 sample1 > import.txt
cat import.txt | redis-cli -h redis --pipe
ただ、import.txtの行数が多すぎると、以下のようなエラーが発生した。
Error reading from the server: Connection reset by peer
Redisサーバ上で再実行すると、以下のエラー。。
ERR Protocol error: too big inline request
pipeオプションを外して、Redisサーバ上で再実行しても、以下のエラー。。
Error reading from the server: Connection reset by peer
悩ましい。。
原因調査中。 以下、追記
追記1
redis.confでログレベルをdebugにして、ログを確認してみたところ、
redis.conf
loglevel debug
logfile "/tmp/redis.log"
以下のようなエラーが出ていた。
Protocol error (invalid mbulk count) from client: id=530 addr=127.0.0.1:56688 laddr=127.0.0.1:6379 fd=11 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=16384 qbuf-free=24570 argv-mem=0 obl=47 oll=0 omem=0 tot-mem=61448 events=r cmd=command user=default redir=-1. Query buffer during protocol error: '*1050002..$4..zadd..$17..sample:3146..$10..1627525121..$1.' (... more 16256 bytes ...) '.1627525121.'
Redisのソースコードでは、以下の箇所でエラーを返している模様。
/* We know for sure there is a whole line since newline != NULL,
* so go ahead and find out the multi bulk length. /
redisAssertWithInfo(c,NULL,c->querybuf[0] == '');
ok = string2ll(c->querybuf+1,newline-(c->querybuf+1),&ll);
if (!ok || ll > 1024*1024) {
addReplyError(c,"Protocol error: invalid multibulk length");
setProtocolError(c,pos);
return REDIS_ERR;
}
ただ、1024 × 1024 を超えているのだろうか・・?
more 16256 bytes …) と出力されてはいるが。。
追記2
import.txtを生成するシェルスクリプトで、変数の代入処理が間違っており、
「zadd sample 1 sample1 」の 「1 sample1」の記載が1024 × 1024以上の文字列になっていた。
zaddの引数の長さが1024×1024を超えたことによる、エラーだったのだ。
解決できてよかった。
MaxMemoryOverによるエラー
redis.confにMaxMemoryを変更したところ、
redis.conf
maxmemory 20mb
maxmemory-policy noeviction
以下のエラーが発生した。
(error) OOM command not allowed when used memory > 'maxmemory'.
参考リンク
- ERR Protocol error: invalid multibulk length · Issue #201 · StackExchange/StackExchange.Redis · GitHub
https://github.com/StackExchange/StackExchange.Redis/issues/201