StackExchange.Redisの 基本的な使用法 のドキュメントでは、ConnectionMultiplexer
は長期間有効であり、再利用が期待されていると説明されています。
しかし、サーバーへの接続が切断された場合はどうでしょうか? ConnectionMultiplexer
は自動的に再接続しますか、それとも this answer (その答えを引用)のようにコードを記述する必要がありますか?
if (RedisConnection == null || !RedisConnection.IsConnected)
{
RedisConnection = ConnectionMultiplexer.Connect(...);
}
RedisCacheDb = RedisConnection.GetDatabase();
上記のコードは切断からの回復を処理するのに良いものですか、それとも実際に複数のConnectionMultiplexer
インスタンスが発生しますか?同じように、IsConnected
プロパティはどのように解釈すべきですか?
[余談:上記のコードは、特にマルチスレッド環境でのレイジー初期化のかなり悪い形式だと思います-参照 シングルトンに関するジョン・スキートの記事 ]。
これが Azure Redis Cacheチームが推奨するパターン です。
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => {
return ConnectionMultiplexer.Connect("mycache.redis.cache.windows.net,abortConnect=false,ssl=true,password=...");
});
public static ConnectionMultiplexer Connection {
get {
return lazyConnection.Value;
}
}
いくつかの重要なポイント:
はい、切断された接続を修正するには、そのタイプの検証が必要です。スレッドの安全性も考慮する必要があります。これは私が通常これを行う方法です:
_private static ConnectionMultiplexer _redis;
private static readonly Object _multiplexerLock = new Object();
private void ConnectRedis()
{
try
{
_redis = ConnectionMultiplexer.Connect("...<connection string here>...");
}
catch (Exception ex)
{
//exception handling goes here
}
}
private ConnectionMultiplexer RedisMultiplexer
{
get
{
lock (_multiplexerLock)
{
if (_redis == null || !_redis.IsConnected)
{
ConnectRedis();
}
return _redis;
}
}
}
_
次に、Redisエンドポイントを呼び出す必要があるすべての場所でRedisMultiplexer
プロパティを使用します。ドキュメントにはかなり軽量な呼び出しであると記載されているため、通常はGetDatabase()
呼び出しの結果を保存しません。