【问题标题】:It was not possible to connect to the redis server(s); to create a disconnected multiplexer无法连接到 redis 服务器;创建一个断开的多路复用器
【发布时间】:2015-06-17 15:07:58
【问题描述】:

我有以下代码可以连接到 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。 PING 上的 UnableToResolvePhysicalConnection

问题是如果缓存连接失败,我如何重构这段代码以进入数据库?

【问题讨论】:

    标签: c# azure azure-redis-cache


    【解决方案1】:

    您遇到的错误通常表明您没有在连接字符串中设置 abortConnect=falseabortConnect 的默认值为 true,这使得 StackExchange.Redis 在某些情况下不会自动重新连接到服务器。我们强烈建议您在连接字符串中设置 abortConnect=false,以便 SE.Redis 在发生网络中断时在后台自动重新连接。

    【讨论】:

    • 谢谢,这个连接字符串对我有用 172.17.0.2:12000,abortConnect=false
    • 非常有用,谢谢。太糟糕了,默认设置是true
    • 可能还需要增加默认超时时间,例如"Redis": "localhost,abortConnect=false,connectTimeout=30000,responseTimeout=30000"
    【解决方案2】:

    对于潜入他人代码的初学者来说,会面临这个问题:

    if (RedisConn == null)
            { 
                ConfigurationOptions option = new ConfigurationOptions
                {
                    AbortOnConnectFail = false,
                    EndPoints = { redisEndpoint }
                };
                RedisConn = ConnectionMultiplexer.Connect(option);
            }
    

    【讨论】:

    • 完美...但是故障保护是什么?如果它在第一个网络信号时失败,我们可以让它再试一次,但不是无限期的。有其他选择吗?谷歌向我指出了这里。
    • 找到了,是ConnectRetry的ConfigurationOption设置为重试次数。不确定默认设置是什么。
    【解决方案3】:

    您还应该注意错误消息的最后一部分,因为它似乎提供了有关连接失败原因的非常有用的详细信息。

    在你的情况下:

    无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。 PING 上的 UnableToResolvePhysicalConnection

    我的情况:

    无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。 超时

    【讨论】:

      【解决方案4】:

      这个问题在一个新版本中得到解决,版本 1.2.6 - 你可以在Here看到

      【讨论】:

        【解决方案5】:

        对于那些维护旧代码库的人,您可能会遇到“无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。UnableToResolvePhysicalConnection on PING”

        升级到更新的 nuget 包后,错误仍然存​​在,但我收到更多错误信息:“客户端和服务器无法通信,因为它们不具备通用算法”。

        一旦我应用了here 提到的注册表项,我就没事了。对于那些不希望进行全局更改的人,我相信有一个 PR 用于设置。

        【讨论】:

          【解决方案6】:

          我通过将连接字符串从 localhost:6379 更改为 127.0.0.1:6379 来解决此问题

          【讨论】:

            【解决方案7】:

            对我来说,连接字符串不正确。添加正确的连接字符串详细信息适用于 stackexchange.redis 2.1.58

            【讨论】:

              【解决方案8】:

              你可以这样使用它。

                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}");
              }
              

              enter image description here

              【讨论】:

              • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
              【解决方案9】:

              我通过更改解决了这个问题:

              CacheSettings:ConnectionString=basketdb:6379
              

              CacheSettings__ConnectionString=basketdb:6379
              

              docker-compose.override.yml

              【讨论】:

                【解决方案10】:

                请确保您已经设置了 Redis。以下是各个操作系统的说明链接:

                Mac 操作系统:https://gist.github.com/tomysmile/1b8a321e7c58499ef9f9441b2faa0aa8

                Windows:https://dev.to/divshekhar/how-to-install-redis-on-windows-10-3e99

                【讨论】:

                  猜你喜欢
                  • 2015-05-16
                  • 2013-02-25
                  • 2017-03-01
                  • 1970-01-01
                  • 2023-02-11
                  • 2017-09-16
                  • 2019-10-18
                  • 2021-10-25
                  • 1970-01-01
                  相关资源
                  最近更新 更多