首页 > 解决方案 > 为什么 DistributedCache SessionHandler 会抛出连接问题?

问题描述

我有一个 .net 核心应用程序在 azure 的 VM 中运行,我使用 Redis 作为 DistributedCache 的实现。通过这种方式,我们将用户会话存储在 Redis 中,并且可以在网络场中共享。我们只使用 Redis 来存储会话。我们将 Azure Cache for Redis 与普通实例一起使用。VM 和 Redis 都在同一个区域中。

在启动中添加:

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

在网络应用程序中,我们在 redis 关闭连接时遇到间歇性问题。所有对 Redis 的调用都是通过调用会话异步方法来管理的,如下所示。

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, Idle/Faulted, last: EXPIRE, origin: ReadFromPipe, outstanding: 1, last-read: 0s 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..

在超时期间我们没有遇到流量峰值,并且 Redis 实例没有承受任何重负载。

我不知道如何进一步解决这个问题。任何想法?

标签: asp.net-core.net-coreredisstackexchange.redis

解决方案


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

CONFIG get timeout

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

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


推荐阅读