2012-11-29 9 views
10

スカラで利用可能なキャッシングソリューションがあるのだろうかと思います。 JavaでGuavaが提供しているようなものを探しています。Scalaの軽量キャッシングソリューション?

ScalaでもGuavaを使用する必要がありますか? Scalazなどのラッパー/ポンプはありますか? Scala devsに適した代替手段はありますか?私はグアバのようにいくつかの基本的なキャッシュ管理を必要とする

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); 

:何グアバが提供する

+0

あなたはhttp://stackoverflow.com/questions/3651313/how-to-cache-results-in-scalaに不満を持っていますか? –

+0

@ om-nom-nomこれは素晴らしく、私はMemoizer(SupplyGuのGuavaのような)を探していますが、有効期限やキャッシュのサイズなどのキャッシュ管理が必要です。Scalazの実装では表示されません –

+5

ScalaでGuavaの 'Cache'を使用するのは初めてです。 –

答えて

3

Scalazなどのラッパー/ポンプがありますか?

Scalaz 7にはMemoがあります。これはlearning Scalaz day 16で少し説明しました。

アダム・ロジーエンが最初に話したのはscalaz "For the Rest of Us"なので、それもチェックしてください。彼はScalaz 6を使用しています。

+4

ありがとう、あなたのリンク素晴らしいと思われる。しかし、Scalazによって提供されたメモは、私があなたの質問に答えたので私が知っている –

5

私たちは同じ要件を満たし、Guavaの周りにラッパーを構築しました。私たちは最近、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) 
+0

heheを行うように、有効期限をサポートしていないようです:) http://stackoverflow.com/questions/17922339/build-automation-sbt-compile-test-against複数の依存関係 –

5

のようにそれを使用することができますちょうど私自身のプロジェクトをプラグインする答えを追加することが、私はScalaCacheをお勧めします。

  • グアバ、Ehcacheの、MemcachedのとRedisのをサポートします(またはあなたが好きな場合は、独自の実装をプラグインすることができます)
  • シンプル、慣用ScalaのAPI
  • も、グァバの存続要素ごとの時間のサポート(、マクロの魔法を使用してキャッシュキーの自動生成のための
  • サポート)箱から出してそれを提供しない

https://github.com/cb372/scalacache