我有以下一段代码连接到 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=false。 abortConnect 的默认值为 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