包源:Google
Guava 库中的缓存模块,支持自动加载、过期策略、容量限制等功能。
在某些固定值或变动不频繁的情况下,从数据库中提取数据并放入缓存:
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class CacheExample {
public static void main(String[] args) {
// 创建一个带有过期时间的缓存
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(100) // 最大缓存条目数
.expireAfterWrite(10, TimeUnit.MINUTES) // 设置过期时间
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return loadFromDatabase(key); // 模拟从数据库加载数据
}
});
try {
// 从缓存中获取值,如果不存在则调用 load 方法加载
String value = cache.get("key1");
System.out.println("Cached Value: " + value);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
private static String loadFromDatabase(String key) {
// 模拟数据库查询
return "ValueFor" + key;
}
}
其他设置功能:
设置缓存过期策略
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.expireAfterAccess(5, TimeUnit.MINUTES) // 在最后一次访问后的指定时间后过期
.expireAfterWrite(10, TimeUnit.MINUTES) // 在最后一次写入后的指定时间后过期
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return loadFromDatabase(key);
}
});
使用容量限制
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(1000) // 设置最大缓存条目数
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return loadFromDatabase(key);
}
});
基于引用的缓存
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.weakKeys() // 使用弱引用键
.softValues() // 使用软引用值
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return loadFromDatabase(key);
}
});
获取缓存统计信息
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.recordStats() // 启用统计信息
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return loadFromDatabase(key);
}
});
cache.get("key1");
System.out.println("Cache Hit Rate: " + cache.stats().hitRate());
添加移除监听器
import com.google.common.cache.RemovalListener;
import com.google.common.cache.RemovalNotification;
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.removalListener(new RemovalListener<String, String>() {
@Override
public void onRemoval(RemovalNotification<String, String> notification) {
System.out.println("Removed: " + notification.getKey() + " -> " + notification.getValue());
}
})
.build(new CacheLoader<String, String>() {
@Override
public String load(String key) {
return loadFromDatabase(key);
}
});