1、前言
Google Guava Cache是Google Guava库中的一个缓存框架,用于缓存计算结果、数据或资源,提高程序访问效率和响应速度。Guava Cache具有以下特点:
①可配置性:Guava Cache支持多种缓存参数的配置,例如缓存大小、过期时间、访问策略等,可以根据应用场景进行灵活配置。
②基于引用计数的回收策略:Guava Cache使用基于引用计数的回收策略,当缓存对象的引用计数为0时自动回收,避免了内存泄漏。
③多线程安全:Guava Cache是线程安全的,支持并发读写,保证多个线程能安全地访问和操作缓存数据。
④易于使用:Guava Cache提供简单易用的API,可以方便地进行缓存数据的读取、添加、删除和更新操作,降低了开发的难度和复杂度。
2、依赖引入
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.2-jre</version>
</dependency>
3、缓存
3.1 LoadingCache
import com.google.common.cache.*;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class LoadingCacheTest {
private static final RemovalListener<String,String> listener = notification -> System.err.println("remove key:" + notification.getKey());
private static LoadingCache<String, String> loadingCache = CacheBuilder
.newBuilder()
.maximumSize(2) // 缓存的个数
.removalListener(listener) // 移除缓存时的监听事件
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return key.toUpperCase(Locale.ROOT);
}
});
public static void main(String[] args) throws Exception {
System.out.println("a的缓存:" + loadingCache.get("a"));
System.out.println("b的缓存:" + loadingCache.get("b"));
loadingCache.put("c", "C");
System.out.println("c的缓存:" + loadingCache.get("c"));
}
}
运行结果:
这里设置的最大缓存个数是2,当缓存第三个的时候,就会出发移除缓存的监听事件,因此结果打印了remove key。
可以设置缓存过期时间expireAfterWrite:
import com.google.common.cache.*;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class LoadingCacheTest {
private static final RemovalListener<String,String> listener = notification -> System.err.println("remove key:" + notification.getKey());
private static LoadingCache<String, String> loadingCache = CacheBuilder
.newBuilder()
.maximumSize(5)
.removalListener(listener)
.expireAfterWrite(2,TimeUnit.SECONDS)
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return key.toUpperCase(Locale.ROOT);
}
});
public static void main(String[] args) throws Exception {
System.out.println("a的缓存:" + loadingCache.get("a"));
System.out.println("b的缓存:" + loadingCache.get("b"));
Thread.sleep(3000);
loadingCache.put("c", "C");
System.out.println("c的缓存:" + loadingCache.get("c"));
}
}
运行结果:
3.2 Cache
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.ExecutionException;
public class CacheTest {
private static Cache<String, String> cache = CacheBuilder.newBuilder().
maximumSize(10).build();
public static void main(String[] args) throws ExecutionException {
cache.put("a", "A");
System.out.println("cache key a value:" + cache.getIfPresent("a"));
// 删除值
cache.invalidate("a");
System.out.println("invalidate后cache.getIfPresent(a):" + cache.getIfPresent("a"));
// 添加值
cache.put("b", "B");
System.out.println("put后cache.getIfPresent(b):" + cache.getIfPresent("b"));
}
}
运行结果:
Cachey也可以设置监听、过期时间等:
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalListener;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class CacheTest {
private static final RemovalListener<String,String> listener = notification -> System.err.println("remove key:" + notification.getKey());
private static Cache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(10)
.expireAfterWrite(2, TimeUnit.SECONDS)
.removalListener(listener)
.build();
public static void main(String[] args) throws ExecutionException, InterruptedException {
cache.put("a", "A");
System.out.println("cache key a value:" + cache.getIfPresent("a"));
Thread.sleep(3000);
// 添加值
cache.put("b", "B");
System.out.println("put后cache.getIfPresent(b):" + cache.getIfPresent("b"));
}
}
运行结果:
相关文档:https://github.com/google/guava/wiki/CachesExplained