使用 StackExchange.Redis 处理暂时性网络错误

eol*_*dre 5 c# redis stackexchange.redis

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

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

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

通常它是一个 System.Net.SocketException,带有消息“已建立的连接被主机中的软件中止”或“现有连接被远程主机强制关闭”

如果抛出 System.Net.SocketException,StackExchange.Redis 是否会自动重试,直到达到syncTimeout 时间为止?

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

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

感谢您的任何指导。

Col*_*nee 3

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

就实际重试而言,只要多路复用器的某些连接仍然有效,您就可以退出并重试。

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