stackexchange.redis with .net core 1.1 timeout



我有基于 .net core 1.1 的 Web 应用程序,并使用 Amazon ElastiCache of Redis 进行缓存管理。我正在使用"StackExchange.Redis":"1.1.608"版本进行缓存相关工作。以下是用于建立连接的代码 公共类缓存管理器 { 私有静态惰性连接; 私有静态对象锁对象 = 新对象(); 私人只读 ILogger 记录器;

public CacheManager(IConfiguration config, ILoggerFactory loggerFactory)
{
this.logger = loggerFactory.CreateLogger<CacheManager>();
if (connection == null)
{
lock (lockObject)
{
if (connection == null)
{
connection = new Lazy<ConnectionMultiplexer>(() =>
{
return ConnectionMultiplexer.Connect(config["Cache:ConnectionString"]);
});
}
}
}
}
public static ConnectionMultiplexer Connection
{
get
{
try
{
return connection.Value;
}
catch (Exception e)
{
return null;
}
}
}}

缓存 get 方法尝试使用键获取,如果未找到数据,它只是从数据库中获取它并设置它。

我们在生产环境中的 redis 上经常出现超时错误,不仅如此,它还导致客户端变得无响应,即网站给出 IIS 500 错误。日志中没有任何内容,Redis 日志非常简单:

无法获取 cahced 值: 超时执行 GET , inst: 61, 队列: 2, qu: 0, qs: 2, qc: 0, wr: 0, wq: 0, in: 207, ar: 0, clientName: (请查看本文以了解一些可能导致超时的常见客户端问题: https://github.com/StackExchange/StackExchange.Redis/tree/master/Docs/Timeouts.md)

Redis 托管在单独的服务器实例上。 我怎样才能更好地了解造成这种情况的根本原因是什么?

Mukesh, 如果 redis 服务器的资源(CPU/RAM/硬盘空间)没有限制事物,我会看看分配给软件的线程锁定的可能性(日志上的错误实际上只是次要症状)。

我会确保您的 redis 工厂是在启动时向服务集合注册的单例实例。"连接"字段应按如下设置:

private static readonly Lazy<ConnectionMultiplexer> connection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(config["Cache:ConnectionString"]));

这样,您就不必分配它,并且它在您的应用程序中共享(如预期的那样),没有打开连接使服务器过载的风险。 您的"配置服务"方法将具有如下所示的内容:

services.AddSingleton<ICacheManager, CacheManager>();

如果由于某种原因您必须锁定,而不是锁定对象,请等待锁定在信号灯苗条上(此链接中的图 10): https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

如果这些代码更改没有使事情变得更好,我会仔细检查服务器资源波动(我不知道你有什么样的用户群,但我看到网站带宽有时会成为一个问题)。 如果事实证明它是带宽,那么我会尝试发布/订阅和/或客户端缓存。

您还可以仔细检查 redis 安装的 RAM 设置。 如果覆盖默认值,然后更改可用资源,则可能会遇到一些问题。

最新更新