我有一个数据库访问权限,我想在我的 akka/spray 应用程序中缓存。数据库返回一个 Future[Option[X]]。
我设置了一个 lruCache 并将其包装在我的数据库访问周围。
我想要实现的是,仅缓存选项,如果它是 Some(X),如果它是 None,则不缓存。在后一种情况下,应再次从数据库检索数据。
或者,如果这有帮助的话,我可能会让 future 失败......
到目前为止,我通过 map 再次从缓存中删除了该选项,如果它为“无”或将来失败,则恢复:
cache(key) {
server.one[X](...)
}.map {
case Some(x) => Some(x)
case None => {
cache.remove(key)
None
}
}.recover {
case x => userCache.remove(key)
}
但这非常难看,更不用说 map 中的副作用等等......
提前谢谢您,
延斯
最佳答案
如果将来失败,那么该值将从缓存中删除: https://github.com/spray/spray/blob/master/spray-caching/src/main/scala/spray/caching/LruCache.scala#L79
所以这应该可以做到:
cache(key) { server.one[X](...).map(_.get) }
关于scala - 喷雾缓存 : cache only when not None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21400112/