gpt4 book ai didi

scala - RedisClient 失败策略

转载 作者:IT王子 更新时间:2023-10-29 06:05:36 26 4
gpt4 key购买 nike

我在 Scala 中使用游戏框架。我还使用 RedisScala 驱动程序(这个 https://github.com/etaty/rediscala )与 Redis 通信。如果 Redis 不包含数据,那么我的应用程序正在 MongoDB 中查找数据。当 Redis 失败或由于某种原因不可用时,应用程序等待响应的时间过长。在这种情况下如何实现故障转移策略。如果请求花费的时间太长,我想停止请求 Redis。并在 Redis 恢复在线后开始使用它。为了澄清这个问题,我的代码就像现在一样

private def getUserInfo(userName: String): Future[Option[UserInfo]] = {
CacheRepository.getBaseUserInfo(userName) flatMap{
case Some(userInfo) =>
Logger.trace(s"AuthenticatedAction.getUserInfo($userName). User has been found in cache")
Future.successful(Some(userInfo))
case None =>
getUserFromMongo(userName)
}
}

最佳答案

我认为您需要区分以下情况(按发生可能性的顺序排列):

  1. 缓存中没有数据 (Redis) - 我想在这种情况下,Redis 会很快返回,您必须从 Mongo 获取它。在上面的代码中,您需要在从 Mongo 获取数据后在 Redis 中设置数据,以便将其保存在缓存中以供后续调用使用。

    您需要将 RedisClient 包装在您的应用程序代码中,以了解任何断开连接/重新连接。本质上有两种状态 - 第一种,当 Redis 正常工作时,第二种,当 Redis 停机/变慢时。

  2. Redis 很慢 - 这可能是由于以下原因之一造成的。
    2.1. 网络速度慢:同样,您对此无能为力,只能向您的客户返回一条消息。如果您的网络本身很慢,使用 Mongo 不太可能解决这个问题。

    2.2。 操作缓慢:例如,如果您尝试获取大量数据或者您正在对排序集运行范围查询,就会发生这种情况。在这种情况下,您需要重新访问您正在使用的 Redis 数据结构以及您存储在 Redis 中的数据量。但是,在您的示例中,这不会成为问题。单个 Redis get 操作在 LAN 上通常延迟较低。

  3. 无法访问 Redis 节点 - 我不确定这种情况会多久发生一次,除非您的网络出现故障。在这种情况下,您也将无法连接到 MongoDB。我相信这也可能发生在运行 Redis 的节点关闭或磁盘已满等情况下。因此您应该在设计中处理这个问题。话虽如此,Rediscala 客户端将自动检测任何断开连接并自动重新连接。我个人已经这样做了。停止并升级 Redis 版本并重新启动 Redis,而无需触及我正在运行的客户端(JVM)。

最后,您可以在上面的程序中使用带超时的 Future(参见 - Scala Futures - built in timeout?)。如果 Future 没有在超时前完成,您可以采取其他操作(转到 Mongo 或向用户返回错误消息)。鉴于 #1 和 #2 可能比 #3 更频繁地发生,您的超时值应该反射(reflect)这两种情况。鉴于 #1 和 #2 在 LAN 上速度很快,您可以从 100 毫秒的超时值开始。

关于scala - RedisClient 失败策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27639206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com