Guava是google下的一个java工具类的项目,官方网站:https://github.com/google/guava,其中集合工具,缓存工具和并发工具是比较常用的几个工具集。
使用方法是pom中引入对应的包
com.google.guava
guava
19.0
以下是常用的使用方法,我们需要把一个员工的工号(Interge.class)和他的用户信息(User.class)缓存起来
LoadingCache users = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(
new CacheLoader() {
public User load(Integer empId) throws Exception {
return getUserByEmpId(empId);
}
});
User user=users.get(TEST_EMPID);
其中load方法只有在缓存中没有对应的数据的时候被调用,其他的时候会从缓存中取到
其中load方法是会抛出Exception的,如果不抛出对应的Exception,则调用的时候也可以使用getUnchecked(K)
在调用的时候也可以使用getAll(Iterabale extends K>)的方式获取批量数据。
另外Guava的Cache也可以使用get(K,Callaleb)的方法,如果有缓存则返回,否则运算缓存再返回
Cache users= CacheBuilder.newBuilder()
.maximumSize(1000)
.build();
try {
cache.get(TEST_EMPID, new Callable() {
@Override
public User call() throws AnyException {
return getUserByEmpId(empId);
}
});
} catch (ExecutionException e) {
throw new OtherException(e.getCause());
}
Guava的缓存有3种,
1 基于容量回收,这个和设置的maximunSize有关
2 定时回收,这个和设置的expireAfterAccess,expiredAfterWrite有关
3 基于引用回收,这个和设置的weakKeys,weakValues和softValues有关。
CacheBuilder.weakKeys():使用弱引用存储键。当键没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式(==),使用弱引用键的缓存用==而不是equals比较键。
CacheBuilder.weakValues():使用弱引用存储值。当值没有其它(强或软)引用时,缓存项可以被垃圾回收。因为垃圾回收仅依赖恒等式(==),使用弱引用值的缓存用==而不是equals比较值。
CacheBuilder.softValues():使用软引用存储值。软引用只有在响应内存需要时,才按照全局最近最少使用的顺序回收。考虑到使用软引用的性能影响,我们通常建议使用更有性能预测性的缓存大小限定(见上文,基于容量回收)。使用软引用值的缓存同样用==而不是equals比较值。
Guava支持设置一个移除监听器,当你移除一个缓存项的时候做对应的操作
RemovalListener removalListener = new RemovalListener() {
public void onRemoval(RemovalNotification removal) {
DatabaseConnection conn = removal.getValue();
conn.close(); // tear down properly
}
};
参考文档: