c# - Redis超时异常

标签 c# .net redis

我每隔几秒就会将一些数据从控制台应用程序推送到 Redis 实例。这就是我的大致做法:

            int foo = GetFoo();
            BigObject bar = GetBigObject();

            _cache.StringSet("Foo", JsonConvert.SerializeObject(foo));
            _cache.StringSet("Bar", JsonConvert.SerializeObject(bar));

但过了一会儿我得到一个异常:

StackExchange.Redis.RedisTimeoutException: 'Timeout performing SET RtSignal-op (5000ms), inst: 0, qu: 0, qs: 0, aw: False, rs: CompletePendingMessage, ws: Idle, in: 0, in-pipe: 5, out-pipe: 0, serverEndpoint: Unspecified/localhost:5002, mgr: 9 of 10 available, clientName: SVGD0083, IOCP: (Busy=0,Free=1000,Min=16,Max=1000), WORKER: (Busy=3,Free=32764,Min=16,Max=32767), v: 2.0.593.37019 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts)'

在链接到的页面中,建议问题可能是 Thread Theft 的结果,解决方案是包括以下行:

ConnectionMultiplexer.SetFeatureFlag("preventthreadtheft", true);

问题是 .NET 框架中似乎不存在 SetFeatureFlag 方法。

有什么想法吗?

最佳答案

您的对象的大小是多少?如果 JsonConvert.SerializeObject(foo) 返回一个 500MB 的字符串,那么是的:你将度过糟糕的一天。

此外,服务器还做了什么?这需要在服务器上进行一些挖掘,但是:redis SLOWLOG 命令为您提供有关长时间运行操作的信息。如果有任何事情需要很长时间(我会开始对任何超过 10 毫秒的事情感到紧张),那么你的服务器基本上停止了,这需要进行调查 - 但这不是库可以修复。

如果您正在与远处的服务器通信,您可能需要更长的超时时间。

最后,我非常怀疑这种特殊情况与线程盗窃有关;如果有的话,这听起来像是你在抓救命稻草(比喻)。但是,如果 ConnectionMultiplexer.SetFeatureFlag 不存在,则您可能正在使用旧版本的库。那么:您使用的是什么版本的库?

关于c# - Redis超时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65899195/

相关文章:

sql - 如何在 Access 中使用 INSERT INTO 查询插入来自变量的记录

c# - ServiceStack Redis C# 检索数据缓慢

scala - 使用 rediscala 批量插入

php - 对 redis 集群 php 的检查和设置操作

c# - 接口(interface)会在子类中自动实现吗?

c# - 无法从用法推断方法的类型参数。尝试专门指定类型参数

c# - 如何使用 Photon 进行匹配?

c# - 分离接口(interface)并使它们更通用

c# - 每个团队成员和分支的不同 *.csproj/*.config 设置

c# - 在 LINQ 表达式中加入对象