我们正在实现一种模式,我们的客户端会检查Redis中是否存在文档,如果不存在,我们就会从数据库中获取数据。
我们正在尝试处理Redis服务器关闭或无法访问的情况,以便我们可以立即从数据库中提取。
但是,当我们通过故意取下Redis服务器测试我们的代码时,通过ServiceStack客户端对Redis的调用不会超时约20秒。
我们尝试将RedisClient .SendTimeout属性用于各种值(1000,100,1),但超时总是在大约20秒后发生。我们也尝试使用.Ping()方法但遇到同样的问题。
问题:我们如何处理Redis服务器关闭的情况,我们想更快地切换到数据库提取?
答案 0 :(得分:1)
我在发送电子邮件时遇到了类似的问题:有时候没有答案,内置超时(SmtpClient)什么也没做。最终我得到了一个超时,我相信它来自底层的TCP / IP层。我将客户端的超时时间设置为短于"残酷超时"在Task.Wait。
我的解决方案是将调用包装在一个Task中,并对其使用超时:
// this special construct is to set a timeout (the SmtpClient timeout does not seem to work)
var task = Task.Factory.StartNew(() => SendEmail(request));
if (!task.Wait(6000))
Log.Error("Could not send mail to {0}. Timeout (probably on TCP layer).".Fmt(request.To));
也许类似的东西对你有用,只需用一个执行Redis的方法替换SendEmail。
答案 1 :(得分:0)
您不应该依赖redis服务器来告诉您在翻转到计划B之前请求应该等待多长时间。将此逻辑放在执行请求的代码中,以便它与redis服务器的设置方式无关