Не удалось подключиться к серверу redis; для создания отключенного мультиплексора
У меня есть следующий фрагмент кода для подключения к кезу azure redis.
public class CacheConnectionHelper
{
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(SettingsHelper.AzureRedisCache);
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
}
И я использую его таким образом
public static List<Models.Module> GetModules()
{
IDatabase cache = CacheConnectionHelper.Connection.GetDatabase();
List<Models.Module> listOfModules = new List<Models.Module>();
listOfModules = (List<Models.Module>)cache.Get("ApplicationModules");
if (listOfModules == null)
{
listOfModules = dbApp.Modulos.ToList();
cache.Set("ApplicationModules", listOfModules, TimeSpan.FromMinutes(SettingsHelper.CacheModuleNames));
return listOfModules;
}
else {
return listOfModules;
}
}
Однако 1 или 2 раза в день я получаю это исключение:
Additional information: It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. UnableToResolvePhysicalConnection on PING
Вопрос в том, как я могу реорганизовать этот код для перехода к базе данных в случае сбоя подключения к кэшу?
Ответы
Ответ 1
Ошибка, которую вы получаете, обычно является признаком того, что вы не установили в строке соединения abortConnect = false. Значение по умолчанию для abortConnect равно true, что делает его так, что StackExchange.Redis не будет автоматически подключаться к серверу при определенных условиях. Мы настоятельно рекомендуем вам установить abortConnect = false в вашей строке подключения, чтобы SE.Redis автоматически повторно подключался в фоновом режиме, если происходит сбой сети.
Ответ 2
для начинающих, которые погружаются в другой код, сталкиваются с этой проблемой:
if (RedisConn == null)
{
ConfigurationOptions option = new ConfigurationOptions
{
AbortOnConnectFail = false,
EndPoints = { redisEndpoint }
};
RedisConn = ConnectionMultiplexer.Connect(option);
}
Ответ 3
Эта проблема была решена в новой версии, версии 1.2.6 - вы можете увидеть здесь
Ответ 4
Вы также должны обратить внимание на последнюю часть сообщения об ошибке, поскольку она, как представляется, предоставляет очень полезные сведения о причине сбоя соединения.
В вашем случае:
Не удалось подключиться к серверам redis; для создания отключенного мультиплексора отключите AbortOnConnectFail. UnableToResolvePhysicalConnection на PING
Мой случай:
Не удалось подключиться к серверам redis; для создания отключенного мультиплексора отключите AbortOnConnectFail. Тайм-аут
Ответ 5
Для тех, кто поддерживает старые кодовые базы, вы можете столкнуться с "Не удалось подключиться к серверу (-ам) redis; для создания отключенного мультиплексора отключите AbortOnConnectFail. UnableToResolvePhysicalConnection on PING")
После обновления до более позднего пакета nuget ошибка все еще присутствовала, но я получил больше информации об ошибке: "Клиент и сервер не могут обмениваться данными, поскольку они не имеют общего алгоритма".
Как только я применил ключи реестра, упомянутые здесь, я был в порядке. Для тех, кто не желает вносить глобальные изменения, я считаю, что был PR для урегулирования.