45

我有以下代码可以连接到 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

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

4

10 回答 10

80

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

于 2015-06-18T14:45:28.037 回答
18

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

if (RedisConn == null)
        { 
            ConfigurationOptions option = new ConfigurationOptions
            {
                AbortOnConnectFail = false,
                EndPoints = { redisEndpoint }
            };
            RedisConn = ConnectionMultiplexer.Connect(option);
        }
于 2017-05-01T05:18:09.827 回答
4

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

在你的情况下:

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

我的情况:

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

于 2016-11-04T10:48:49.510 回答
1

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

于 2017-09-26T12:32:13.783 回答
1

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

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

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

于 2019-05-15T20:51:41.230 回答
0

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

于 2020-02-24T13:37:48.943 回答
0

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

于 2020-08-14T03:51:38.810 回答
0

你可以这样使用它。

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

在此处输入图像描述

于 2021-10-30T10:20:24.877 回答
0

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

CacheSettings:ConnectionString=basketdb:6379

CacheSettings__ConnectionString=basketdb:6379

docker-compose.override.yml

于 2021-12-29T10:25:03.497 回答
0

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

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

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

于 2022-02-19T04:04:28.613 回答