redisを使っていると以下のエラーが出た。
warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.
これはredisというよりもnodeのエラー。
イベントを検知するリスナーを11個セットしたからエラーになっている。
以下が問題となったコード。
var redis = require("redis"); var client = redis.createClient( 63793, '127.0.0.1', { connect_timeout : 1000, //タイムアウト(msec) max_attempts : 3 //接続しに行く回数 } ); //DB選択 client.select(1, function(){}); //エラー検知用リスナー client.on("error", function (err) { console.log("Error " + err); });
ここで問題なのは client.on() の部分。
これはredisでエラーが発生した際に呼ばれるコールバックをセットしているが、
これはリスナーになるので、このコードが11回走ると上記のエラーが出る。
そもそもnodeはPHPなどのリクエスト&レスポンスで1プロセスというわけではない。
起動時に1回呼ぶだけでいい。
セットするリスナーが10個を越える場合は閾値を変更できたはず。