spray-cache:仅在不是None时缓存

时间:2014-01-28 08:11:29

标签: scala caching spray

我有一个db-access我想缓存在我的akka​​ / spray-application中。 db返回Future [Option [X]]。

我设置了一个lruCache并将其包装在我的db-access中。

我想要实现的是,仅缓存Option,如果它是Some(X)而不是,如果它是None。在后一种情况下,应该再次从数据库中检索数据。

另外,如果这会有所帮助,我可能会失败...

到目前为止,我通过map再次从缓存中删除Option,如果是None或者将来失败则恢复:

cache(key) {
      server.one[X](...)
}.map {
   case Some(x) => Some(x)
   case None => {
     cache.remove(key)
     None
  }
}.recover {
  case x => userCache.remove(key)
}

但这非常难看,更不用说地图中的副作用等......

提前谢谢你,

1 个答案:

答案 0 :(得分:5)

如果未来失败,则该值将从缓存中删除: https://github.com/spray/spray/blob/master/spray-caching/src/main/scala/spray/caching/LruCache.scala#L79

所以这应该这样做:

cache(key) { server.one[X](...).map(_.get) }