使用StackExchange.Redis处理瞬态网络错误

时间:2017-08-01 19:41:40

标签: c# redis stackexchange.redis

在使用StackExchange.Redis客户端时,寻找有关处理临时网络问题的指导。

为了澄清,我并不是说最初使用ConnectionMultiplexer.Connect()连接到Redis服务器。我指的是如何处理在操作过程中因任何原因而中断的连接。 (我们可以假设命令是幂等的,StringSet,StringGet)

我问,因为我们正在从ServiceStack迁移到StackExchange客户端。在我们正在替换的代码中,它使用ServiceStack,捕获异常,并在短的thread.sleep()之后再次尝试操作。这在我们的生产环境中经常发生,并且在大多数情况下重试都会起作用。

通常它是一个带有消息&#34的System.Net.SocketException;已建立的连接被主机中的软件中止了#34;或"远程主机"

强行关闭现有连接

如果抛出System.Net.SocketException,StackExchange.Red会自动重试,直到syncTimeout时间结束?

如果SE.Redis没有自动重试,是否在我们的代码中初始操作失败和重试之间会出现任何建议的步骤?如:

  • 等待很短的时间?
  • 重新创建多路复用器? (我猜不会)
  • 调用Close()和Configure()?

感谢您提供任何指导。

1 个答案:

答案 0 :(得分:2)

它不会自动重试。如果发生错误,您需要自己捕获并重试。

就实际重试而言,只要某些多路复用器的连接仍处于活动状态,您就可以退回并重试。

如果连接失败,尝试恢复,但是存在一个长期存在的错误,它可能会间歇性地进入某个不可恢复的状态并保持断开状态。如果IsConnected返回false,我们会通过重新创建多路复用器来解决此问题。