2011-07-27 14 views
9

私はマップに情報をキャッシュしたいので、たとえばDBにアクセスする必要はありません。 Javaでは、私はGoogleコレクションの優れたMapMakerを使用し、必要に応じてキャッシュを新鮮に保つために有効期限を設定し、メモリ使用量を抑えるためにsoftValuesを設定します。それから私は現在キャッシュされていないキーの値を計算する関数を持っています。有効期限とソフト値を持つマップベースのキャッシュ

MapMaker().softValues 
      .expireAfterWrite(10, TimeUnit.MINUTES) 
      .makeComputingMap(Function(...)); 

スカラーでこれを行うにはどうすればよいですか?

+0

を、なぜScalaではそれが違うのですか?私はスカラーに特化したライブラリは認識していません。 –

+4

私はより慣用的な答えを期待していました。 Google Guavaは優れていますが、私はScalaのコレクションライブラリがあたかもそのままの状態で書かれている場合、依存関係を含める必要はありません。 –

+0

そして、ちょうど 'MapMaker()。softValues'は廃止されました。(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/MapMaker.html#softValues() )、代わりに 'CacheBuilder.softValues()'を使ってください。 – sbeliakov

答えて

6

Kimが言ったように、MapMakerがうまく機能するのはなぜでしょうか?

import collection.JavaConverters._ 
val cache = /* your MapMaker code creating a Java map */.asScala 

これで、Scalaマップのメソッドを使用して基礎となるJavaマップにアクセスできます。

+1

認められていますが、私がKimに言ったように、これを行うためのScala風の方法が必要でしょうか? –

+0

@Ben、私が知っている箱のままではありません。 –

1

私はScalaで機能的に透過的な有効期限マップを作成しました。要素を追加および削除すると、期限切れの値もすべて削除される新しいマップが生成されます。

Expiration Map

0

私もScalaでグアバキャッシュソリューションを使用し続ける:)すべての

まず、コメントの一つで述べたように、Guava Cacheの新しいバージョンでは、MapMaker()が廃止されたんだと代わりにCacheBuilderを使用してください。

だから今、Scalaではフォローのようになります。

lazy val cachedData = CacheBuilder.newBuilder() 
    .expireAfterWrite(60, TimeUnit.MINUTES) 
    .maximumSize(10) 
    .build(
     new CacheLoader[Key, Data] { 
     def load(key: Key): Data = { 
      veryExpansiveDataCreation(key) 
     } 
     } 
    ) 

をそこから読み取るには、あなたのような何かを使用することができます。これは、Javaであなたのためにうまく機能している場合

def cachedData(ketToData: Key): Data = { 
    try { 
     return cachedData.get(ketToData) 
    } catch { 
     case ee: Exception => throw new YourSpecialException(ee.getMessage); 
    } 
    } 
関連する問題