Guava是谷歌的java类库,功能十分强大,下面是本地内存缓存工具类实例,在第一次通过调用get(key)时,会调用load去获取值,当再次调用时,我们发现就直接从缓存中调用了,根据maximumSize设置缓存大小,当大小超过限度的时候,会从缓存中移除最远的数据。实例如下。
Guava cahche实例,通过loadingCache
public class Main {
static Map<String, Integer> map = new HashMap<String, Integer>();
public static Integer getValueByKey(String key) {
System.out.println("通过key:" + key + "获取值");
return map.get(key);
}
@Test
public void loadingCache() throws ExecutionException {
map.put("key1", 1);
map.put("key2", 2);
map.put("key3", 3);
LoadingCache<String, Integer> cahceBuilder = CacheBuilder.newBuilder().maximumSize(2)
.build(new CacheLoader<String, Integer>() {
@Override
public Integer load(String key) throws Exception {
return getValueByKey(key);
}
});
System.out.println(cahceBuilder.get("key1"));
System.out.println(cahceBuilder.get("key2"));
System.out.println(cahceBuilder.get("key3"));
System.out.println(cahceBuilder.get("key1"));
System.out.println(cahceBuilder.get("key3"));
cahceBuilder.put("key1", 4);
System.out.println(cahceBuilder.get("key1"));
}
}
运行结果:

当然还有另外一种实现方式,使用callable
移除值可以使用下列方法。
cache.invalidate("key1");
cache.invalidateAll();
通过结果可以看出,当重复获得相同key的值时,不会再执行call(),而是从缓冲区读取。
cahceBuilder.refresh("key1");方法可以刷新该key值
CacheLoader.reload(K, V) 生成新的value
CacheBuilder.refreshAfterWrite(long, TimeUnit) 超时后自动刷新cache