适用于
你愿意消耗一些内存空间来提升速度。
你预料到某些键会被查询一次以上。
缓存中存放的数据总量不会超出内存容量。
cacheLoader方式
//这种方式的返回值不能为null,会报异常
//这种方式使用get方法来获取缓存的值
//使用put赋值缓存,put里面传入的是缓存的key和入参,value值是load方法返回值
public void testLoadingCache() throws Exception {
//标红的是入参和返回值
LoadingCache<String, String> cahceBuilder = CacheBuilder.newBuilder().build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
System.out.println("请求的key为" + key + "在缓存中不存在,通过load方法获取key."); String strProValue = "hello " + key + "!";
return strProValue;
}
});
System.out.println("a value:" + cahceBuilder.get("a"));
cahceBuilder.put("b", "bbbb");
}
callable callback方式
//这种方式更加的灵活。可以在要使用的时候直接get
//这种方式使用getIfPresent方法来获取缓存的值
public void testcallableCache() throws Exception {
Cache<String, String> cache = CacheBuilder.newBuilder().maximumSize(1000).build();
String resultVal = cache.get("a", new Callable<String>() {
public String call() {
String strProValue = "hello " + "a" + "!";
return strProValue;
}
});
System.out.println("a value : " + resultVal);
resultVal = cache.getIfPresent("b");
System.out.println("a value : " + resultVal);
}
回收的参数:
1. 大小的设置:CacheBuilder.maximumSize(long) CacheBuilder.weigher(Weigher) CacheBuilder.maxumumWeigher(long)
2. 时间:expireAfterAccess(long, TimeUnit) expireAfterWrite(long, TimeUnit)
3. 引用:CacheBuilder.weakKeys() CacheBuilder.weakValues() CacheBuilder.softValues()
4. 明确的删除:invalidate(key) invalidateAll(keys) invalidateAll()
5. 删除监听器:CacheBuilder.removalListener(RemovalListener)
refresh机制:
1. LoadingCache.refresh(K) 在生成新的value的时候,旧的value依然会被使用。
2. CacheLoader.reload(K, V) 生成新的value过程中允许使用旧的value
3. CacheBuilder.refreshAfterWrite(long, TimeUnit) 自动刷新cache