Guava 是 Google 提供的一个 Java 库,包含了许多有用的工具和数据结构。Guava 缓存(Cache)是 Guava 中的一个组件,用于在内存中高效地存储和检索数据。Guava 缓存支持多种缓存策略,如基于时间的过期、基于大小的淘汰等。
Guava 缓存主要分为两种类型:
Guava 缓存适用于以下场景:
以下是一个使用 Guava 缓存的简单示例:
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.TimeUnit;
public class GuavaCacheExample {
public static void main(String[] args) {
// 创建一个缓存,最多存储 100 个条目,每个条目在 10 分钟后过期
Cache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build();
// 向缓存中插入数据
cache.put("key1", "value1");
cache.put("key2", "value2");
// 从缓存中获取数据
String value1 = cache.getIfPresent("key1");
System.out.println("Value for key1: " + value1);
String value3 = cache.getIfPresent("key3");
System.out.println("Value for key3: " + value3);
}
}
原因:缓存数据和实际数据源数据不一致,可能是由于缓存未及时更新或数据源发生变化。
解决方法:
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.concurrent.TimeUnit;
public class GuavaCacheExample {
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) throws Exception {
// 从数据源加载数据
return loadDataFromSource(key);
}
});
// 从缓存中获取数据
String value1 = cache.get("key1");
System.out.println("Value for key1: " + value1);
}
private static String loadDataFromSource(String key) {
// 模拟从数据源加载数据
return "value_" + key;
}
}
原因:某个热点键在缓存中过期后,大量请求同时访问该键,导致缓存击穿。
解决方法:
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class GuavaCacheExample {
public static void main(String[] args) {
LoadingCache<String, String> cache = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(new CacheLoader<String, String>() {
private final Lock lock = new ReentrantLock();
@Override
public String load(String key) throws Exception {
lock.lock();
try {
// 检查缓存中是否已有数据
String value = cache.getIfPresent(key);
if (value != null) {
return value;
}
// 从数据源加载数据
String newValue = loadDataFromSource(key);
cache.put(key, newValue);
return newValue;
} finally {
lock.unlock();
}
}
});
// 从缓存中获取数据
String value1 = cache.get("key1");
System.out.println("Value for key1: " + value1);
}
private static String loadDataFromSource(String key) {
// 模拟从数据源加载数据
return "value_" + key;
}
}
领取专属 10元无门槛券
手把手带您无忧上云