簡體   English   中英

Azure Redis 緩存錯誤沒有連接可用於服務此操作:

[英]Azure Redis Cache error No connection is available to service this operation:

我正在嘗試在我的 MVC 4.6 應用程序中使用 Azure Redis 緩存,但出現連接錯誤。 這是錯誤:

沒有連接可用於服務此操作:GET c7fc43f3-47c4-43cb-94ff-50527b1cda0c_TokenCache; 無法連接到 redis 服務器; 要創建斷開連接的多路復用器,請禁用 AbortOnConnectFail。 連接超時; IOCP: (Busy=3,Free=997,Min=2,Max=1000), WORKER: (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 服務器和客戶端。

我嘗試使用客戶端 cmd 線路工具來驗證連接,即使它不起作用。 沒有給我任何成功或失敗的跡象。 這是我的命令:

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

我也嘗試了 -p 6380 但沒有任何改變。

在Azure門戶中設置: Non-SSL port (6379) enabled

嘗試使用CLI連接到端口6379 我不認為Redis-CLI可以連接到SSL端口(6380)

您應該轉到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 Cache的默認非SSL端口是6379。

在此輸入圖像描述

參考: StackExchange.Redis配置文檔

我遇到了同樣的問題,但就我而言,這是因為在 Redis 實例上設置了一個私有端點,這會阻止所有非本地連接。 檢查您是否有專用端點設置。

  1. 更新您的連接字符串

    • 將 abortConnect 設置為 false
    • 根據需要調整您的 syncTimeout 和 asyncTimeout。
    • 如果您使用的是安全 TLS 連接,請在您的配置中設置 ssl=True,sslprotocols=tls12 以強制使用最新版本。
  2. 如果可以,請將您的 StackExchange.Redis nuget package 升級到最新版本。

  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 以在使用后處理 object

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM