我認爲你必須緩存庫,並訪問它的API來區分。我在Scala環境中使用的緩存庫與在Java環境中使用的緩存庫相同。對於(可能)分佈式緩存,使用Ehcache或memcached。對於本地緩存,通常使用番石榴庫的緩存實用程序。
向本地緩存API編寫包裝是非常容易的,以便有一種更通俗的方式來訪問緩存。在您的示例中使用它們的註釋是訪問Java中的圖書館抽象的常用方法,但它在Scala世界中並不常見。表演!框架,例如有一個緩存抽象,默認情況下,綁定到Ehcache。它允許構建like:
val user: User = Cache.getOrElseAs[User]("item.key") {
User.findById(connectedUser)
}
的Twitter曾經爲番石榴緩存的包裝在他們的斯卡拉utils的,但把他們趕走。我認爲是這樣,因爲在目前的番石榴版本中,直接訪問它非常簡單/實用。
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)
}
}
這些是我使用緩存的主要抽象。這裏是一個鏈接到gist與我需要的所有代碼。我也有一個插件的戲劇!高速緩存抽象,使用番石榴下我可以分享,如果你有需要使用它。
「Scala寫的」中的「Native Scala」?我的意思是,ehcache不*要求*春天。 –
我向我的問題Dave添加了更多信息,謝謝! –