本地缓存工具
我们经常使用ConcurrentHashMap缓存数据,如果数据key存在则直接返回,否则计算后保存再返回。guava提供了功能更强大的缓存工具。使用时不用自己put,get的时候会自动缓存起来,前提是你必须实现一个load数据的方法。
用CacheLoader构建:
@Test
public void testCacheWithLoader() throws ExecutionException {
LoadingCache<String, Integer> cache = CacheBuilder.newBuilder()
.maximumSize(1000) //最大缓存数据量
.expireAfterAccess(10, TimeUnit.MINUTES) //过期清除
.build(
new CacheLoader<String, Integer>() { //缓存规则
public Integer load(String key) {
return getObjectData(key);
}
});
String k1 = "aaa";
ConcurrentHashMap
System.out.println(k1 + " value is: " + cache.get(k1));
System.out.println(k1 + " value is: " + cache.get(k1));
Assert.assertEquals(cache.get(k1), cache.get(k1));
}
用Callable构建,允许你在get的时候做自定义处理。
@Test
public void testCacheWithCallable() {
//这里不需要构建CacheLoader
Cache<String, Integer> cache = CacheBuilder.newBuilder().initialCapacity(1000).build();
String key = "a";
final Integer value = 1;
try {
Integer expectValue = cache.get(key, new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return value;
}
});
assertEquals(expectValue, value);
} catch (ExecutionException e) {
e.printStackTrace();
}
}