首页 文章

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

提问于
浏览
6

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

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

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

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

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

2 回答

  • 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 .

  • 0

    您不应该依赖redis服务器来告诉您在翻转到计划B之前请求应该等待多长时间 . 将此逻辑放在执行请求的代码中,以便它与redis服务器的设置方式无关

相关问题