无法连接到 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次此异常:

其它信息:无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用 AbortOnConnectFail。无法解析 PING 上的物理连接

问题是,如果缓存连接失败,如何重构此代码以转到数据库?

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

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

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

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

在您的情况下:

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

我的情况:

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

对于那些维护旧代码库的用户,您可能会遇到"无法连接到 redis 服务器;要创建断开连接的多路复用器,请禁用中止连接失败。无法解析 PING 上的物理连接"

升级到更新的 nuget 包后,错误仍然存在,但我得到了更多错误信息:"客户端和服务器无法通信,因为它们没有通用算法"。

一旦我应用了这里提到的注册表项,我就没事了。 对于那些不希望进行全球变革的人,我相信已经有一个设置的公关。

我通过更改来解决此问题:

CacheSettings:ConnectionString=basketdb:6379

CacheSettings__ConnectionString=basketdb:6379

docker-compose.override.yml

此问题已在新版本 1.2.6 中解决 - 您可以在 这里

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

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

你可以这样使用它。

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

在此处输入图像描述

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

Mac OS: https://gist.github.com/tomysmile/1b8a321e7c58499ef9f9441b2faa0aa8

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

最新更新