Подтвердить что ты не робот

Не удалось подключиться к серверу 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

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

4b9b3361

Ответ 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 для урегулирования.