Не удалось подключиться к серверу (-ам) 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
Вопрос в том, как я могу изменить этот код для перехода в базу данных в случае сбоя соединения с кешем?
10 ответов
Получаемая ошибка обычно является признаком того, что вы не установили abortConnect=false в строке подключения. Значение по умолчанию для abortConnect равно true, что позволяет StackExchange.Redis не подключаться к серверу автоматически при некоторых условиях. Мы настоятельно рекомендуем вам установить abortConnect=false в строке подключения, чтобы SE.Redis автоматически переподключался в фоновом режиме, если произойдет сбой сети.
Для начинающих, которые погружаются в чужой код, сталкиваются с этой проблемой:
if (RedisConn == null)
{
ConfigurationOptions option = new ConfigurationOptions
{
AbortOnConnectFail = false,
EndPoints = { redisEndpoint }
};
RedisConn = ConnectionMultiplexer.Connect(option);
}
Вам также следует обратить внимание на последнюю часть вашего сообщения об ошибке, так как оно содержит очень полезные сведения о причине сбоя подключения.
В твоем случае:
Не удалось подключиться к серверу (-ам) redis; чтобы создать отключенный мультиплексор, отключите AbortOnConnectFail. UnableToResolvePhysicalConnection на PING
Мое дело:
Не удалось подключиться к серверу (-ам) redis; чтобы создать отключенный мультиплексор, отключите AbortOnConnectFail. Тайм - аут
Я исправил это, изменив:
CacheSettings:ConnectionString=basketdb:6379
к
CacheSettings__ConnectionString=basketdb:6379
в файле docker-compose.override.yml
Для тех, кто поддерживает старые кодовые базы, вы можете столкнуться с "Не удалось подключиться к серверу (-ам) redis; для создания отключенного мультиплексора отключите AbortOnConnectFail. UnableToResolvePhysicalConnection on PING")
После обновления до более позднего пакета nuget ошибка все еще присутствовала, но я получил больше информации об ошибке: "Клиент и сервер не могут обмениваться данными, поскольку они не имеют общего алгоритма".
Как только я применил ключи реестра, упомянутые здесь, я был в порядке. Для тех, кто не желает вносить глобальные изменения, я считаю, что был PR для урегулирования.
Эта проблема была решена в новой версии, версии 1.2.6 - вы можете увидеть здесь
Убедитесь, что у вас уже настроен Redis. Вот ссылки на инструкции для соответствующей ОС:
Mac OS: https://gist.github.com/tomysmile/1b8a321e7c58499ef9f9441b2faa0aa8
Windows: https://dev.to/divshekhar/how-to-install-redis-on-windows-10-3e99 .
Вы можете использовать это таким образом.
public class RedisService
{
private readonly string _host;
private readonly int _port;
private ConnectionMultiplexer _connectionMultiplexer;
public RedisService(string host, int port)
{
_host = host;
_port = port;
}
public void Connect() => _connectionMultiplexer = ConnectionMultiplexer.Connect($"{_host}:{_port}");
}
Для меня строка подключения была неверной. Добавление правильных деталей строки подключения работало с stackexchange.redis 2.1.58
Я исправил это, изменив строку подключения с localhost:6379 на 127.0.0.1:6379