私はServiceStackのRedisクライアントと一緒にキャッシュするためにRedisを頻繁に使用するいくつかの.NET Webアプリケーションで作業します。すべてのケースで私は同じマシンでRedisを実行しています。私はBasicRedisClientManagerとPooledRedisClientManager(常にシングルトンとして実装されています)の両方を使用しており、両方のアプローチでいくつか問題がありました。ServiceStackを使用してRedis接続を管理するにはどうすればよいですか?
BasicRedisClientManagerでは、しばらくの間うまくいきましたが、結局Redisは接続を拒否し始めます。 netstatを使って、デフォルトのRedisポートへの何千ものTCP接続がTIME_WAITステータスでぶら下がっていることがわかりました。
次に、PooledRedisClientManagerに切り替えました。これはすぐに問題を解決するように見えました。しかし、それほど時間がかかりませんでした。私たちは、PooledRedisClientManager.GetClientによって引き起こされたスレッド待機(System.Threading.Monitor.Wait呼び出し)に絞り込んだ時々のCPUスパイクに気付きました。
コードでは、(ServiceStackの便利なExecAsショートカットを使用して)get-in-get-outアプローチを使用しているため、一般的な接続は非常に頻繁に取得されますが、できるだけ短く保持されます。
トラフィックは控えめですが、私たちはStackExchangeではありません。私は、ServiceStackクライアントが仕事に就いていると思っていますが、何か間違っていると思います。 PooledRedisClientManagerは正しいアプローチですか?単にプールのサイズを大きくすることをお勧めしますか?それとも、コードで問題が隠されている可能性がありますか?
ここで一般的なガイダンスを探していますが、私はこの時点で助けが必要な特定のコードはありません。前もって感謝します。
純粋なトータルスペキュレーション - 私はAppHarborを使用していましたが、Redis接続が保持され、Redis接続の制限に当たっている問題がありました。サイトは基本的にゼロのトラフィックを受け取るので、IISがアイドルタイムアウトを起こしてアプリケーションをシャットダウンし、Redis接続を正しく処理しないためだと推測します。しかし、SS 'RedisClientManagers'は 'Dispose'で接続を閉じることを処理します。繰り返しますが、ちょうど投機ですが、接続を破棄しないIISアイドルタイムアウトや、新しいRedis接続を作成するいくつかの 'Application_Starts'が考えられます。 – paaschpa
接続が閉じられていますか? redis-cliを使用してCLIENT LISTコマンドを確認する –