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

Другие вопросы по тегам