Не удалось подключиться к серверу(ам) 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 раза в день я получаю это исключение:

Дополнительная информация: Не удалось подключиться к серверу(ам) Redis; чтобы создать отключенный мультиплексор, отключите AbortOnConnectFail. UnableToResolvePhysicalConnection при PING

Вопрос в том, как я могу реорганизовать этот код для перехода к базе данных в случае сбоя подключения к кешу?


person Luis Valencia    schedule 17.06.2015    source источник


Ответы (7)


Ошибка, которую вы получаете, обычно является признаком того, что вы не установили abortConnect=false в строке подключения. Значение по умолчанию для abortConnect равно true, поэтому StackExchange.Redis не будет автоматически повторно подключаться к серверу при некоторых условиях. Мы настоятельно рекомендуем вам установить abortConnect=false в строке подключения, чтобы SE.Redis автоматически переподключался в фоновом режиме при возникновении сетевого сигнала.

person JonCole    schedule 18.06.2015
comment
спасибо, у меня сработала эта строка подключения 172.17.0.2:12000,abortConnect=false - person sagar; 08.11.2020
comment
Очень полезно, спасибо. Жаль, что настройка по умолчанию true. - person ceco; 03.02.2021

для начинающих, которые погружаются в чужой код, сталкиваются с этой проблемой:

if (RedisConn == null)
        { 
            ConfigurationOptions option = new ConfigurationOptions
            {
                AbortOnConnectFail = false,
                EndPoints = { redisEndpoint }
            };
            RedisConn = ConnectionMultiplexer.Connect(option);
        }
person danigitman    schedule 01.05.2017
comment
Отлично... но что такое отказоустойчивость? Если это не удается при первом сетевом сигнале, мы можем позволить ему повторить попытку, но не на неопределенный срок. Есть ли дополнительные опции? Гугл указал мне сюда. - person Glenn; 20.06.2017
comment
Нашел, это ConfigurationOption ConnectRetry, установленный на количество повторных попыток. Не уверен, что установлено по умолчанию. - person Glenn; 20.06.2017
comment
По умолчанию для ConnectRetry установлено значение 3 — stackexchange.github.io/StackExchange.Redis/Configuration.html< /а> - person vshale; 13.01.2018

Вам также следует обратить внимание на последнюю часть вашего сообщения об ошибке, так как она содержит очень полезную информацию о причине сбоя подключения.

В твоем случае:

Не удалось подключиться к серверу(ам) Redis; чтобы создать отключенный мультиплексор, отключите AbortOnConnectFail. UnableToResolvePhysicalConnection при PING

Мое дело:

Не удалось подключиться к серверу(ам) Redis; чтобы создать отключенный мультиплексор, отключите AbortOnConnectFail. Тайм-аут

person Zé Carlos    schedule 04.11.2016

Эта проблема была решена в новом выпуске версии 1.2.6 - вы можете увидеть в Здесь

person Roger Gusmao    schedule 26.09.2017

Для тех, кто поддерживает старые кодовые базы, вы можете столкнуться с «Не удалось подключиться к серверу (серверам) Redis; чтобы создать отключенный мультиплексор, отключите AbortOnConnectFail. UnableToResolvePhysicalConnection при PING»

После того, как я обновился до более позднего пакета nuget, ошибка все еще присутствовала, но я получил больше информации об ошибке: «Клиент и сервер не могут взаимодействовать, потому что у них нет общего алгоритма».

Как только я применил ключи реестра, упомянутые здесь, все было в порядке. Для тех, кто не хочет вносить это глобальное изменение, я считаю, что был PR для настройки.

person JasonCoder    schedule 15.05.2019

Я исправил это, изменив строку подключения с localhost:6379 на 127.0.0.1:6379.

person Markus    schedule 24.02.2020

Для меня строка подключения была неправильной. Добавление правильных сведений о строке подключения работало со stackexchange.redis 2.1.58.

person Nilay    schedule 14.08.2020