【问题标题】:Redis SocketFailureRedis 套接字失败
【发布时间】:2022-08-02 21:33:34
【问题描述】:

我是 Redis 的新手。我已经实现了一个具有GET, SET, DELETE and ISKEYPRESENT 方法的类。以下是我班级的代码:

static ConnectionMultiplexer redisConnection = ConnectionMultiplexer.Connect(\"connectionstring\");
static readonly IDatabaseAsync dbConnection = redisConnection.GetDatabase();

        public static async Task SetRecordAsync<T>(string recordId, T data, TimeSpan? timeSpan = null)//default 30 mins
        {
            var jsonData = JsonSerializer.Serialize(data);

            if (timeSpan.HasValue)
            {
                await dbConnection.StringSetAsync(recordId, jsonData, timeSpan);
            }
            else
            {
                timeSpan = TimeSpan.FromMinutes(30);
                await dbConnection.StringSetAsync(recordId, jsonData, timeSpan);
            }
        }

        public static async Task<T> GetValueAsync<T>(string recordId)
        {
            var data = await dbConnection.StringGetAsync(recordId);
            var jsonData = data.ToString();

            if (jsonData is null)
            {
                return default(T);
            }

            return JsonSerializer.Deserialize<T>(jsonData);
        }

        public static async Task DeleteValueAsync(string recordId)
        {
            await dbConnection.KeyDeleteAsync(recordId);
        }

        public static async Task<bool> IsKeyNull(string recordId)
        {
            var value = await dbConnection.StringGetAsync(recordId);
            var isNull = value.IsNullOrEmpty ? true : false;
            return isNull;
        }

但我不断收到这个错误,我无法理解它想说什么:

StackExchange.Redis.RedisConnectionException
  HResult=0x80131500
  Message=No connection is active/available to service this operation: GET Order; A blocking operation was interrupted by a call to WSACancelBlockingCall, mc: 1/1/0, mgr: 10 of 10 available, clientName: ASR-PC, IOCP: (Busy=2,Free=998,Min=4,Max=1000), WORKER: (Busy=1,Free=8190,Min=4,Max=8191), v: 2.1x.58.3xyz
  Source=StackExchange.Redis
  StackTrace:
   at StackExchange.Redis.ConnectionMultiplexer.ThrowFailed[T](TaskCompletionSource`1 source, Exception unthrownException) in /_/src/StackExchange.Redis/ConnectionMultiplexer.cs:line 2777
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at RedisCache.DistributedCacheExtensions.<IsKeyNull>d__4.MoveNext() in RedisCache\\DistributedCacheExtensions.cs:line 67
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at BusinessLogic.Services.Order.OrderService.GetOnlineOrderCount(Int32 storeId) in OrderService.cs:line 1846
   at GetOnlineOrderCount(Int32 storeId) in Api\\Controllers\\Order\\OrderController.cs:line 443
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)

Inner Exception 1:
RedisConnectionException: SocketFailure on windows.net:6380/Subscription, Initializing/NotStarted, last: NONE, origin: ConnectedAsync, outstanding: 0, last-read: 10s ago, last-write: 10s ago, keep-alive: 60s, state: Connecting, mgr: 10 of 10 available, last-heartbeat: never, global: 10s ago, v: 2.x.58.3xyz

Inner Exception 2:
IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall.

Inner Exception 3:
SocketException: A blocking operation was interrupted by a call to WSACancelBlockingCall

我的 redis 连接字符串如下所示:

windows.net:6380,密码=xyz=,ssl=True,abortConnect=False,connectTimeout=10000,connectRetry=8,syncTimeout=3000

  • 大概意味着它无法连接 - 尝试删除 abortConnect=False 并查看它是否在 Connect/ConnectAsync 期间为您提供更有用的错误;另外-尝试将文本编写器作为Connect/ConnectAsynclog 参数传递,这可以向您展示它在做什么
  • 顺便说一句:对于IsKeyNull:请注意,redis 没有null 的概念,所以您在这里真正测试的是“它是否存在?” - 为此:KeyExists(...) 更有效

标签: c# redis


【解决方案1】:

可能是 TLS 的问题

鉴于您的连接字符串windows.net:6380,password=xyz=,ssl=True,abortConnect=False,connectTimeout=10000,connectRetry=8,syncTimeout=3000,我将在黑暗中尝试一下,并说您最有可能的问题是 TLS 问题。很可能,您的 redis-server 没有启用 TLS。有趣的是,通过将abortConnect 明确设置为false,连接本身不会提前大声失败。

尝试禁用 TLS

让您的代码工作的最短路径可能是从连接字符串中删除ssl=True 位。这将阻止多路复用器尝试与 redis 进行 tls 协商。

如果你真的需要 TLS

如果您需要 TLS,您需要确保:

  1. 正确配置您的服务器(启用 TLS 不是默认设置,也不是 Redis 的默认构建)
  2. 正确配置多路复用器

    配置服务器

    在 redis 中启用 tls 有两种途径。首先,您可以使用第三方 redis 提供程序,tls 是 Redis 提供程序的一个非常标准的功能。或者,您可以使用设置了 tls 标志的源代码构建 Redis,然后使用您的 certs / ca 文件加载 tls。在redis.io 上有一篇很棒的文章

    配置客户端

    在您的 Redis 服务器上启用 TLS 后,您需要验证您的证书和 CA 是否都被客户端接受,有几个途径可以做到这一点。您可以在计算机的证书存储中加载 CA/证书。或者您可以将它们直接加载到客户端,这是一篇关于如何configure TLS in the multiplexer 的文章,该示例显示了如何使用 TLS 连接到 Redis Cloud 实例,但这些步骤适用于您使用的任何 certs/ca

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2012-06-07
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多