一度生産環境でredis接続が取得できない問題の調査を記入する
3348 ワード
最近はオンライン環境が不安定で、使っているとredis接続が取得できない場合があります.redisサーバ側の構成を見てみると、接続数が多くないことがわかりますが、なぜこのような状況になるのでしょうか.
まずredisサービス側の構成を確認します
サービス側の各方面の接続数が正常であることを発見して、それではどうしてクライアントはまたいつも接続の異常を取得できないことを報告します
プロジェクトを振り返ると、プロジェクト用のテクノロジースタックは主にspringmvc+mybatis+spring cache+shiroで、redisに多く使われる場所の一つはshiroのsesion操作であり、もう一つはspring cacheのcache操作である.
ローカルではまずredisの最大,最小アイドル接続数を20,総接続数を50とする.
多くの操作はspring cacheで処理されたインタフェースを通じてredisサービス側の接続を確認し、接続数がすぐに最大の接続数に満タンになることを発見し、クライアントが接続エラーを報告し始めた.
考えてみると、ローカル接続がタイムリーに解放されなかった原因ですか?OK,接続プールの配置パラメータを調整する
接続プールを上記のように配置し、テストを行ったところ、同じ問題がまだ存在することがわかりました.考えてみると、上記の配置を行った後、なぜ接続が切れなかったのでしょうか.接続が漏れたのか?本プロジェクトがjedisによってredisを操作していることを考慮すると、jedisはredis接続を取得し、使い終わったらcloseを呼び出して接続を返す必要がありますが、接続を返さなかったのでしょうか.
jedisを呼び出したすべての場所を調べてみると、sessionを操作している間に接続を持っていても返されていないことがわかりました.ok、この問題を修復して、圧力測定を行います.すべて正常です.
主なポイント spring cacheとshiroフレームワークを参照し、redisで格納すると、動作頻度が非常に高く、接続の問題に注意しなければならない jedis操作redisは必ず使い切った後にcloseメソッドを呼び出すことに注意しなければならない.そうしないと、接続はタイムリーに返されない である.大同時の場合、redis接続の空き生存期間は、接続が をタイムリーに解放するように、必ず短く設定.は、コンカレント量が比較的大きい、同時に複数の項目が同一のredisサーバを共用する場合、サーバ側timeoutパラメータの設定 に注意する.
まずredisサービス側の構成を確認します
## redis-cli redis
redis-cli -h 127.0.0.1 -p 6379 -a
##
info clients
## ,
connected_clients:19
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
## ( , )
config timeout
##
config maxclients
サービス側の各方面の接続数が正常であることを発見して、それではどうしてクライアントはまたいつも接続の異常を取得できないことを報告します
プロジェクトを振り返ると、プロジェクト用のテクノロジースタックは主にspringmvc+mybatis+spring cache+shiroで、redisに多く使われる場所の一つはshiroのsesion操作であり、もう一つはspring cacheのcache操作である.
ローカルではまずredisの最大,最小アイドル接続数を20,総接続数を50とする.
多くの操作はspring cacheで処理されたインタフェースを通じてredisサービス側の接続を確認し、接続数がすぐに最大の接続数に満タンになることを発見し、クライアントが接続エラーを報告し始めた.
考えてみると、ローカル接続がタイムリーに解放されなかった原因ですか?OK,接続プールの配置パラメータを調整する
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 50
jedisPoolConfig.setMaxTotal(maxTotal);
// ( )
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
//
jedisPoolConfig.setMaxIdle(maxIdle);
//
jedisPoolConfig.setMinIdle(minIdle);
// ( )
jedisPoolConfig.setTimeBetweenEvictionRunsMillis(10);
// ( ),
jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(100);
//
jedisPoolConfig.setTestOnBorrow(true);
//
jedisPoolConfig.setTestOnReturn(true);
//
jedisPoolConfig.setTestWhileIdle(true);
//
jedisPoolConfig.setNumTestsPerEvictionRun(10);
接続プールを上記のように配置し、テストを行ったところ、同じ問題がまだ存在することがわかりました.考えてみると、上記の配置を行った後、なぜ接続が切れなかったのでしょうか.接続が漏れたのか?本プロジェクトがjedisによってredisを操作していることを考慮すると、jedisはredis接続を取得し、使い終わったらcloseを呼び出して接続を返す必要がありますが、接続を返さなかったのでしょうか.
jedisを呼び出したすべての場所を調べてみると、sessionを操作している間に接続を持っていても返されていないことがわかりました.ok、この問題を修復して、圧力測定を行います.すべて正常です.
主なポイント