我每隔几秒钟就会将一些数据从控制台应用程序中推到Redis实例。我大概就是这样做的:
int foo = GetFoo();
BigObject bar = GetBigObject();
_cache.StringSet("Foo", JsonConvert.SerializeObject(foo));
_cache.StringSet("Bar", JsonConvert.SerializeObject(bar));但过了一段时间我得到了一个例外:
StackExchange.Redis.RedisTimeoutException:‘超时值执行集RtSignal-op (5000 Qs),inst: 0,qs: 0,aw: False,rs: CompletePendingMessage,in: 0,in-管道: 5,serverEndpoint: un期/localhost:5002,mgr: 10中的9,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 (请看本文中一些常见的客户端问题,这些问题可能导致超时:https://stackexchange.github.io/StackExchange.Redis/Timeouts)
在链接到的页面中,有一个建议认为这个问题可能是Thread Theft的结果,解决方案是包含以下一行:
ConnectionMultiplexer.SetFeatureFlag("preventthreadtheft", true);问题是,在SetFeatureFlag框架中似乎不存在一个.NET方法。
有什么想法吗?
发布于 2021-01-27 16:25:51
你的物品有多大?如果JsonConvert.SerializeObject(foo)返回一个500 to的字符串,那么是的:您将度过糟糕的一天。
此外,服务器还在做什么?这需要在服务器上进行一些深入研究,但是: redis SLOWLOG命令可以将信息提供给长期运行的操作。如果任何事情花费了很长的时间(我会开始对任何花费超过10毫秒的东西感到不安),那么您的服务器本质上是处于停滞状态,这需要进行调查--但这不是库可以修复的。
如果您正在与一个遥远的服务器交谈,您可能需要一个更大的超时。
最后,我非常怀疑这个特定的场景是否与线程盗窃有关;如果说有什么关系的话,那听起来就像是在抓吸管(比喻)。但是如果ConnectionMultiplexer.SetFeatureFlag不存在,那么您可能使用的是旧的库版本。那么:您使用的是什么库版本?
发布于 2021-01-27 16:19:20
StackExchange.Redis不是.net框架的一部分。
_cache可能是StackExchange.Redis.IDatabase对象类型。因此,只需添加在应用程序中初始化redis支持的行--可能是在startup.cs。
https://stackoverflow.com/questions/65899195
复制相似问题