如何使用超时实现ServiceStack Redis客户端

时间:2012-03-20 21:52:06

标签: redis servicestack

我们正在实现一种模式,我们的客户端会检查Redis中是否存在文档,如果不存在,我们就会从数据库中获取数据。

我们正在尝试处理Redis服务器关闭或无法访问的情况,以便我们可以立即从数据库中提取。

但是,当我们通过故意取下Redis服务器测试我们的代码时,通过ServiceStack客户端对Redis的调用不会超时约20秒。

我们尝试将RedisClient .SendTimeout属性用于各种值(1000,100,1),但超时总是在大约20秒后发生。我们也尝试使用.Ping()方法但遇到同样的问题。

问题:我们如何处理Redis服务器关闭的情况,我们想更快地切换到数据库提取?

2 个答案:

答案 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服务器的设置方式无关