1

現在、scala アプリケーションに spring AOP + Ehcache を使用しています。アノテーションを使用する単純さは本当に気に入っていますが、Spring のような大きなフレームワークを使用してキャッシングを実行することの一部ではありません。

spring のような大きなフレームワークを使わなくても、scala キャッシング ソリューションを知っていますか?

春のないそのようなもの:

 @Cacheable(cacheName = "users")
 def getByUserName(userName: String): User = {
   val userEntityFound = dao.findOne(dao.createQuery.field("email").equal(userName))
   userEntityMapper mapToDomainObject userEntityFound
  }
4

1 に答える 1

6

アクセスするには、キャッシュ ライブラリと API を区別する必要があると思います。私が見た Scala 環境で使用されているキャッシング ライブラリは、Java の世界で使用されているものと同じです。(潜在的に) 分散キャッシングには、Ehcache や memcached などが使用されます。ローカル キャッシングには、guava ライブラリのキャッシュ ユーティリティが一般的に使用されます。

キャッシュにアクセスするためのよりスカラ的な慣用的な方法を持つために、ネイティブ キャッシュ API にラッパーを記述するのは非常に簡単です。例で使用した注釈は、Java でライブラリの抽象化にアクセスする一般的な方法ですが、Scala の世界ではそれほど一般的ではありません。遊び!たとえば、フレームワークには、デフォルトで Ehcache にバインドされているキャッシュの抽象化があります。次のような構造を許可します。

val user: User = Cache.getOrElseAs[User]("item.key") {
  User.findById(connectedUser)
} 

Twitter は scala utils に guava キャッシュのラッパーを持っていましたが、それらを削除しました。現在のグアバのバージョンでは、直接アクセスするのが非常に簡単/実用的であるため、そうであると思います。

val cache = 
 CacheBuilder.newBuilder().
  maximumSize(1000).
   build((key:String) => q(key)) 

たとえば、スコープ内に次の暗黙的な変換がある場合、これはうまく機能します。

implicit def functionToCacheLoader[F, T](f: F => T) = {
 new CacheLoader[F, T] {
  def load(key: F) = f(key)
 }
}

最後に、グアバキャッシュ自体に砂糖を追加することも非常に簡単です。

implicit def pimpCache[F, T](cache: Cache[F, T]) = {
 new PimpedCache(cache)
}

class PimpedCache[F, T](cache: Cache[F, T]) {
 def getOption(key: F) = {
  val value = cache.getIfPresent(key)
  if(value == null) None else Some(value)
 }    
}

これらは、私が使用するキャッシングの主な抽象化です。これは、必要なすべてのコードを含む要点へのリンクです。プレイ用のプラグインもあります!内部でグアバを使用するキャッシュの抽象化は、使用する必要がある場合に共有できます。

于 2012-09-08T14:47:01.177 に答える