使用注释搜索scala缓存框架(spring + ehcache)

Nic*_*nin 1 spring caching scala ehcache guava

我现在正在使用spring AOP + Ehcache进行scala应用.我非常喜欢将它与注释一起使用的简单性,但不是使用像spring这样的大框架来执行缓存的部分.

你知道scala缓存解决方案而不必使用像spring这样的大框架吗?

没有弹簧的东西:

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

小智 6

我认为您必须区分缓存库和访问它的API.我见过的Scala环境中使用的缓存库与Java版本中使用的缓存库相同.对于(可能)分布式缓存,使用Ehcache或memcached之类的东西.对于本地缓存,通常使用番石榴库的缓存实用程序.

将包装器写入本机缓存API非常容易,以便使用更加scala惯用的方式来访问缓存.您在示例中使用它们的注释是在Java中访问库抽象的常用方法,但在Scala世界中并不常见.表演!例如,框架有一个缓存抽象,默认情况下绑定到Ehcache.它允许构造:

val user: User = Cache.getOrElseAs[User]("item.key") {
  User.findById(connectedUser)
} 
Run Code Online (Sandbox Code Playgroud)

Twitter在他们的scala utils中有一个guava缓存的包装器,但删除了它们.我认为情况就是这样,因为在目前的番石榴版本中,直接访问它是非常简单/实用的.

val cache = 
 CacheBuilder.newBuilder().
  maximumSize(1000).
   build((key:String) => q(key)) 
Run Code Online (Sandbox Code Playgroud)

例如,如果您在范围内进行以下隐式转换,则此工作正常:

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

最后,向番石榴缓存本身添加一些糖也很容易:

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)
 }    
}
Run Code Online (Sandbox Code Playgroud)

这些是我使用的缓存的主要抽象.这是一个带有我需要的所有代码的要点的链接.我也有一个插件用于播放!缓存抽象使用guava引擎盖,如果你需要使用它我可以分享.