google guava框架提供了内存缓存的功能,可以很方便的缓存对象,设置生命周期, 及缓存对象的弱引用 强应用 软引用等.
所在包:package com.google.common.cache;
//LoadingCache在缓存项不存在时可以自动加载缓存
private LoadingCache<Key,String> dictCache = CacheBuilder.newBuilder()
.maximumSize(200)//设置缓存最大容量为200,超过200之后就会按照LRU最近虽少使用算法来移除缓存项
.expireAfterWrite(30, TimeUnit.MINUTES)//设置写缓存后30分钟过期,过期后会触发removalListener
.concurrencyLevel(4)//并发级别为4,并发级别是指可以同时写缓存的线程数
.removalListener(new RemovalListener<Object, Object>() {//这段代码可以移除
@Override
public void onRemoval(RemovalNotification<Object, Object> notification) {
LOG.debug("");
}
})
//build方法中可以指定CacheLoader,在缓存不存在时通过CacheLoader的实现自动加载缓存
.build(
.build(new CacheLoader<Key,String>() {
@Override
public String load(Key key) throws Exception {
return loadFromDb(key);
}
});
guava缓存过期时间分为两种,一种是从写入时开始计时,一种是从最后访问时间开始计时,而且guava缓存的过期时间是设置到整个一组缓存上的;这和EHCache,redis,memcached等不同,这些缓存系统设置都将缓存时间设置到了单个缓存上。
guava缓存设计成了一组对象一个缓存实例,这样做的好处是一组对象设置一组缓存策略,你可以根据不同的业务来设置不同的缓存策略,包括弱引用,软引用,过期时间,最大项数等。另外一点好处是你可以根据不同的组来统计缓存的命中率,这样更有意义一些。
这样做也是有缺点的,缺点是首先是每个缓存组都需要声明不同的缓存实例,具体到业务程序中可能就是每个业务对象一个缓存了。这样就把不同的业务缓存分散到不同的业务系统中了,不太好管理。
参考文献:
使用google guava做内存缓存