2014-01-28 4 views
2

У меня есть доступ к db, который я хотел бы кэшировать в своем приложении akka/spray. Db возвращает Future [Option [X]].спрей-кеш: кеш только тогда, когда нет Нет

Я установил lruCache и завернул его в araound my db-access.

То, что я хотел бы достичь, заключается в том, чтобы кешировать только опцию, если она некоторая (X), а не, если она отсутствует. В последнем случае данные должны быть снова извлечены из db.

Alternativly я мог не будущее, если это поможет ...

До сих пор я удалить вариант из кэша снова через карту и восстановить, если он не является None или будущее не удалось:

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

Но это очень некрасиво, не говоря уже о побочных эффектах на карте, и т.д. ...

Спасибо заранее,

Jens

ответ

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) } 
+0

Большое спасибо. Не видели эту информацию в документах ... – jens

+0

Помогите им, отправив PR в свою документацию, уточнив это? :) –

Смежные вопросы