如何正确使用spray.io LruCache

时间:2015-02-25 17:01:37

标签: scala caching spray

我是一个没有经验的喷雾/ scala开发人员,我正在尝试正确使用spray.io LruCache。我想要实现一些非常简单的事情。我有一个kafka消费者,当它从主题中读取内容时,我希望它将其读取的值放入缓存中。 然后在其中一个路由中我想读取这个值,值是字符串类型,我现在看到的内容如下:

object MyCache {

  val cache: Cache[String] = LruCache(
    maxCapacity      = 10000,
    initialCapacity  = 100,
    timeToLive       = Duration.Inf,
    timeToIdle       = Duration(24, TimeUnit.HOURS)
   )
}

将某些内容放入缓存我使用以下代码:

def message() = Future { new String(singleMessage.message()) }
MyCache.cache(key, message)

然后在其中一条路线中,我试图从缓存中获取一些东西:

val res = MyCache.cache.get(keyHash)

问题是res的类型是Option [Future [String]],在这种情况下访问实际值是相当困难和丑陋的。请问有人可以告诉我如何简化我的代码以使其更好,更具可读性? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

不要试图从未来获得价值。而是调用Future上的map来安排在Future完成时对值进行的工作,然后用该结果完成请求(这本身就是Future)。看起来应该是这样的:

path("foo") {
  complete(MyCache.cache.get(keyHash) map (optMsg => ...))
}

此外,如果singleMessage.message没有进行I / O或以其他方式阻止,那么就像你一样创建未来

Future { new String(singleMessage.message) }

这样做会更有效:

Future.successful(new String(singleMessage.message))

后者只是创建一个已完成的Future,绕过使用ExecutionContext来评估函数。

如果singleMessage.message 执行I / O操作,那么理想情况下,您可以使用某些库(如Spray客户端,如果它是HTTP请求)执行I / O,返回Future(而不是使用Future { ... }创建另一个将阻止的线程。

相关问题