2012-09-08 65 views
1

我現在在我們的scala應用程序中使用spring AOP + Ehcache。我非常喜歡將它與註釋一起使用的簡單性,但不是像S​​pring那樣使用大框架來執行緩存。用類似(spring + ehcache)的註解搜索一個scala緩存框架

您是否知道scala緩存解決方案,而不必使用像Spring這樣的大框架?

類似的東西無彈簧:

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

「Scala寫的」中的「Native Scala」?我的意思是,ehcache不*要求*春天。 –

+0

我向我的問題Dave添加了更多信息,謝謝! –

回答

6

我認爲你必須緩存庫,並訪問它的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與我需要的所有代碼。我也有一個插件的戲劇!高速緩存抽象,使用番石榴下我可以分享,如果你有需要使用它。