Redis超时异常。

3

我正在使用控制台应用程序每隔几秒钟向Redis实例推送一些数据。 大致上我是这样做的:

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

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

但是一段时间后我会收到一个异常:

StackExchange.Redis.RedisTimeoutException:'超时执行SET RtSignal-op(5000毫秒),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: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);

问题在于.NET框架中似乎不存在一个名为SetFeatureFlag的方法。

有什么想法吗?


迁移到.NET 5? - aepot
这个对我有所帮助,我的web.config文件里的httpRuntime标签中没有targetFramework属性:https://learn.microsoft.com/en-us/answers/questions/993854/all-redis-commands-timing-out-when-using-azure-cac.html - MartinS
2个回答

2

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

此外,服务器还在做什么?这需要在服务器上进行一些挖掘,但是:redis SLOWLOG命令可以为您提供有关长时间运行操作的信息。如果任何事情都需要很长时间(我会开始感到不安,因为任何超过10毫秒的事情都会让我感到不安),那么您的服务器基本上处于停滞状态,这需要进行调查 - 但这并不是库可以解决的问题。

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

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


感谢您的输入!非常感谢。该对象甚至不接近500MB,最多只有几KB。Redis正在Docker中运行,写入数据的客户端只需每隔几秒钟调用StringSet即可。无论是客户端还是Redis都在同一台机器上运行。实际上,它已经运行了相当长的时间,没有出现错误,可能是几个小时。 - Q-bertsuit

0

StackExchange.Redis不是.NET框架的一部分。

_cache可能是StackExchange.Redis.IDatabase对象类型。 因此,只需在应用程序中添加初始化redis支持的行 - 可能在startup.cs中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接