我每隔几秒就会将一些数据从控制台应用程序推送到 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/