Guava Cache有一些优点如下 :
1. 线程安全的缓存, 与ConcurrentMap相似(前者更"好"), 在高并发情况下、能够正常缓存更新以及返回.
2. 提供了三种基本的缓存回收方式 : 基于容量回收
、定时回收
和基于引用回收
(本文没有提及引用回收).
3. 提供了两种定时回收:按照写入时间, 最早写入的最先回收;按照访问时间,最早访问的最早回收.
4. 可以监控缓存加载/命中情况.
5. 使用方便、简单.
1. 最基础的例子[CacheBuilder]
Cache<Integer, String> cache = CacheBuilder.newBuilder().build();
cache.put(1, "a");
cache.put(2, "b");
System.out.println(cache.getIfPresent(1));
System.out.println(cache.getIfPresent(3));
System.out.println(cache.getAllPresent(new ArrayList<Integer>(){{
add(1);
add(2);
}}));
2. 若无缓存时,自定义缓存值[CacheLoader、get()]
LoadingCache<Integer, String> cache1 = CacheBuilder.newBuilder().build(
new CacheLoader<Integer, String>() {
@Override
public String load(Integer key) throws Exception {
return "hellokey" + key;
}
}
);
cache1.put(1, "a");
System.out.println(cache1.getIfPresent(1));
try {
System.out.println(cache1.getAll(new ArrayList<Integer>(){{
add(1);
add(2);
}}));
System.out.println(cache1.get(3));
} catch (ExecutionException e) {
e.printStackTrace();
}
Cache<Integer, String> cache2 = CacheBuilder.newBuilder().build();
cache2.put(1, "a");
System.out.println(cache2.getIfPresent(1));
try {
String value = cache2.get(2, () -> "hellokey2");
System.out.println(value);
} catch (ExecutionException e) {
e.printStackTrace();
}
3. 控制缓存的大小/多少[.maximumSize()、.maximumWeight()]
Cache<Integer, String> cache1 = CacheBuilder.newBuilder()
.maximumSize(2L)
.build();
cache1.put(1, "a");
cache1.put(2, "b");
cache1.put(3, "c");
System.out.println(cache1.asMap());
System.out.println(cache1.getIfPresent(2));
cache1.put(4, "d");
System.out.println(cache1.asMap());
Cache<Integer, Integer> cache2 = CacheBuilder.newBuilder()
.maximumWeight(100L)
.weigher((Weigher<Integer, Integer>) (key, value) -> {
if (value % 2 == 0) {
return 20;
} else {
return 5;
}
})
.build();
for (int i = 0; i <= 20; i += 2) {
cache2.put(i, i);
}
System.out.println(cache2.asMap());
cache2.invalidateAll();
for (int i = 0; i <= 20; i += 1) {
cache2.put(i, i);
}
System.out.println(cache2.asMap());
4. 控制缓存回收的时间[.expireAfterWrite()、.expireAfterAccess()]
Cache<Integer, Integer> cache1 = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.SECONDS)
.build();
cache1.put(1,1);
System.out.println(cache1.asMap());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(cache1.asMap());
Cache<Integer, Integer> cache2 = CacheBuilder.newBuilder()
.expireAfterAccess(2, TimeUnit.SECONDS)
.build();
cache2.put(1,1);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cache2.getIfPresent(1);
System.out.println(cache2.asMap());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(cache2.asMap());
5. 缓存更新[.refreshAfterWrite()]
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.refreshAfterWrite(2, TimeUnit.SECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return UUID.randomUUID().toString();
}
});
cache.put("1", "1");
System.out.println(cache.getIfPresent("1"));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(cache.getIfPresent("1"));
cache.refresh("1");
System.out.println(cache.getIfPresent("1"));
6. 手动清除缓存[.invalidate()、.invalidateAll()]
Cache<Integer, String> cache = CacheBuilder.newBuilder().build();
cache.put(1, "a");
System.out.println(cache.asMap());
cache.invalidateAll();
System.out.println(cache.asMap());
cache.put(2, "b");
System.out.println(cache.asMap());
cache.invalidate(2);
System.out.println(cache.asMap());
cache.put(1, "a");
cache.put(2, "b");
cache.put(3, "c");
System.out.println(cache.asMap());
cache.invalidateAll(new ArrayList<Integer>() {{
add(1);
add(2);
}});
System.out.println(cache.asMap());
7. 设置监听器[.removalListener()]
LoadingCache<Integer, Integer> cache = CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.SECONDS)
.removalListener(notification -> System.out.println(
"remove key[" + notification.getKey()
+ "],value[" + notification.getValue()
+ "],remove reason[" + notification.getCause() + "]")
)
.build(
new CacheLoader<Integer, Integer>() {
@Override
public Integer load(Integer key) throws Exception {
return 2;
}
}
);
cache.put(1, 1);
cache.put(2, 2);
System.out.println(cache.asMap());
cache.invalidateAll();
System.out.println(cache.asMap());
cache.put(3, 3);
try {
System.out.println(cache.getUnchecked(3));
Thread.sleep(3000);
System.out.println(cache.getUnchecked(3));
} catch (InterruptedException e) {
e.printStackTrace();
}
8. 自带的统计功能[.recordStats()]
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.recordStats()
.refreshAfterWrite(2, TimeUnit.SECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) throws Exception {
return UUID.randomUUID().toString();
}
});
cache.put("1", "a");
System.out.println(cache.asMap());
System.out.println(cache.stats());
cache.getIfPresent("2");
System.out.println(cache.asMap());
System.out.println(cache.stats());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cache.getIfPresent("1");
System.out.println(cache.asMap());
System.out.println(cache.stats());
9. 显示缓存中的数据[.asMap()]
Cache<Integer, String> cache = CacheBuilder.newBuilder().build();
cache.put(1, "a");
cache.put(2, "b");
cache.put(3, "c");
cache.asMap();
System.out.println(cache.asMap().containsKey(1));
System.out.println(cache.asMap().containsValue("b"));
System.out.println(cache.asMap().get(1));
System.out.println(cache.asMap().put(5, "e"));
System.out.println(cache.asMap().entrySet());
System.out.println(cache.asMap());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具