我有一个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)
}
但这非常难看,更不用说地图中的副作用等......
提前谢谢你,
延
答案 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) }