2012-11-29 128 views
10

我只是想知道Scala中是否有可用的緩存解決方案。 我正在尋找類似於由Java中的Guava提供的東西。Scala中的輕量級緩存解決方案?

我是否也應該在Scala中使用Guava? 在Scalaz或類似的地方有包裝/皮條客嗎? 更適合Scala開發者的其他選擇嗎?

什麼番石榴規定:

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(就像Guava和Supplyer一樣),但是我需要一些緩存管理,比如過期,最大緩存大小等等。我沒有在Scalaz的實現中看到這個 –

+5

你不會是第一個在Scala中使用Guava的'Cache'的人。 –

回答

3

Scalaz或類似的東西是否有包裝/皮條客?

在Scalaz 7中有Memo,我在learning Scalaz day 16中報道過。

這是Adam Rosien在scalaz "For the Rest of Us"談話中的第一件事,所以請檢查一下。他正在使用Scalaz 6.

+4

謝謝,你的鏈接看起來很棒。但斯卡拉茲提供的備忘錄似乎不支持像番石榴到期 –

5

我們有相同的要求,並最終建立在番石榴周圍的包裝。我們最近開源的部分庫叫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

赫赫我知道,因爲我回答你的問題:) http://stackoverflow.com/questions/17922339/build-automation-sbt-compile-test-against -multiple依賴性 –

5

只需添加一個答案來插入我自己的項目,但我建議ScalaCache。

  • 支持番石榴,的Ehcache,Memcached和Redis的(或者你可以插件自己的實現,如果你喜歡)
  • 簡單,地道的Scala API
  • 每元素存活時間支持(甚至番石榴,它不使用宏魔術提供開箱即
  • 支持自動生成緩存鍵的)

https://github.com/cb372/scalacache