Guava cache 本地缓存
程序员文章站
2022-06-19 11:32:51
...
项目开发中很多程序员喜欢用HashMap来构建本地缓存,存在并发、内存泄漏、刷新机制不健全(某些场景下我们希望定时删除或刷新缓存)、容量限制(当超过设置的最大缓存量时使用LRU算法淘汰最久未使用的缓存数据)等问题,推荐使用Google的Guava来构建本地缓存。
-
引包
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
-
构建缓存
//实例:双层LoadingCache,全局缓存map中嵌套某数据类型的缓存map
private final LoadingCache<String, LoadingCache<String,DataType>> cacheMap
= CacheBuilder.newBuilder()
.maximumSize(200) // 设置缓存的最大容量
.build(new CacheLoader<String, LoadingCache<String,DataType>>() {
@Override
public LoadingCache<String,DataType> load(String key) throws Exception {
return CacheBuilder.newBuilder()
.maximumSize(2000)
.expireAfterWrite(10, TimeUnit.MINUTES) //失效时间
.refreshAfterWrite(2, TimeUnit.MINUTES) //刷新时间
.build(new CacheLoader<String, DataType>() {
@Override
public DataType load(String key1) throws Exception {
return getDataType(key1);
}
});
}
});
使用CacheBuilder能构建出两种类型的cache:Cache与LoadingCache,上面的代码为LoadingCache。(使用Guava cache构建本地缓存)
Cache是通过CacheBuilder的build()方法构建,它是Gauva提供的最基本的缓存接口,并且它提供了一些常用的缓存api:
Cache<Object, Object> cache = CacheBuilder.newBuilder().build();
// 放入/覆盖一个缓存
cache.put("k1", "v1");
// 获取一个缓存,如果该缓存不存在则返回一个null值
Object value = cache.getIfPresent("k1");
// 获取缓存,当缓存不存在时,则通Callable进行加载并返回。该操作是原子
Object getValue = cache.get("k1", new Callable<Object>() {
@Override
public Object call() throws Exception {
return null;
}
});
LoadingCache继承自Cache,在构建LoadingCache时,需要通过CacheBuilder的build(CacheLoader<? super K1, V1> loader)方法构建
LoadingCache<Object, Object> loadingCache = CacheBuilder.newBuilder().build(new CacheLoader<Object, Object>() {
@Override
public Object load(Object key) throws Exception {
return null;
}
});
// 获取缓存,当缓存不存在时,会通过CacheLoader自动加载,该方法会抛出ExecutionException异常
loadingCache.get("k1");
// 以不安全的方式获取缓存,当缓存不存在时,会通过CacheLoader自动加载,该方法不会抛出异常
loadingCache.getUnchecked("k1");
上一篇: redis缓存预热、缓存雪崩、缓存击穿、缓存穿透、缓存降级、缓存更新
下一篇: PHP stat