Подтвердить что ты не робот

Легкое кэширование в 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.

4b9b3361

Ответ 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