C# Redis TimeoutException
我每隔几秒钟就从控制台应用程序向Redis实例推送一些数据。我大致就是这样做的:C# Redis TimeoutException,c#,.net,redis,C#,.net,Redis,我每隔几秒钟就从控制台应用程序向Redis实例推送一些数据。我大致就是这样做的: int foo = GetFoo(); BigObject bar = GetBigObject(); _cache.StringSet("Foo", JsonConvert.SerializeObject(foo)); _cache.StringSet("Bar", JsonC
int foo = GetFoo();
BigObject bar = GetBigObject();
_cache.StringSet("Foo", JsonConvert.SerializeObject(foo));
_cache.StringSet("Bar", JsonConvert.SerializeObject(bar));
但过了一会儿,我得到了一个例外:
StackExchange.Redis.RedisTimeoutException:“执行设置超时”
RTOP信号(5000ms),指令:0,量程:0,qs:0,aw:False,rs:
CompletePendingMessage,ws:Idle,in:0,in-pipe:5,out-pipe:0,
serverEndpoint:未指定/localhost:5002,管理器:10个中的9个可用,
客户名称:SVGD0083,IOCP:(忙=0,闲=1000,最小=16,最大=1000),
工人:(忙=3,闲=32764,最小=16,最大=32767),v:2.0.593.37019(请
请阅读本文,了解一些常见的客户端问题
可能导致超时:
)"
在“链接到”页面中,有人建议该问题可能是由于线程盗窃
造成的,解决方案是包括以下行:
ConnectionMultiplexer.SetFeatureFlag("preventthreadtheft", true);
问题在于.NET framework中似乎不存在SetFeatureFlag
方法
有什么想法吗?StackExchange.Redis不是.net框架的一部分 _缓存可能是StackExchange.Redis.IDatabase对象类型。 因此,只需添加一行代码,在应用程序中初始化redis支持—可能是在startup.cs中。对象的大小是多少?如果
JsonConvert.SerializeObject(foo)
返回一个500MB的字符串,那么是的:您将度过糟糕的一天
另外,服务器还在做什么?这需要在服务器上进行一些挖掘,但是:redisSLOWLOG
命令可以为您提供有关长期运行操作的信息。如果有任何事情需要花费很长时间(我会开始对任何超过10毫秒的事情感到不安),那么您的服务器实际上是在暂停,这需要进行调查——但这不是库可以解决的问题
如果您正在与远方的服务器通话,可能需要更长的超时时间
最后,我非常怀疑这个特定场景是否与线程盗窃有关;如果有什么不同的话,那听起来像是你在抓救命稻草(比喻)。但如果
ConnectionMultiplexer.SetFeatureFlag
不存在,则可能使用的是旧库版本。那么:您使用的是什么库版本?迁移到.NET 5?谢谢您的输入!非常感谢。该对象甚至不接近500MB。最多几个Kb。Redis在docker中运行,编写数据的客户端每隔几秒钟就调用一次StringSet。客户端和Redis都在同一台机器上运行。它实际上已经运行了很长一段时间,没有出现错误,可能只有几个小时