- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 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)
}
}
最佳答案
我认为您需要区分以下情况(按发生可能性的顺序排列):
缓存中没有数据 (Redis) - 我想在这种情况下,Redis 会很快返回,您必须从 Mongo 获取它。在上面的代码中,您需要在从 Mongo 获取数据后在 Redis 中设置数据,以便将其保存在缓存中以供后续调用使用。
您需要将 RedisClient 包装在您的应用程序代码中,以了解任何断开连接/重新连接。本质上有两种状态 - 第一种,当 Redis 正常工作时,第二种,当 Redis 停机/变慢时。
Redis 很慢 - 这可能是由于以下原因之一造成的。
2.1. 网络速度慢:同样,您对此无能为力,只能向您的客户返回一条消息。如果您的网络本身很慢,使用 Mongo 不太可能解决这个问题。
2.2。 操作缓慢:例如,如果您尝试获取大量数据或者您正在对排序集运行范围查询,就会发生这种情况。在这种情况下,您需要重新访问您正在使用的 Redis 数据结构以及您存储在 Redis 中的数据量。但是,在您的示例中,这不会成为问题。单个 Redis get 操作在 LAN 上通常延迟较低。
无法访问 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/
我有一些 Scala 代码,它用两个不同版本的类型参数化函数做了一些漂亮的事情。我已经从我的应用程序中简化了很多,但最后我的代码充满了形式 w(f[Int],f[Double]) 的调用。哪里w()是
如果我在同一目录中有两个单独的未编译的 scala 文件: // hello.scala object hello { def world() = println("hello world") }
val schema = df.schema val x = df.flatMap(r => (0 until schema.length).map { idx => ((idx, r.g
环境: Play 2.3.0/Scala 2.11.1/IntelliJ 13.1 我使用 Typesafe Activator 1.2.1 用 Scala 2.11.1 创建一个新项目。项目创建好后
我只是想知道如何使用我自己的类扩展 Scala 控制台和“脚本”运行程序,以便我可以通过使用实际的 Scala 语言与其通信来实际使用我的代码?我应将 jar 放在哪里,以便无需临时配置即可从每个 S
我已经根据 README.md 文件安装了 ensime,但是,我在低级 ensime-server 缓冲区中出现以下错误: 信息: fatal error :scala.tools.nsc.Miss
我正在阅读《Scala 编程》一书。在书中,它说“一个函数文字被编译成一个类,当在运行时实例化时它是一个函数值”。并且它提到“函数值是对象,因此您可以根据需要将它们存储在变量中”。 所以我尝试检查函数
我有 hello world scala native 应用程序,想对此应用程序运行小型 scala 测试我使用通常的测试命令,但它抛出异常: NativeMain.scala object Nati
有few resources在网络上,在编写与代码模式匹配的 Scala 编译器插件方面很有指导意义,但这些对生成代码(构建符号树)没有帮助。我应该从哪里开始弄清楚如何做到这一点? (如果有比手动构建
我是 Scala 的新手。但是,我用 创建了一个中等大小的程序。斯卡拉 2.9.0 .现在我想使用一个仅适用于 的开源库斯卡拉 2.7.7 . 是吗可能 在我的 Scala 2.9.0 程序中使用这个
有没有办法在 Scala 2.11 中使用 scala-pickling? 我在 sonatype 存储库中尝试了唯一的 scala-pickling_2.11 工件,但它似乎不起作用。我收到消息:
这与命令行编译器选项无关。如何以编程方式获取代码内的 Scala 版本? 或者,Eclipse Scala 插件 v2 在哪里存储 scalac 的路径? 最佳答案 这无需访问 scala-compi
我正在阅读《Scala 编程》一书,并在第 6 章中的类 Rational 实现中遇到了一些问题。 这是我的 Rational 类的初始版本(基于本书) class Rational(numerato
我是 Scala 新手,我正在尝试开发一个使用自定义库的小项目。我在库内创建了一个mysql连接池。这是我的库的build.sbt organization := "com.learn" name :
我正在尝试运行一些 Scala 代码,只是暂时打印出“Hello”,但我希望在 SBT 项目中编译 Scala 代码之前运行 Scala 代码。我发现在 build.sbt 中有以下工作。 compi
Here链接到 maven Scala 插件使用。但没有提到它使用的究竟是什么 Scala 版本。我创建了具有以下配置的 Maven Scala 项目: org.scala-tools
我对 Scala 还很陌生,请多多包涵。我有一堆包裹在一个大数组中的 future 。 future 已经完成了查看几 TB 数据的辛勤工作,在我的应用程序结束时,我想总结上述 future 的所有结
我有一个 scala 宏,它依赖于通过包含其位置的静态字符串指定的任意 xml 文件。 def myMacro(path: String) = macro myMacroImpl def myMacr
这是我的功能: def sumOfSquaresOfOdd(in: Seq[Int]): Int = { in.filter(_%2==1).map(_*_).reduce(_+_) } 为什么我
这个问题在这里已经有了答案: Calculating the difference between two Java date instances (45 个答案) 关闭 5 年前。 所以我有一个这
我是一名优秀的程序员,十分优秀!