【发布时间】:2014-10-23 10:09:54
【问题描述】:
我正在经历所谓的超时执行 HGET company:product:settings, inst: 1, queue: 8, qu=0, qs=8, qc=0, wr=0/0, in =79/1 超时异常。
这很奇怪,因为同一台机器上的同一个 Redis 实例正在存储数据,但它是一个特定的应用程序引发了这个异常。 更新:其实同一个应用,上面一行从Redis接收数据。问题在于HGET。
另外,我将多路复用器配置的超时时间增加到 6 秒,但没有运气。
此外,我检查了IDatabase 实例具有IsConnected 和true 值。
如何解释这些错误消息以及整个超时背后的问题是什么?
一些背景...
我已成功解决了更改当某些代码部分获得数据库(即multiplexer.GetDatabase())的问题。
虽然 multiplexer 如 StackExchange.Redis 文档中所述,每个 AppDomain 都有一个实例,但许多控制反转组件正在自己的代码中创建许多 IDatabase 实例。也就是说,IDatabase 实例未共享。
实际代码执行ListRightPopLeftPush,然后实例化控制组件的反转,该组件在组件实例化期间读取哈希键。如果在做所谓的ListRightPopLeftPush之前实例化整个组件,那么整个HashGet就不会抛出超时异常。
似乎即使从其他IDatabase 实例执行ListRightPopLeftPush,在执行读取操作时也会在下一个IDatabase 实例中产生某种问题。
无论如何,我的 fix 没有回答这个问题。我刚刚添加了更详细的信息,以便我们找到问题所在和自己的解决方案。
更新
无论如何,上述“修复”不会修复对 Redis 的进一步读取访问。我在进一步的调用中遇到了相同的超时异常。现在in 异常消息中的参数显示60/1。
【问题讨论】:
-
in=79/1 告诉我有可用数据并且读者正在处理它;我需要检查一下是否有任何方法可以让读者在这里停滞不前。
-
@MarcGravell 嘿,你想怎么检查?无论如何,这是工作中的代码,我们应该在下周一检查...
-
@MarcGravell 没关系,我知道你要检查一些测试;)
-
@MarcGravell 您是否对问题背后的原因有任何线索?如果您需要更多详细信息,您可以询问他们,我会将它们添加到问题中
-
@MarcGravell 我添加了新的详细信息,因为我可以“修复”更改代码中某些执行顺序的问题。也许这会给你更多的信息......
标签: c# .net exception redis stackexchange.redis