如何在ServiceStack Redis客户端中设置超时时间?

6
我们正在实现一种模式,其中客户端检查Redis中是否存在文档,如果不存在,则从数据库获取数据。我们试图处理Redis服务器宕机或不可访问的情况,以便我们可以立即从数据库获取数据。但是,当我们通过有意关闭Redis服务器来测试我们的代码时,通过ServiceStack客户端调用Redis并且大约需要20秒才能超时。我们尝试将RedisClient.SendTimeout属性设置为不同的值(1000、100、1),但超时总是在大约20秒后发生。我们还尝试使用.Ping()方法,但问题仍然存在。问题是:我们如何处理Redis服务器宕机的情况,并更快地切换到数据库获取数据?
2个回答

1
我遇到了一个类似的问题,发送电子邮件时有时候没有回复,而内置的超时(SmtpClient)无效。最终我会得到一个超时错误,我认为这是来自底层TCP/IP层的错误。我在客户端中设置的超时时间比Task.Wait的“brutal timeout”略短。
我的解决方案是将调用包装在一个任务中,并对其进行超时处理:
        // 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));

也许类似的方法适用于你,只需将SendEmail替换为执行Redis操作的方法即可。

0

您不应该依赖Redis服务器来告诉您在切换到备用计划之前请求应等待多长时间。将此逻辑放入处理请求的代码中,使其独立于Redis服务器的设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接