为什么DistributedCache SessionHandler抛出连接问题?

问题描述

我有一个.net核心应用程序,在蔚蓝的VM中运行,在那里我使用Redis作为DistributedCache的实现。这样,我们将用户会话存储在Redis中,并且可以在Web场中共享。我们仅将Redis用于存储会话。我们将Azure Redis缓存用于普通实例。 VM和Redis都在同一区域。

添加启动项:

 services.AddStackExchangeRedisCache(options => {
          options.Configuration = configuration["RedisCache:ConnectionString"];
        });

在网络应用中,redis关闭连接时出现间歇性问题。所有对Redis的调用都通过调用如下的会话Async方法来管理。

public static async Task<T> Get<T>(this ISession session,string key) {
  if (!session.IsAvailable)
    await session.LoadAsync();
  var value = session.GetString(key);
  return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}

我们看到的错误是:

StackExchange.Redis.RedisConnectionException: No connection is available to service this operation: EVAL; An existing connection was forcibly closed by the remote host.; IOCP: (Busy=0,Free=1000,Min=2,Max=1000),WORKER: (Busy=3,Free=32764,Min=512,Max=32767),Local-CPU: n/a
 ---> StackExchange.Redis.RedisConnectionException: SocketFailure on myredis.redis.cache.windows.net:6380/Interactive,Idle/Faulted,last: EVAL,origin: ReadFromPipe,outstanding: 1,last-read: 34s ago,last-write: 0s ago,keep-alive: 60s,state: ConnectedEstablished,mgr: 9 of 10 available,in: 0,last-heartbeat: 0s ago,last-mbeat: 0s ago,global: 0s ago,v: 2.0.593.37019
 ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..

StackExchange.Redis.RedisConnectionException: SocketFailure on myredis.redis.cache.windows.net:6380/Interactive,last: EXPIRE,last-read: 0s ago,v: 2.0.593.37019
     ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..

我们在超时期间没有出现流量高峰,并且Redis实例没有任何繁重的负载。

我不知道如何进一步解决此问题。有想法吗?

解决方法

由于空闲时间太长,Redis服务器可能关闭了连接。 在您的Azure缓存控件中,您可以找到Redis服务器的配置,查看是否可以找到超时设置。 如果您可以通过命令行发出命令,也可以发出此命令

CONFIG get timeout

如果为零,则表示没有超时。

然后问题出在您的Redis客户上。我不熟悉.Net,无论您使用什么客户端连接到Redis服务器,请检查超时选项或Google搜索(客户端名称)+超时,看看是否可以找到任何有用的信息。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...