Guava本地缓存托底缓存以及异步更新缓存
1.简介
1.1 guava本地缓存是开发中比较常用的组件,一般使用 LoadingCache,将需要的值加载在内存中,如下所示
LoadingCache<String,T> cacheLoader= CacheBuilder .newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) .build(new CacheLoader<String, T>() { @Override public T load(String key) throws Exception { return method(key);//1.执行method,获取key对应的值 } });
使用的方法:
T value=cacheLoader.get(key);//获取key对应的值
2.托底缓存设置
- 如果mehod()执行出错的话,无法拿到新的缓存。有时候,我们希望如果method执行异常的时候,本地缓存依旧用过期的缓存,那么可以重写CacheLoader中的reload方法进行设置
public abstract class RefreshKeepCacheLoader<K, V> extends CacheLoader<K, V> {
public ListenableFuture<V> reload(K key, V oldValue) throws Exception {
Object newvalue = null;
try {
newvalue = this.load(key);
} catch (Exception e) {
}
if(newvalue == null) {
newvalue = oldValue;
}
return Futures.immediateFuture(newvalue);
}
}
那么此时我们的cacheLoader可以这么写:
LoadingCache<String,T> cacheLoader= CacheBuilder
.newBuilder()
.expireAfterWrite(5, TimeUnit.MINUTES)
.build(new RefreshKeepCacheLoader<String, T>() {
@Override