Dockerの別コンテナからRedisに接続して大量投入する

Dockerの別コンテナからRedisに接続して大量投入する

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'.

参考リンク

Web技術カテゴリの最新記事