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引擎盖,如果你需要使用它我可以分享.
归档时间: |
|
查看次数: |
1081 次 |
最近记录: |