Легкое кэширование в Scala?
Мне просто интересно, есть ли какое-либо решение для кэширования в Scala.
Я ищу что-то вроде Guava в Java.
Должен ли я использовать Guava также в Scala?
Есть ли обертка/сутенер в Scalaсе или что-то подобное?
Любая альтернатива, более подходящая для Scala devs?
Что предлагает Guava:
LoadingCache<Key, Graph> CACHE= CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(MY_LISTENER)
.build(
new CacheLoader<Key, Graph>() {
public Graph load(Key key) throws AnyException {
return createExpensiveGraph(key);
}
});
Supplier<Animal> singleAnimalCache = Suppliers.memoizeWithExpiration(animalFromDbSupplier(), 365, TimeUnit.DAYS);
Мне нужно некоторое базовое управление кешем, например, в Guava.
Ответы
Ответ 1
Есть ли в Scalaz обертка/сутенер или что-то подобное?
В Scalaz 7 есть Memo
, который я немного коснулся обучения Scalaz день 16.
Это первое, что сказал Адам Розен в скалаз "Для остальных нас" , так что проверьте это тоже. Он использует Scalaz 6.
Ответ 2
У нас были те же требования и в итоге были построены обертки вокруг Гуавы. Недавно мы открыли часть библиотеки под названием Mango. Если вы не возражаете против дополнительной зависимости, вы можете использовать ее как
import org.feijoas.mango.common.cache._
import org.feijoas.mango.common.base.Suppliers._
val MY_LISTENER = (remNot: RemovalNotification[Key, Graph]) => ()
// > MY_LISTENER : RemovalNotification[Key,Graph] => Unit = <function1>
val CACHE = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(MY_LISTENER)
.build { (key: Key) => new Graph() }
// > CACHE : LoadingCache[Key,Graph] = <function1>
val animalFromDbSupplier = () => {
// load from db
new Animal()
}
// > animalFromDbSupplier : () => Animal = <function0>
val singleAnimalCache = memoizeWithExpiration(animalFromDbSupplier, 365, TimeUnit.DAYS)
// > singleAnimalCache : () => Animal = Suppliers.memoizeWithExpiration(<function0>, 365, DAYS)
Ответ 3
Просто добавьте ответ, чтобы подключить мой собственный проект, но я рекомендую ScalaCache.
- Поддержка Guava, Ehcache, Memcached и Redis (или вы можете подключить свою собственную реализацию, если хотите)
- Простой, идиоматический Scala API
- Поддержка для каждого элемента Time To Live (даже для Guava, который не предоставляет этого из коробки)
- Поддержка автоматического генерации ключей кеша с помощью макромагии
https://github.com/cb372/scalacache