【问题标题】:Azure Redis Cache error No connection is available to service this operation:Azure Redis 缓存错误没有可用于服务此操作的连接:
【发布时间】:2017-02-06 20:58:02
【问题描述】:

我正在尝试在我的 MVC 4.6 应用程序中使用 Azure Redis 缓存,但出现连接错误。这是错误:

没有可用于服务此操作的连接:GET c7fc43f3-47c4-43cb-94ff-50527b1cda0c_TokenCache;这是不可能的 连接到 redis 服务器;创建一个断开连接的 多路复用器,禁用 AbortOnConnectFail。连接超时; IOCP: (忙=3,空闲=997,最小=2,最大=1000),工人: (Busy=2,Free=4093,Min=2,Max=4095), Local-CPU: 100%

我的 web.config 有:

<add key="ida:CacheConnection" value="myCache.redis.cache.windows.net:6380,password=bpPQX6jeocNjyX1FqrvVztGMQqjekXbUXFjGkiZOyCE=,ssl=True,abortConnect=False,connectTimeout=30,syncTimeout=3000,ConnectRetry=3" />

我的 packages.config 有:

<package id="StackExchange.Redis" version="1.2.0" targetFramework="net45" />

我按照MSDN 这篇文章配置了 Aazure Redis 服务器和客户端。

我尝试使用客户端命令行工具来验证连接,即使它不起作用。没有给我任何成功或失败的迹象。这是我的命令:

C:\Program Files\Redis>redis-cli -h "myCache.redis.cache.windows.net" -a bpPQX= -p 6379

我也尝试了 -p 6380 但没有任何改变。

【问题讨论】:

  • 在禁用 Only SSL Access 后,您能否通过 Redis CLI 连接到您的 Redis 缓存?
  • 不。从门户启用非 SSL 访问。 Sill cli 没有给我任何回应。
  • 您的网络是否有任何出站连接限制?我尝试使用您在上面提供的信息,这是我得到的输出... redis-cli.exe -h "myCache.redis.cache.windows.net" -p 6379 myCache.redis.cache.windows.net:6379 > auth wrongpassword (error) ERR 密码无效
  • 是的,我在公司防火墙后面。但不知道限制。您能否向我提供有关放弃/放松位的简要信息,我需要告诉我的安全团队?谢谢!

标签: azure stackexchange.redis azure-redis-cache


【解决方案1】:

在 Azure 门户中设置:Non-SSL port (6379) enabled

尝试使用CLI 连接到端口6379。 我不认为 Redis-CLI 可以连接到 SSL 端口(6380)

【讨论】:

    【解决方案2】:

    您应该在 Azure 门户中转到 Redis 缓存资源刀片的 Advanced Settings,将 Allow access only via SSL 设置为 No 并保存设置。

    您应该能够通过 Redis CLI 连接到您的 Redis 缓存:

    redis-cli -h "myCache.redis.cache.windows.net" -a bpPQX=
    

    -p 6379 可以是可选的,因为 Azure Redis 缓存的默认非 SSL 端口是 6379。

    参考:StackExchange.Redis Configuration Doc

    【讨论】:

    • 没有任何改变。客户端仍然没有响应。
    • 您是否尝试过在 Azure 门户中诊断和解决问题?
    • CLI 中没有错误和警告。它只是停留。是的,没有说明这个特定问题。此外,如果我尝试在 azure 门户 UI 中使用控制台,如果我运行 set message "hello" 之类的基本命令,则会出现错误
    【解决方案3】:

    我遇到了同样的问题,但在我的情况下,这是因为在 Redis 实例上设置了一个私有端点,这会阻止所有非本地连接。检查您是否设置了私有端点。

    【讨论】:

      【解决方案4】:
      1. 更新你的连接字符串

        • 将 abortConnect 设置为 false
        • 根据需要调整您的 syncTimeout 和 asyncTimeout。
        • 如果您使用的是安全 TLS 连接,请在您的配置中设置 ssl=True,sslprotocols=tls12 以将其强制为最新版本。
      2. 如果可以,请将您的 StackExchange.Redis nuget 包升级到最新版本。

      3. 在 C# 代码中将 ReconnectRetryPolicy 的配置选项设置为 ExponentialRetry https://stackexchange.github.io/StackExchange.Redis/Configuration.html#reconnectretrypolicy

        private static readonly Lazy<ConfigurationOptions> configOptions  = new Lazy<ConfigurationOptions>(() =>
        {
            var connections = ConfigurationManager.ConnectionStrings["redis-connection"].ConnectionString;
            var configOptions = ConfigurationOptions.Parse(connections);
        
            configOptions.ClientName = "MyApp-RedisCacheProvider";
            //configOptions.SyncTimeout = 100000; // don`t do this in code, set it in your connection string
            //configOptions.AbortOnConnectFail = false; // don`t do this in code, set it in your connection string
        
            /*
             * The default is LinearRetry which can cause congestion at virtually the same time on multiple parallel threads.
             * Use ExponentialRetry so that a degree of randomness is used in the timing across multiple threads.
             */
            configOptions.ReconnectRetryPolicy = new ExponentialRetry(5000, 10000);
        
            return configOptions;
        });
        
         private static readonly Lazy<ConnectionMultiplexer> connection = new Lazy<ConnectionMultiplexer>(
                 () => ConnectionMultiplexer.Connect(configOptions.Value));
        
      4. 实现 IDisposable 以在对象使用后对其进行处置

             public void Dispose()
             {
                 try {
                     if (connection.IsValueCreated)
                     {
                         connection.Value.Dispose(); 
                     }
                 } catch { }
             }
        

      【讨论】:

        猜你喜欢
        • 2016-03-14
        • 2018-05-06
        • 2019-11-25
        • 2020-04-01
        • 1970-01-01
        • 2014-05-20
        • 2017-06-29
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多